Ignore:
Timestamp:
11/22/22 12:43:52 (19 months ago)
Author:
jderouillat
Message:

Backport the system to log the memory consumption (commit ID [2418-2420,2425-2426])

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS3/branches/xios-3.0-beta/src/mem_checker.cpp

    r2235 r2427  
    11#include "mem_checker.hpp" 
     2#include "cxios.hpp" 
    23#include "mpi.hpp" 
    34#include <string> 
     
    56#include <iostream> 
    67#include <sstream> 
    7 #include <fstream> 
     8 
     9#include <fcntl.h> 
     10#include <iomanip> 
     11#include <unistd.h> 
     12#include <cstring> 
    813 
    914namespace xios 
     
    1318  bool CMemChecker::enabled_=true; 
    1419  bool CMemChecker::first_=true; 
    15  
    16   CMemChecker::CMemChecker(const std::string& name) : name_(name)  
     20  double CMemChecker::vsize_init_=0; 
     21  double CMemChecker::rss_init_=0; 
     22  double CMemChecker::vmhwm_init_=0; 
     23  double CMemChecker::time_init_=0; 
     24  std::ofstream CMemChecker::fout_; 
     25  int CMemChecker::flush_counter_=1; 
     26   
     27  CMemChecker::CMemChecker(const std::string& name) : name_(name) 
    1728  {  
    1829    if (first_) check() ; 
     
    2637    first_=false ; 
    2738  } 
    28   double CMemChecker::getMem(void) 
    29   { 
    30     if (first_) check() ; 
    31     if (!enabled_) return 0; 
     39   
     40  // Return vector of memories amount : 
     41  //   - vector[0] : virtual memory (vsize) from /proc/self/stat 
     42  //   - vector[1] : resident set size (rss) from /proc/self/stat 
     43  std::vector<double> CMemChecker::getMem(void) 
     44  { 
     45    std::vector<double> memories(0); 
     46    memories.clear(); 
     47     
     48    if (first_) check() ; 
     49    if (!enabled_) return memories; 
    3250    std::ifstream statStream("/proc/self/stat",std::ios_base::in); 
    3351    std::string dummy ; 
     
    3553    unsigned long vsize;  
    3654    statStream>>vsize ; 
    37     return vsize ; 
    38   } 
     55    memories.push_back(vsize); 
     56    unsigned long rss; 
     57    statStream>>rss ; 
     58    memories.push_back(rss*4096); 
     59    return memories ; 
     60  } 
     61   
     62  // Return vector of memories amount, register values (see _init) as first call as reference : 
     63  //   - vector[0] : virtual memory (vsize) from /proc/self/stat 
     64  //   - vector[1] : resident set size (rss) from /proc/self/stat 
     65  //   - vector[2] : Peak resident set size (VmHWM) from /proc/self/status 
     66  std::vector<double> CMemChecker::getMemories(void) 
     67  { 
     68    std::vector<double> memories; 
     69 
     70    if (first_) check() ; 
     71    if (!enabled_) return memories; 
     72    std::ifstream statStream("/proc/self/stat",std::ios_base::in); 
     73    std::string dummy ; 
     74    for(int i=1;i<=22;i++) statStream>>dummy ; 
     75 
     76    // 1 - Virtual 
     77    unsigned long vsize;  
     78    statStream>>vsize ; 
     79    if (vsize_init_==0) { 
     80      vsize_init_ = vsize; 
     81      time_init_=MPI_Wtime(); 
     82    } 
     83    vsize -= vsize_init_; 
     84    memories.push_back(vsize); 
     85 
     86    // 2 - RSS 
     87    unsigned long rss; 
     88    statStream>>rss ; 
     89    if (rss_init_==0) { 
     90      rss_init_ = rss; 
     91    } 
     92    rss -= rss_init_; 
     93    rss *= 4096; //getconf("PAGE_SIZE");     
     94    memories.push_back(rss); 
     95 
     96    // 3 - Peak 
     97    char sbuf[1024]; 
     98    std::ifstream file( "/proc/self/status" ); 
     99    if( file.fail() ) { 
     100      return memories; 
     101    } 
     102    int fd = open( "/proc/self/status", O_RDONLY, 0 ); 
     103    int num_read=read( fd, sbuf, ( sizeof sbuf )-1 ); 
     104    close( fd ); 
     105    if( !num_read ) { 
     106      return memories;              
     107    } 
     108    // Peak resident set size 
     109    char *S=strstr( sbuf, "VmHWM:" )+6; 
     110    double vmhwm = ( int )atoi( S ); 
     111    if (vmhwm_init_==0) { 
     112      vmhwm_init_ = vmhwm; 
     113    } 
     114    vmhwm -= vmhwm_init_; 
     115    memories.push_back(vmhwm); 
     116     
     117    return memories; 
     118  } 
     119   
     120  void CMemChecker::logMem( std::string id, bool finalizeLog ) 
     121  { 
     122    if ( !CXios::logMemory ) return ; 
     123 
     124    int rk = 0; 
     125    MPI_Comm_rank( MPI_COMM_WORLD, &rk ); 
     126    std::string logName("xios_memory_"+std::to_string(rk)+".csv"); 
     127    vector<double> mem = getMemories(); 
     128    if (!mem[0]) { 
     129      fout_.open( logName ); 
     130      fout_ << "time,event,vsize,rss,VmHWM" << std::endl; 
     131    } 
     132 
     133    fout_.precision(4); 
     134    // Time format : YYYY-MM-DD HH:MM:SS.XXX -> seconds * 1000. 
     135    fout_ << (MPI_Wtime()-time_init_) << "," << id 
     136          << "," << mem[0]/1024./1024. 
     137          << "," << mem[1]/1024./1024. 
     138          << "," << mem[2]/1024. 
     139          << std::endl; 
     140 
     141    if ((MPI_Wtime()-time_init_)>flush_counter_*600.) 
     142    { 
     143      fout_.flush(); 
     144      flush_counter_++; 
     145    } 
     146     
     147    if (finalizeLog) 
     148    { 
     149      fout_.close(); 
     150    } 
     151  } 
     152 
    39153   
    40154  void CMemChecker::suspend(void) 
     
    42156    if (first_) check() ; 
    43157    if (!enabled_) return ; 
    44     if (!suspended_) cumulatedMem_ += getMem() - lastMem_; 
     158    if (!suspended_) 
     159    { 
     160      vector<double> mem = getMem(); 
     161      cumulatedMem_.resize( mem.size() ); 
     162      for (int i=0;i<mem.size() ; i++) 
     163      { 
     164        cumulatedMem_[i] += mem[i] - lastMem_[i]; 
     165      } 
     166    } 
    45167    suspended_ = true; 
    46168  } 
     
    50172    if (first_) check() ; 
    51173    if (!enabled_) return ; 
    52     if (suspended_) lastMem_ = getMem(); 
     174    if (suspended_) 
     175    { 
     176      vector<double> mem = getMem(); 
     177      lastMem_.resize( mem.size() ); 
     178      for (int i=0;i<mem.size() ; i++) 
     179      { 
     180        lastMem_[i] = mem[i]; 
     181      } 
     182    } 
    53183    suspended_ = false; 
    54184  } 
    55    
     185 
    56186  void CMemChecker::reset(void) 
    57187  { 
    58188    if (first_) check() ; 
    59189    if (!enabled_) return ; 
    60     cumulatedMem_ = 0.; 
     190    cumulatedMem_.clear(); 
    61191    suspended_ = true; 
    62192  } 
    63193   
    64   double CMemChecker::getCumulatedMem(void) 
    65   { 
    66     if (first_) check() ; 
    67     if (!enabled_) return 0; 
     194  std::vector<double> CMemChecker::getCumulatedMem(void) 
     195  { 
     196    std::vector<double> memories; 
     197    memories.clear(); 
     198    if (first_) check() ; 
     199    if (!enabled_) return memories; 
    68200    return cumulatedMem_; 
    69201  } 
     
    93225    for(std::map<std::string,CMemChecker>::iterator it=allMemChecker_.begin();it!=allMemChecker_.end();++it) 
    94226    {   
    95       strOut<<"MemChecker : "<<it->first<<"    -->   consumed memory : " ; 
    96       double mem=it->second.getCumulatedMem() ; 
    97       if (mem>=Tb) strOut<< mem / Tb<<" Tb"<<std::endl ; 
    98       else if (mem>=Gb) strOut<< mem / Gb<<" Gb"<<std::endl ; 
    99       else if (mem>=Mb) strOut<< mem / Mb<<" Mb"<<std::endl ; 
    100       else if (mem>=Kb) strOut<< mem / Kb<<" Kb"<<std::endl ; 
    101       else strOut<< mem <<" bytes"<<std::endl ; 
     227      vector<double> mem=it->second.getCumulatedMem() ; 
     228      if (mem.size()>0) 
     229      { 
     230        strOut<<"MemChecker : "<<it->first<<"    -->   consumed memory : " ;       
     231        if ((fabs(mem[0])>=Tb)||(fabs(mem[1])>=Tb)) strOut<< mem[0] / Tb<<" Tb - "<<mem[1] / Tb<<" Tb"<<std::endl ; 
     232        else if ((fabs(mem[0])>=Gb)||(fabs(mem[1])>=Gb)) strOut<< mem[0] / Gb<<" Gb - "<<mem[1] / Gb<<" Gb"<<std::endl ; 
     233        else if ((fabs(mem[0])>=Mb)||(fabs(mem[1])>=Mb)) strOut<< mem[0] / Mb<<" Mb - "<<mem[1] / Mb<<" Mb"<<std::endl ; 
     234        else if ((fabs(mem[0])>=Kb)||(fabs(mem[1])>=Kb)) strOut<< mem[0] / Kb<<" Kb - "<<mem[1] / Kb<<" Kb"<<std::endl ; 
     235        else strOut<< mem[0] <<" bytes - "<<mem[1] <<" bytes"<<std::endl ; 
     236      } 
    102237    } 
    103238    return strOut.str() ; 
Note: See TracChangeset for help on using the changeset viewer.