Skip to content

Commit e184b48

Browse files
committed
configuration of memory banks realtime display
1 parent 7523211 commit e184b48

4 files changed

Lines changed: 52 additions & 11 deletions

File tree

doc/releaseNotes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,3 +529,4 @@ This file describes the main feature changes for each readout.exe released versi
529529
- Updated configuration parameters:
530530
- added equipment-*.dropPagesWithError: if set, the pages with RDH errors are discarded (requires rdhCheckEnabled or rdhUseFirstInPage). This may be used if downstream software is not robust to RDH errors.
531531
- Disabled unused RDMA features (still available by switch in CMake)
532+
- Added feature for memory banks real time monitoring. Enabled by setting membanksMonitorRate in /etc/o2.d/readout-defaults.cfg. Output (high-rate text) can be seen locally in real time with `tail -f /tmp/readout-monitor-mempool-(id)`. The status of each page in the bank is displayed.

src/MemoryBankManager.cxx

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,10 @@
2222
#include "readoutInfoLogger.h"
2323

2424
MemoryBankManager::MemoryBankManager() {
25-
std::function<void(void)> f = std::bind(&MemoryBankManager::monitorThLoop, this);
26-
monitorThShutdown = 0;
27-
monitorTh=std::make_unique<std::thread>(f);
2825
}
2926

3027
MemoryBankManager::~MemoryBankManager() {
31-
if (monitorTh!=nullptr) {
32-
monitorThShutdown = 1;
33-
monitorTh->join();
34-
monitorTh = nullptr;
35-
}
28+
stopMonitoring();
3629
}
3730

3831
int MemoryBankManager::addBank(std::shared_ptr<MemoryBank> bankPtr, std::string name)
@@ -53,9 +46,12 @@ int MemoryBankManager::addBank(std::shared_ptr<MemoryBank> bankPtr, std::string
5346
return 0;
5447
}
5548

56-
std::string getMonitorFifoPath(int id) {
49+
std::string MemoryBankManager::getMonitorFifoPath(int id) {
50+
if (id < 0) {
51+
return monitorPath;
52+
}
5753
char fn[128];
58-
snprintf(fn,sizeof(fn),"/tmp/readout-monitor-pool-%d",id);
54+
snprintf(fn,sizeof(fn),"%s-%d", monitorPath.c_str(), id);
5955
return fn;
6056
}
6157

@@ -256,11 +252,12 @@ void MemoryBankManager::reset()
256252
}
257253
banks.clear();
258254
poolIndex = -1;
255+
stopMonitoring();
259256
}
260257

261258
void MemoryBankManager::monitorThLoop() {
262259
AliceO2::Common::Timer t;
263-
t.reset(200000);
260+
t.reset(1000000.0 / monitorUpdateRate);
264261
for(;!monitorThShutdown.load();) {
265262
if (t.isTimeout()) {
266263
std::unique_lock<std::mutex> lock(bankMutex);
@@ -280,3 +277,30 @@ void MemoryBankManager::monitorThLoop() {
280277
}
281278
}
282279
}
280+
281+
282+
void MemoryBankManager::startMonitoring(double v_updateRate, const char* v_monitorPath) {
283+
if (monitorTh != nullptr) {
284+
stopMonitoring();
285+
}
286+
if (v_updateRate <= 0) {
287+
return;
288+
}
289+
monitorUpdateRate = v_updateRate;
290+
if ((v_monitorPath != nullptr) && (strlen(v_monitorPath) != 0)) {
291+
monitorPath = v_monitorPath;
292+
} else {
293+
monitorPath = monitorPathDefault;
294+
}
295+
std::function<void(void)> f = std::bind(&MemoryBankManager::monitorThLoop, this);
296+
monitorThShutdown = 0;
297+
monitorTh=std::make_unique<std::thread>(f);
298+
}
299+
300+
void MemoryBankManager::stopMonitoring() {
301+
if (monitorTh != nullptr) {
302+
monitorThShutdown = 1;
303+
monitorTh->join();
304+
monitorTh = nullptr;
305+
}
306+
}

src/MemoryBankManager.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ class MemoryBankManager
6767
// reset bank manager in fresh state, in particular: clear all banks
6868
void reset();
6969

70+
void startMonitoring(double updateRate, const char* monitorPath = ""); // starts monitoring at given updateRate and output path
71+
void stopMonitoring(); // stop monitoring
72+
std::string getMonitorFifoPath(int id); // return full path to monitor pipe for given pool index
73+
7074
private:
7175
std::vector<bankDescriptor> banks; // list of registered memory banks
7276
std::mutex bankMutex; // instance mutex to handle concurrent access to public methods
@@ -76,6 +80,9 @@ class MemoryBankManager
7680
std::atomic<int> monitorThShutdown; // flag to terminate monitor thread
7781
void monitorThLoop(); // function launched in monitor thread
7882
std::vector<std::shared_ptr<MemoryPagesPool>> pools; // reference to existing page pools, for monitoring purpose
83+
double monitorUpdateRate = 0; // monitoring period, in Hz
84+
const char *monitorPathDefault = "/tmp/readout-monitor-mempool";
85+
std::string monitorPath = monitorPathDefault; // prefix path to output monitoring pipes. "-%d" (bank number) added to it and fifo created.
7986
};
8087

