Ignore:
Timestamp:
11/21/22 11:48:46 (17 months ago)
Author:
jderouillat
Message:

Update the memory log system to log virtual memory, resident memory and resident peak memory

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS3/trunk/src/mem_checker.cpp

    r2420 r2425  
    1919  bool CMemChecker::first_=true; 
    2020  double CMemChecker::vsize_init_=0; 
     21  double CMemChecker::rss_init_=0; 
     22  double CMemChecker::vmhwm_init_=0; 
    2123  double CMemChecker::time_init_=0; 
    2224  std::ofstream CMemChecker::fout_; 
     
    6466    return vsize ; 
    6567  } 
     68   
     69  // Return vector of memories amount : 
     70  //   - vector[0] : virtual memory (vsize) from /proc/self/stat 
     71  //   - vector[1] : resident set size (rss) from /proc/self/stat 
     72  //   - vector[2] : Peak resident set size (VmHWM) from /proc/self/status 
     73  std::vector<double> CMemChecker::getMemories(void) 
     74  { 
     75    std::vector<double> memories; 
     76 
     77    if (first_) check() ; 
     78    if (!enabled_) return memories; 
     79    std::ifstream statStream("/proc/self/stat",std::ios_base::in); 
     80    std::string dummy ; 
     81    for(int i=1;i<=22;i++) statStream>>dummy ; 
     82 
     83    // 1 - Virtual 
     84    double vsize;  
     85    statStream>>vsize ; 
     86    if (vsize_init_==0) { 
     87      vsize_init_ = vsize; 
     88      time_init_=MPI_Wtime(); 
     89    } 
     90    vsize -= vsize_init_; 
     91    memories.push_back(vsize); 
     92 
     93    // 2 - RSS 
     94    double rss; 
     95    statStream>>rss ; 
     96    if (rss_init_==0) { 
     97      rss_init_ = rss; 
     98    } 
     99    rss -= rss_init_; 
     100    rss *= 4096; //getconf("PAGE_SIZE");     
     101    memories.push_back(rss); 
     102 
     103    // 3 - Peak 
     104    char sbuf[1024]; 
     105    std::ifstream file( "/proc/self/status" ); 
     106    if( file.fail() ) { 
     107      return memories; 
     108    } 
     109    int fd = open( "/proc/self/status", O_RDONLY, 0 ); 
     110    int num_read=read( fd, sbuf, ( sizeof sbuf )-1 ); 
     111    close( fd ); 
     112    if( !num_read ) { 
     113      return memories;              
     114    } 
     115    // Peak resident set size 
     116    char *S=strstr( sbuf, "VmHWM:" )+6; 
     117    double vmhwm = ( int )atoi( S ); 
     118    if (vmhwm_init_==0) { 
     119      vmhwm_init_ = vmhwm; 
     120    } 
     121    vmhwm -= vmhwm_init_; 
     122    memories.push_back(vmhwm); 
     123     
     124    return memories; 
     125  } 
     126   
    66127  void CMemChecker::logMem( std::string id, bool finalizeLog ) 
    67128  { 
     
    71132    MPI_Comm_rank( MPI_COMM_WORLD, &rk ); 
    72133    std::string logName("xios_memory_"+std::to_string(rk)+".csv"); 
    73     double mem = getMemRSS(); 
    74     if (!mem) { 
     134    vector<double> mem = getMemories(); 
     135    if (!mem[0]) { 
    75136      fout_.open( logName ); 
    76       fout_ << "time,event,memory" << std::endl; 
     137      fout_ << "time,event,vsize,rss,VmHWM" << std::endl; 
    77138    } 
    78139 
    79140    fout_.precision(4); 
    80141    // Time format : YYYY-MM-DD HH:MM:SS.XXX -> seconds * 1000. 
    81     fout_ << (MPI_Wtime()-time_init_) << "," << id << "," << mem/1000000. << std::endl; 
     142    fout_ << (MPI_Wtime()-time_init_) << "," << id 
     143          << "," << mem[0]/1024./1024. 
     144          << "," << mem[1]/1024./1024. 
     145          << "," << mem[2]/1024. 
     146          << std::endl; 
    82147 
    83148    if ((MPI_Wtime()-time_init_)>flush_counter_*600.) 
Note: See TracChangeset for help on using the changeset viewer.