cf05_production.ymlΒΆ

# 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]