34#include <boost/filesystem.hpp>
42 procinfo_m = {{
"VmPeak:", VirtualMemory::VMPEAK}, {
"VmSize:", VirtualMemory::VMSIZE},
43 {
"VmHWM:", VirtualMemory::VMHWM}, {
"VmRSS:", VirtualMemory::VMRSS},
44 {
"VmStk:", VirtualMemory::VMSTK}, {
"VmData:", VirtualMemory::VMDATA},
45 {
"VmExe:", VirtualMemory::VMEXE}, {
"VmLck:", VirtualMemory::VMLCK},
46 {
"VmPin:", VirtualMemory::VMPIN}, {
"VmLib:", VirtualMemory::VMLIB},
47 {
"VmPTE:", VirtualMemory::VMPTE}, {
"VmPMD:", VirtualMemory::VMPMD},
48 {
"VmSwap:", VirtualMemory::VMSWAP}};
65 "VmPeak-Min",
"double",
unit_m[VirtualMemory::VMPEAK],
"Minimum peak virtual memory size");
68 "VmPeak-Max",
"double",
unit_m[VirtualMemory::VMPEAK],
"Maximum peak virtual memory size");
71 "VmPeak-Avg",
"double",
unit_m[VirtualMemory::VMPEAK],
"Average peak virtual memory size");
75 "VmSize-Min",
"double",
unit_m[VirtualMemory::VMSIZE],
"Minimum virtual memory size");
78 "VmSize-Max",
"double",
unit_m[VirtualMemory::VMSIZE],
"Maximum virtual memory size");
81 "VmSize-Avg",
"double",
unit_m[VirtualMemory::VMSIZE],
"Average virtual memory size");
85 "VmHWM-Min",
"double",
unit_m[VirtualMemory::VMHWM],
"Minimum peak resident set size");
88 "VmHWM-Max",
"double",
unit_m[VirtualMemory::VMHWM],
"Maximum peak resident set size");
91 "VmHWM-Avg",
"double",
unit_m[VirtualMemory::VMHWM],
"Average peak resident set size");
95 "VmRSS-Min",
"double",
unit_m[VirtualMemory::VMRSS],
"Minimum resident set size");
98 "VmRSS-Max",
"double",
unit_m[VirtualMemory::VMRSS],
"Maximum resident set size");
101 "VmRSS-Avg",
"double",
unit_m[VirtualMemory::VMRSS],
"Average resident set size");
110 if (
mode_m == std::ios::app)
115 std::string dateStr(simtimer.
date());
116 std::string timeStr(simtimer.
time());
118 std::stringstream ss;
131 static pid_t pid = getpid();
132 std::string fname =
"/proc/" + std::to_string(pid) +
"/status";
134 if (!boost::filesystem::exists(fname)) {
135 throw OpalException(
"MemoryProfiler::update()",
"File '" + fname +
"' doesn't exist.");
138 std::ifstream ifs(fname.c_str());
140 if (!ifs.is_open()) {
141 throw OpalException(
"MemoryProfiler::update()",
"Failed to open '" + fname +
"'.");
145 while (ifs >> token) {
159 for (
unsigned int i = 0; i <
vmem_m.size(); ++i) {
160 vmMin[i] = vmMax[i] = vmAvg[i] =
vmem_m[i];
166 reduce(
vmem_m.data(), vmAvg.data(),
vmem_m.size(), std::plus<double>());
168 double inodes = 1.0 / double(
ippl::Comm->size());
169 for (
auto& vm : vmAvg) {
175 reduce(
vmem_m.data(), vmMin.data(),
vmem_m.size(), std::less<double>());
176 reduce(
vmem_m.data(), vmMax.data(),
vmem_m.size(), std::greater<double>());
186 this->
compute(vmMin, vmMax, vmAvg);
192 double pathLength = beam->
get_sPos();
std::unique_ptr< mpi::Communicator > Comm
std::string getInputFn()
get opals input filename
static OpalData * getInstance()
void compute(vm_t &vmMin, vm_t &vmMax, vm_t &vmAvg)
std::vector< long double > vm_t
MemoryProfiler(const std::string &fname, bool restart)
std::map< std::string, int > procinfo_m
void write(const PartBunch_t *beam) override
void addColumn(const std::string &name, const std::string &type, const std::string &unit, const std::string &desc, std::ios_base::fmtflags flags=std::ios_base::scientific, unsigned short precision=15)
void addColumnValue(const std::string &name, const T &val)
std::string toString(const T &val)
void addDefaultParameters()
void addDescription(const std::string &text, const std::string &content)
void writeHeader()
Write SDDS header.
std::ios_base::openmode mode_m
First write to the statistics output file.
void addInfo(const std::string &mode, const size_t &no_row_counts)
The base class for all OPAL exceptions.
std::string date() const
Return date.
std::string time() const
Return time.