8188
// a global MemoryBankManager instance

src/mainReadout.cxx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,8 @@ int Readout::init(int argc, char* argv[])
346346
const std::string cfgDefaultsEntryPoint = "readout"; // entry point for default configuration variables (e.g. section named [readout])
347347
std::string cfgStatsPublishAddress; // address where to publish readout stats, eg "tcp://127.0.0.1:6008"
348348
double cfgStatsPublishInterval = 5.0; // interval for readout stats publish, in seconds
349+
std::string cfgMembanksMonitorPath = ""; // path to memory banks monitor output
350+
double cfgMembanksMonitorRate = 0.0; // rate of memory banks monitor updates
349351
try {
350352
cfgDefaults.load(cfgDefaultsPath.c_str());
351353
initLogs.push_back({LogInfoDevel, "Defaults loaded from " + cfgDefaultsPath});
@@ -357,6 +359,8 @@ int Readout::init(int argc, char* argv[])
357359
cfgDefaults.getOptionalValue<double>(cfgDefaultsEntryPoint + ".statsPublishInterval", cfgStatsPublishInterval, cfgStatsPublishInterval);
358360
cfgDefaults.getOptionalValue<std::string>(cfgDefaultsEntryPoint + ".db", cfgDatabaseCxParams);
359361
cfgDefaults.getOptionalValue<int>(cfgDefaultsEntryPoint + ".customCommandsEnabled", cfgCustomCommandsEnabled);
362+
cfgDefaults.getOptionalValue<std::string>(cfgDefaultsEntryPoint + ".membanksMonitorPath", cfgMembanksMonitorPath, cfgMembanksMonitorPath);
363+
cfgDefaults.getOptionalValue<double>(cfgDefaultsEntryPoint + ".membanksMonitorRate", cfgMembanksMonitorRate, cfgMembanksMonitorRate);
360364
}
361365
catch(...) {
362366
//initLogs.push_back({LogWarningSupport_(3100), std::string("Error loading defaults")});
@@ -412,6 +416,11 @@ int Readout::init(int argc, char* argv[])
412416
initLogs.push_back({LogWarningDevel_(3236), "Failed to start Stats publish"});
413417
} //otherwise: disabled
414418

419+
if (cfgMembanksMonitorRate > 0) {
420+
theMemoryBankManager.startMonitoring(cfgMembanksMonitorRate, cfgMembanksMonitorPath.c_str());
421+
initLogs.push_back({LogInfoDevel, "Started MemoryBanks monitor @ " + std::to_string(cfgMembanksMonitorRate) + " Hz : " + theMemoryBankManager.getMonitorFifoPath(-1) + "..."});
422+
}
423+
415424
// configure signal handlers for clean exit
416425
struct sigaction signalSettings;
417426
bzero(&signalSettings, sizeof(signalSettings));

0 commit comments

Comments
 (0)