# This file starts a full-node (i.e. both CPUs) production server with full CHORD parameters.
# Files are written through local SSD cache to a real NFS server (/mnt/cs00/data).
#
# To start server on cf05:
# pirate_frb run_server configs/frb_server/cf05_production.yml
#
# To send data from cf00 to cf05:
# pirate_frb run_server -s configs/frb_server/cf05_production.yml
######################################## General config ########################################
# Under the hood, the frb search may consist of multiple servers (class FrbServer in the code).
# Each server processes a disjoint set of beams, and receives data from a disjoint set of TCP
# connections. In a multi-CPU machine, each server "lives" on a specific CPU. The mapping between
# servers in the config file, and physical CPUs, is determined by 'server_cpus'. (A many-to-one
# mapping is allowed, i.e. multiple servers per CPU.)
num_servers: 2
server_cpus: [ 0, 1 ] # length num_servers
# Memory is fully allocated and zeroed before the server starts (with scattered
# small exceptions where we do call malloc()).
memory_per_server: '256 GB'
use_hugepages: true
# The time "chunk" size sets cadence throughout the FRB search, and the number
# of time samples per output file. Must be a multiple of 256.
time_samples_per_chunk: 1024
######################################## Network config ########################################
# 'data_ip_addrs' is a list (length num_servers). Each entry is either an 'ip_addr:tcp_port'
# string, or a list of such strings. The latter case arises if a server receives data from
# multiple IP addresses. We expect this to happen in full CHORD. (Under the hood, each IP
# address corresponds to one 'class Receiver', and an FrbServer can have multiple Receivers.)
data_ip_addrs:
- [ '10.0.0.2:5000', '10.0.1.2:5000' ]
- [ '10.0.2.2:5000', '10.0.3.2:5000' ]
# 'rpc_ip_addrs' is a list of 'ip_addr:tcp_port' strings. Currently, RPC threads are
# not pinned to a specific CPU. This is fine for now, since all RPCs are "lightweight".
# We may revisit in the future, when we define "heavyweight" RPCs for e.g. injections.
# See discussion in include/pirate/FrbServer.hpp.
rpc_ip_addrs:
- '10.222.3.5:6000'
- '10.222.3.5:6001'
##################################### File-writing config ######################################
# 'ssd_dirs' and 'ssd_devices' are lists of length num_servers.
# If an ssd_dir isn't backed by the corresponding ssd_device, then an exception is thrown.
# (This is intended to catch misconfiguration where an SSD is not mounted.)
#
# Note: on the chord frb nodes, /dev/nvme1n1 is on CPU0, and /dev/nvme0n1 is on CPU1.
ssd_dirs: [ '/scratch2', '/scratch' ]
ssd_devices: [ '/dev/nvme1n1p1', '/dev/nvme0n1p2' ]
ssd_threads_per_server: 4
# Currently, all servers write to the same nfs_dir (i.e. 'nfs_dir' is a string,
# not a list of strings). The 'nfs_dir' member supports string interpolations
# {user} and {date}. The nfs_dir will be created if it doesn't already exist.
nfs_dir: '/mnt/cs00/data/{user}/{date}'
nfs_threads_per_server: 2
################################### "Fake X-engine" config #####################################
#
# This optional section is only needed if you want to send "fake X-engine" data
# (pirate_frb run_server -s).
# Note: The X-engine determines the beam configuration, and the FRB server
# receives it dynamically at runtime.
beams_per_server: 60
base_beam_id: [ 100, 200 ] # length num_servers
# In the real system, each X-engine "half-node" (i.e. numa domain) opens a separate
# TCP connection (128 TCP connections in full CHORD).
#
# The "fake X-engine" uses many TCP connections in order to mimic this behavior, but
# they all originate from the same physical node. (Detail: if the server has multiple
# data_ip_addrs, then the TCP connections are assigned round-robin.)
tcp_connections_per_server: 128
# Frequency channels. The observed frequency band is divided into "zones".
# Within each zone, all frequency channels have the same width, but the
# channel width may differ between zones.
# zone_nfreq: number of frequency channels in each zone.
# zone_freq_edges: frequency band edges in MHz.
# For example:
# zone_nfreq: [N] zone_freq_edges: [400,800] one zone, channel width (400/N) MHz
# zone_nfreq: [2*N,N] zone_freq_edges: [400,600,800] width (100/N), (200/N) MHz in lower/upper band
#
# In this config, we have:
# Total frequency channels: 28160
# Channel widths (MHz): [ 0.00610352, 0.012207, 0.0244141, 0.0976562, 0.195312 ]
zone_nfreq: [8192, 8192, 6144, 2048, 3584]
zone_freq_edges: [300, 350, 450, 600, 800, 1500]