Changeset 2418


Ignore:
Timestamp:
10/11/22 15:19:14 (19 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.

Location:
XIOS3/trunk
Files:
4 added
9 edited

Legend:

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

    r2407 r2418  
    1818#include "workflow_graph.hpp" 
    1919#include "release_static_allocation.hpp" 
     20#include "mem_checker.hpp" 
    2021 
    2122namespace xios 
     
    520521      report(0)<< " Memory report : increasing it by a factor will increase performance, depending of the volume of data wrote in file at each time step of the file"<<endl ; 
    521522      report(100)<<CTimer::getAllCumulatedTime()<<endl ; 
     523      report(100)<<CMemChecker::getAllCumulatedMem()<<endl ; 
    522524      CWorkflowGraph::drawWorkFlowGraph_client(); 
    523525 
  • XIOS3/trunk/src/cxios.cpp

    r2407 r2418  
    151151      CClient::openErrorStream(); 
    152152    } 
     153    CMemChecker::logMem("CXios::initClientSide"); 
    153154  } 
    154155  CATCH 
     
    156157  void CXios::clientFinalize(void) 
    157158  { 
     159     CMemChecker::logMem("CXios::clientFinalize", true); 
     160 
    158161     CClient::finalize() ; 
    159162           
     
    233236#endif 
    234237    CMemChecker::get("xios").suspend() ; 
    235     report(0)<<CMemChecker::getAllCumulatedMem() ; 
    236238    CServer::closeInfoStream(); 
    237239  } 
  • XIOS3/trunk/src/filter/model_to_client_source_filter.cpp

    r2143 r2418  
    55#include <limits>  
    66#include "workflow_graph.hpp" 
     7#include "mem_checker.hpp" 
    78 
    89namespace xios 
     
    3738    packet->data.resize(connector->getDstSize()) ; 
    3839    connector->transfer(data, packet->data, nanValue) ; 
     40 
     41    CMemChecker::logMem( "CModelToClientSourceFilter::streamData" ); 
    3942 
    4043    if (hasMissingValue_) 
  • XIOS3/trunk/src/filter/temporal_filter.cpp

    r2195 r2418  
    33#include "calendar_util.hpp" 
    44#include "workflow_graph.hpp" 
     5#include "mem_checker.hpp" 
    56 
    67namespace xios 
     
    117118          packet = data[0]; 
    118119 
     120        CMemChecker::logMem( "CTemporalFilter::apply" ); 
     121 
    119122        isFirstOperation = false; 
    120123        graphCycleCompleted = true; 
  • XIOS3/trunk/src/interface/fortran/ixios.F90

    r2338 r2418  
    3838                  ASSIGNMENT(=) 
    3939USE itimer, ONLY : xios(timer_resume), xios(timer_suspend), xios(timer_reset), xios(timer_get_time) 
     40USE imem_checker, ONLY : xios(mem_checker_get), xios(mem_checker_log) 
    4041 
    4142USE ifield, ONLY : txios(field), txios(fieldgroup), xios(is_valid_field), xios(is_valid_fieldgroup) 
  • 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  { 
  • XIOS3/trunk/src/mem_checker.hpp

    r2274 r2418  
    1313      void suspend(void); 
    1414      void resume(void); 
     15      void suspendRSS(void); 
     16      void resumeRSS(void); 
    1517      void reset(void); 
    1618      double getCumulatedMem(void); 
    1719      static double getMem(void); 
     20      static double getMemRSS(void); 
     21      static void logMem( std::string id, bool finalizeLog = false ); 
    1822      static CMemChecker& get(std::string name); 
    1923      static std::string getAllCumulatedMem(void) ; 
     
    3236      static bool first_ ; 
    3337      static bool enabled_ ; 
     38 
     39      static double vsize_init_; 
     40      static double time_init_; 
    3441  }; 
    3542} 
  • XIOS3/trunk/src/node/context.cpp

    r2410 r2418  
    1717#include "xios_spl.hpp" 
    1818#include "timer.hpp" 
     19#include "mem_checker.hpp" 
    1920#include "memtrack.hpp" 
    2021#include <limits> 
     
    888889   TRY 
    889890   { 
     891     CMemChecker::logMem( "CContext::closeDefinition" ); 
     892 
    890893     CTimer::get("Context : close definition").resume() ; 
    891894      
     
    11591162    for(auto& it : fieldBufferEvaluation) it.first->setBufferSize(it.second) ; 
    11601163 
    1161  
    11621164     CTimer::get("Context : close definition").suspend() ; 
     1165     CMemChecker::logMem( "CContext::closeDefinition END" ); 
    11631166  } 
    11641167  CATCH_DUMP_ATTR 
     
    20222025      if (prevStep < step) 
    20232026      { 
     2027        CMemChecker::logMem( "CContext::updateCalendar_"+std::to_string(step) ); 
    20242028        if (serviceType_==CServicesManager::CLIENT) // For now we only use server level 1 to read data 
    20252029        { 
  • XIOS3/trunk/src/server.cpp

    r2407 r2418  
    1313#include "tracer.hpp" 
    1414#include "timer.hpp" 
     15#include "mem_checker.hpp" 
    1516#include "event_scheduler.hpp" 
    1617#include "string_tools.hpp" 
     
    159160      CServer::openInfoStream(CXios::serverFile); 
    160161      CServer::openErrorStream(CXios::serverFile); 
     162 
     163      CMemChecker::logMem( "CServer::initialize" ); 
    161164 
    162165      ///////////////////////////////////////// 
     
    431434      CXios::getMpiGarbageCollector().release() ; // release unfree MPI ressources 
    432435 
     436      CMemChecker::logMem( "CServer::finalize", true ); 
    433437      if (!is_MPI_Initialized) 
    434438      { 
     
    440444      report(0)<<"Performance report : Ratio : "<<CTimer::get("Process events").getCumulatedTime()/CTimer::get("XIOS server").getCumulatedTime()*100.<<"%"<<endl  ; 
    441445      report(100)<<CTimer::getAllCumulatedTime()<<endl ; 
     446      report(100)<<CMemChecker::getAllCumulatedMem()<<endl ; 
    442447       
    443448      CWorkflowGraph::drawWorkFlowGraph_server(); 
Note: See TracChangeset for help on using the changeset viewer.