Ignore:
Timestamp:
10/11/22 15:19:14 (21 months ago)
Author:
jderouillat
Message:

Integrates a system to log the memory consumption from XIOS init to XIOS finalize, and a HTML webpage to visualize it. The API to use it from models is available too.

File:
1 edited

Legend:

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

    r2235 r2418  
    77#include <fstream> 
    88 
     9#include <fcntl.h> 
     10#include <iomanip> 
     11#include <unistd.h> 
     12#include <cstring> 
     13 
    914namespace xios 
    1015{ 
     
    1318  bool CMemChecker::enabled_=true; 
    1419  bool CMemChecker::first_=true; 
     20  double CMemChecker::vsize_init_=0; 
     21  double CMemChecker::time_init_=0; 
    1522 
    1623  CMemChecker::CMemChecker(const std::string& name) : name_(name)  
     
    3744    return vsize ; 
    3845  } 
     46  double CMemChecker::getMemRSS(void) 
     47  { 
     48    //sleep( 1 ) ; 
     49    if (first_) check() ; 
     50    if (!enabled_) return 0; 
     51    std::ifstream statStream("/proc/self/stat",std::ios_base::in); 
     52    std::string dummy ; 
     53    for(int i=1;i<=23;i++) statStream>>dummy ; 
     54    double vsize;  
     55    statStream>>vsize ; 
     56    if (vsize_init_==0) { 
     57      vsize_init_ = vsize; 
     58      time_init_=MPI_Wtime(); 
     59    } 
     60    vsize -= vsize_init_; 
     61    vsize *= 4096; //getconf("PAGE_SIZE"); 
     62    return vsize ; 
     63  } 
     64  void CMemChecker::logMem( std::string id, bool finalizeLog ) 
     65  { 
     66    // function get_xios_mem_data() { 
     67    //   return [ 
     68    //        ... 
     69    //        [ "2000-01-01 01:00:10.XXX", "XIOS close context def", 1000], 
     70    //        [ "2000-01-01 01:00:11.XXX", "update timestep"       , 1000], 
     71    //        [ "2000-01-01 01:00:15.XXX", "send field"            , 2000], 
     72    //        ... 
     73    //   ]; 
     74    // } 
     75     
     76    std::ofstream fout; 
     77    int rk = 0; 
     78    MPI_Comm_rank( MPI_COMM_WORLD, &rk ); 
     79    std::string logName("mem_"+std::to_string(rk)+".js"); 
     80    double mem = getMemRSS(); 
     81    if (!mem) { 
     82      fout.open( logName ); 
     83      fout << "function get_xios_mem_data() {" << std::endl; 
     84      fout << "  return [" << std::endl; 
     85    } 
     86    else 
     87    { 
     88      fout.open( logName, std::ios_base::app ); 
     89    } 
     90 
     91    // Time format : YYYY-MM-DD HH:MM:SS.XXX -> seconds * 1000. 
     92    fout << "        [ " << (MPI_Wtime()-time_init_)*1000. << ", \"" << id << "\"," << mem/1000000. << "]," << std::endl; 
     93 
     94    if (finalizeLog) 
     95    { 
     96      fout << "  ];" << std::endl; 
     97      fout << "}" << std::endl; 
     98    } 
     99    fout.close(); 
     100  } 
     101 
    39102   
    40103  void CMemChecker::suspend(void) 
     
    53116    suspended_ = false; 
    54117  } 
     118 
     119  void CMemChecker::suspendRSS(void) 
     120  { 
     121    if (first_) check() ; 
     122    if (!enabled_) return ; 
     123    if (!suspended_) cumulatedMem_ += getMemRSS() - lastMem_; 
     124    suspended_ = true; 
     125  } 
    55126   
     127  void CMemChecker::resumeRSS(void) 
     128  { 
     129    if (first_) check() ; 
     130    if (!enabled_) return ; 
     131    if (suspended_) lastMem_ = getMemRSS(); 
     132    suspended_ = false; 
     133  } 
     134   
     135 
    56136  void CMemChecker::reset(void) 
    57137  { 
Note: See TracChangeset for help on using the changeset viewer.