mirror of
https://github.com/paulscherrerinstitute/sf_daq_buffer.git
synced 2026-10-25 15:21:28 +01:00
Update main README with up to date information
This commit is contained in:
1 parent
b55fb89ae5
commit
bb681800a2
3 files changed
+92
-108
No files matched your search
@@ -7,6 +7,97 @@ Overview of current architecture and component interaction.
|
||||
Documentation of individual components:
|
||||
|
||||
- [sf-buffer](sf-buffer) (Receive UDP and write buffer files)
|
||||
- [sf-stream](sf-stream) (Live streaming of detector data)
|
||||
- [sf-writer](sf-writer) (Read from buffer and write H5)
|
||||
- [sf-utils](sf-utils) (Small utilities for debugging and testing)
|
||||
|
||||
## Terminology
|
||||
|
||||
In order to unify the way we write code and talk about concept the following
|
||||
terminology definitions should be followed:
|
||||
|
||||
- frame (data from a single module)
|
||||
- image (assembled frames)
|
||||
- start_pulse_id and stop_pulse_id (not end_pulse_id) is used to determine the
|
||||
inclusive range (both start and stop pulse_id are included) of pulses.
|
||||
- pulse_id_step (how many pulses to skip between each image).
|
||||
- GPFS buffer (on GPFS detector buffering mechanism based on binary files)
|
||||
- detector_folder (root folder of the buffer for a specific detector on disk)
|
||||
- module_folder (folder of one module inside the detector_folder)
|
||||
- data_folder (folder where we group more buffer files based on pulse_id range)
|
||||
- data_file (the files where the actual data is stored, inside data_folder)
|
||||
|
||||
## Design goals
|
||||
|
||||
- Simplest thing that works.
|
||||
- Save time and iterate more quickly.
|
||||
- Less moving parts, less problems.
|
||||
- Start optimizing only when things break.
|
||||
- Many optimization possibilities, but not for now.
|
||||
- Makes possible to test technologies faster.
|
||||
- Small debuggable and profileable processes.
|
||||
- Needs to be able to run on your local machine in a debugger.
|
||||
- Asses code performance without guessing.
|
||||
- As little dependency between processes as possible.
|
||||
- Run only the process you want to test.
|
||||
- Write unit tests.
|
||||
|
||||
## Build
|
||||
|
||||
To compile this repo you will need to install the following packages on RH7:
|
||||
- devtoolset-9
|
||||
- cmake3
|
||||
- zeromq-devel
|
||||
- hdf5-devel
|
||||
|
||||
```bash
|
||||
yum install devtoolset-9
|
||||
yum install cmake3
|
||||
yum install zeromq-devel
|
||||
yum install hdf5-devel
|
||||
```
|
||||
|
||||
Step by step procedure to build the repo:
|
||||
|
||||
```bash
|
||||
scl enable devtoolset-9 bash
|
||||
git clone https://github.com/paulscherrerinstitute/sf_daq_buffer.git
|
||||
cd sf_daq_buffer
|
||||
mkdir build
|
||||
cd build/
|
||||
cmake3 ..
|
||||
make
|
||||
```
|
||||
|
||||
It is recommended to create symbolic links to the executables you will be using
|
||||
inside your PATH.
|
||||
|
||||
Example:
|
||||
```bash
|
||||
ln -s "$(pwd)""/""sf_buffer" /usr/bin/sf_buffer
|
||||
ln -s "$(pwd)""/""sf_stream" /usr/bin/sf_stream
|
||||
ln -s "$(pwd)""/""sf_writer" /usr/bin/sf_writer
|
||||
```
|
||||
|
||||
### Warnings
|
||||
|
||||
#### Zeromq
|
||||
|
||||
Zeromq version 4.1.4 (default on RH7) has a LINGER bug. Sometimes, the last
|
||||
message is not sent (the connection gets dropped before the message is in the buffer).
|
||||
Since we use PUSH/PULL only in sf-stream at the moment, this is not critical anymore.
|
||||
But in the future we might use the PUSH/PULL mechanism, so updating to the latest
|
||||
version of ZMQ should help us prevent future bug hunting sessions.
|
||||
|
||||
Please install a later version:
|
||||
```bash
|
||||
cd /etc/yum.repos.d/
|
||||
wget https://download.opensuse.org/repositories/network:messaging:zeromq:release-stable/RHEL_7/network:messaging:zeromq:release-stable.repo
|
||||
yum remove zeromq
|
||||
yum remove openpgm
|
||||
yum install libsodium-devel
|
||||
yum install zeromq-devel
|
||||
```
|
||||
|
||||
## Useful links
|
||||
|
||||
@@ -77,110 +168,3 @@ https://community.mellanox.com/s/article/raw-ethernet-programming--basic-introdu
|
||||
- Performance Tuning for Mellanox Adapters
|
||||
https://community.mellanox.com/s/article/performance-tuning-for-mellanox-adapters
|
||||
- UEFI Workload-based Performance and TuningGuide for HPE ProLiant Gen10 https://support.hpe.com/hpesc/public/docDisplay?docId=a00016408en_us
|
||||
|
||||
## Build
|
||||
|
||||
To compile this repo you will need to install the following packages on RH7:
|
||||
- devtoolset-9
|
||||
- cmake3
|
||||
- zeromq-devel
|
||||
- hdf5-devel
|
||||
|
||||
```bash
|
||||
yum install devtoolset-9
|
||||
yum install cmake3
|
||||
yum install zeromq-devel
|
||||
yum install hdf5-devel
|
||||
```
|
||||
|
||||
Step by step procedure to build the repo:
|
||||
|
||||
```bash
|
||||
scl enable devtoolset-9 bash
|
||||
git clone https://github.com/paulscherrerinstitute/sf_daq_buffer.git
|
||||
cd sf_daq_buffer
|
||||
mkdir build
|
||||
cd build/
|
||||
cmake3 ..
|
||||
make
|
||||
```
|
||||
|
||||
It is recommended to create symbolic links to the executables you will be using
|
||||
inside your PATH.
|
||||
|
||||
Example:
|
||||
```bash
|
||||
ln -s "$(pwd)""/""sf_buffer" /usr/bin/sf_buffer
|
||||
ln -s "$(pwd)""/""sf_stream" /usr/bin/sf_stream
|
||||
ln -s "$(pwd)""/""sf_writer" /usr/bin/sf_writer
|
||||
```
|
||||
|
||||
### Warnings
|
||||
|
||||
#### Zeromq
|
||||
|
||||
Zeromq version 4.1.4 (default on RH7) has a LINGER bug. Sometimes, the last
|
||||
message is not sent (the connection gets dropped before the message is in the buffer).
|
||||
Since we use PUSH/PULL to modulate the sf_replay speed, this is a key functionality we are using.
|
||||
|
||||
Please install a later version:
|
||||
```bash
|
||||
cd /etc/yum.repos.d/
|
||||
wget https://download.opensuse.org/repositories/network:messaging:zeromq:release-stable/RHEL_7/network:messaging:zeromq:release-stable.repo
|
||||
yum remove zeromq
|
||||
yum remove openpgm
|
||||
yum install libsodium-devel
|
||||
yum install zeromq-devel
|
||||
```
|
||||
|
||||
## Terminology
|
||||
|
||||
In order to unify the way we write code and talk about concept the following
|
||||
terminology definitions should be followed:
|
||||
|
||||
- frame (data from a single module)
|
||||
- image (data of the assembled image)
|
||||
- start_pulse_id and stop_pulse_id (not end_pulse_id) is used to determine the
|
||||
inclusive range (both start and stop pulse_id are included) of pulses.
|
||||
- pulse_id_step (how many pulses to skip between images).
|
||||
- detector_folder (root folder of the buffer for a specific detector on disk)
|
||||
- module_name (name of one module inside the detector_folder)
|
||||
- data_folder (folder where we group more buffer files based on pulse_id range)
|
||||
|
||||
## Data request ranges
|
||||
|
||||
Data request ranges are composed of:
|
||||
|
||||
- start_pulse_id (first pulse_id to be included in the file)
|
||||
- stop_pulse_id (last pulse_id to be included in the file)
|
||||
- pulse_id_step (how many pulses to skip between images.)
|
||||
|
||||
pulse_id_step can be used to write data at different frequencies:
|
||||
|
||||
- pulse_id_step == 1 (100Hz, write very pulse_id)
|
||||
- pulse_id_step == 2 (50hz, write every second pulse)
|
||||
- pulse_id_step == 10 (10Hz, write every 10th pulse)
|
||||
|
||||
The next pulse_id to be written is calculated internally as:
|
||||
|
||||
```c++
|
||||
auto next_pulse_id = currnet_pulse_id + pulse_id_step;
|
||||
```
|
||||
|
||||
The loop criteria for writing is:
|
||||
|
||||
```c++
|
||||
for (
|
||||
auto curr_pulse_id = start_pulse_id;
|
||||
curr_pulse_id <= stop_pulse_id;
|
||||
curr_pulse_id += pulse_id_step
|
||||
) {
|
||||
// Write curr_pulse_id to output file.
|
||||
}
|
||||
```
|
||||
|
||||
**Warning**
|
||||
|
||||
If your stop_pulse_id cannot be reached by adding step_pulse_id to
|
||||
start_pulse_id (start_pulse_id + (n * pulse_id_step) != stop_pulse_id for any n)
|
||||
it will not be included in the final file.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 150 KiB |
@@ -1 +1 @@
|
||||
<mxfile host="Electron" modified="2020-07-23T10:35:52.572Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.9.9 Chrome/80.0.3987.163 Electron/8.2.1 Safari/537.36" etag="gsGa6As5K3yZB7anSgQV" version="12.9.9" type="device" pages="6"><diagram name="overview" id="muXDs5UsbG9aPfefTxRP">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</diagram><diagram name="sf_buffer" id="McOcRQAG4h0-hEUw4Ais">7VxbV+o6EP41POLqveVRQNB9cONls9j64krbFKqlqW0ql19/kl6gl4BViqJul0vaSZom33yTzEyCDbEzW/R94E0vkQmdhsCZi4bYbQiC0BJ58Line truncated
|
||||
<mxfile host="Electron" modified="2020-07-23T11:13:06.126Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.9.9 Chrome/80.0.3987.163 Electron/8.2.1 Safari/537.36" etag="ZhQh4hxJy49bxhFi3KBG" version="12.9.9" type="device" pages="6"><diagram name="overview" id="muXDs5UsbG9aPfefTxRP">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</diagram><diagram name="sf_buffer" id="McOcRQAG4h0-hEUw4Ais">7VxbV+o6EP41POLqveVRQNB9cONls9j64krbFKqlqW0ql19/kl6gl4BViqJul0vaSZom33yTzEyCDbEzW/R94E0vkQmdhsCZi4bYbQiC0BJ58kEly1jCq0Iimfi2mcg2glt7BRMhl0hD24RBLEtEGCEH215eaCDXhQbOyYDvo3mQe4mFnPxbPTCBJcGtAZyydGybeJpIFY7bFJxDezJNXt1KC2YgrZwIgikw0TwjEs8aYsdHCMdXs0UHOhS9FJeLpvww/HU5aN47wt35cHDjzfVm3FjvLY+sh+BDF7+76em9Gli+a92u7vq/HvU/A+DjtOkX4IQJXslY8TIF0Eeha0LaCNcQ2/OpjeGtBwxaOiecILine truncated
|
||||
Reference in new issue
Block a user