source: Sophya/trunk/SophyaLib/SysTools/resusage.cc@ 3859

Last change on this file since 3859 was 3207, checked in by ansari, 18 years ago

petite verification/correction ds resusage.cc pour linux, Reza 10/04/2007

File size: 5.7 KB
Line 
1#include "sopnamsp.h"
2#include "resusage.h"
3
4#include <typeinfo>
5#include <sys/types.h>
6#include <sys/time.h>
7#include <sys/stat.h>
8#include <sys/resource.h>
9#include <unistd.h>
10#include <time.h>
11#include <fcntl.h>
12#include <fstream>
13#include <stdio.h>
14#include <string>
15/*!
16 \class SOPHYA::ResourceUsage
17 \ingroup SysTools
18 This class gives acces to various system resource usage
19 (CPU, memory, ...).
20 All returned values are in kilobytes for memory consumptions
21 and in milli-seconds fo CPU and elapsed times.
22 The information should be updated through the call to the
23 Update() method.
24 Note: The information is obtained through \c getrusage()
25 and \c getrlimit() system calls, and depending on the OS,
26 not all of the memory usage values are correctly filled.
27 \code
28 // How to check resource usage for a given part of the program
29 ResourceUsage res;
30 // --- Part of the program to be checked : Start
31 // ...
32 res.Update();
33 cout << " Memory size increase (KB):" << res.getDeltaMemorySize() << endl;
34 cout << " Resource usage info : \n" << res << endl;
35 \endcode
36*/
37/*!
38 Constructor. the \b Update() method is called.
39 \param pg: Process group RU_Self or RU_Children or RU_All
40 - pg = RU_Self : Resource usage for the process itself
41 - pg = RU_Children : Resource usage for the child processes
42 - pg = RU_All : resource usage for the process itself and its child processes
43*/
44ResourceUsage::ResourceUsage(RU_ProcGrp pg)
45{
46 procgrp = pg;
47 struct rlimit rl;
48 getrlimit(RLIMIT_DATA, &rl);
49 max_datasz = rl.rlim_cur/1024;
50#if defined(SunOS)
51 // Max resident size ne semble pas etre defini sur SunOS
52 max_rss = max_datasz;
53#else
54 getrlimit(RLIMIT_RSS, &rl);
55 max_rss = rl.rlim_cur/1024;
56#endif
57 getrlimit(RLIMIT_STACK, &rl);
58 max_stack = rl.rlim_cur/1024;
59 /* Avr07 (Reza) : getrlimit(RLIMIT_DATA) semble bien renvoyer la bonne valeur
60 si une limite est definie, mais ReadLinuxTotMem() PAS OK
61#if defined(Linux)
62 // recuperation des limites sous Linux
63 // car je ne comprends pas ce que renc=voie getrlimit
64 // OPerdereau LAL Orsay 11/2002
65 ReadLinuxTotMem();
66#endif
67 */
68 cur_datasz = 0;
69 cur_stack = 0;
70 cur_rss = 0;
71 delta_rss = 0;
72 cur_tottm = 0;
73 cur_usrtm = 0;
74 cur_systm = 0;
75 elapsed_time = 0;
76 delta_rss = 0;
77 delta_tottm = 0;
78 delta_elapsed_time = 0;
79 cur_pid = getpid();
80 Update();
81
82}
83/*!
84 Destructor.
85*/
86ResourceUsage::~ResourceUsage()
87{
88}
89
90inline uint_8 s_timeval2msec(struct timeval & tv)
91{
92 uint_8 ret = tv.tv_sec; ret *= 1000;
93 ret += tv.tv_usec/1000; return(ret);
94}
95
96/*!
97 Update the CPU and memory usage information.
98*/
99int ResourceUsage::Update()
100{
101 struct rusage rsu;
102 int rc;
103 if ((procgrp == RU_Self) || (procgrp == RU_All))
104 rc = getrusage(RUSAGE_SELF, &rsu);
105 else
106 rc = getrusage(RUSAGE_CHILDREN, &rsu);
107
108 delta_tottm = cur_tottm;
109 delta_rss = cur_rss;
110 cur_usrtm = s_timeval2msec(rsu.ru_utime);
111 cur_systm = s_timeval2msec(rsu.ru_stime);
112 if (procgrp == RU_All) {
113 struct rusage rsuch;
114 rc = getrusage(RUSAGE_CHILDREN, &rsuch);
115 cur_usrtm += s_timeval2msec(rsuch.ru_utime);
116 cur_systm += s_timeval2msec(rsuch.ru_stime);
117 }
118 cur_tottm = cur_usrtm+cur_systm;
119 delta_tottm = cur_tottm-delta_tottm;
120
121#if defined(Linux)
122 // Recuperation de la place en memoire ss Linux
123 ReadLinuxMem();
124#else
125 cur_rss = rsu.ru_maxrss;
126 cur_datasz = rsu.ru_idrss;
127 cur_stack = rsu.ru_isrss;
128#endif
129
130 delta_rss = cur_rss-delta_rss;
131 delta_elapsed_time = elapsed_time;
132 time_t tm = time(NULL);
133 if (elapsed_time == 0) t0_time = tm;
134 elapsed_time = (tm - t0_time)*1000;
135 if (elapsed_time < 1) elapsed_time = 1;
136 delta_elapsed_time = elapsed_time-delta_elapsed_time;
137 return(rc);
138}
139
140/*!
141 Prints the CPU and memory usage information.
142 \param os : The output stream
143 \param lp : The print level (0 .. 2)
144 \param upd : if \c true , the Update method is called.
145*/
146void ResourceUsage::Print(ostream& os, int lp, bool upd)
147{
148 if (upd) Update();
149 os << " --------------- ResourceUsage::Print(lp=" << lp
150 <<" ) --------------- " << endl;
151 int load = (int)(getAverageCPULoad()*100.);
152 os << " CPU-Usage= " << getCPUTime() << " Elapsed= " << getElapsedTime()
153 << " msec - Load= " << load << " %" << endl;
154 long fracmem = getMemorySize()*100/getMaxMemorySize();
155 os << " MemoryUsage= " << getMemorySize() << " /Max= " << getMaxMemorySize()
156 << " kbytes (" << fracmem << " %)" << endl;
157 if (lp < 1) return;
158 os << " CPU-Usage= " << cur_tottm << "ms (usr,sys)=("
159 << cur_usrtm << "," << cur_systm << ")" << endl;
160 os << " DataSize=" << cur_datasz << " /Max " << max_datasz
161 << " kbytes" << endl;
162 os << " StackSize=" << cur_stack << " /Max " << max_stack
163 << " kbytes" << endl;
164 os << " ResSize=" << cur_rss << " /Max " << max_rss
165 << " kbytes" << endl;
166}
167/*!
168 Recuperation de la place en memoire ss Linux
169 ecrit d'apres les sources du code de top
170 O. Perdereau LAL Orsay 11/2002
171
172*/
173void ResourceUsage::ReadLinuxMem(){
174
175#if defined(Linux)
176
177 char flnm[120];
178
179 sprintf(flnm,"/proc/%d/statm",(int)cur_pid);
180 ifstream fich(flnm) ;
181
182
183 long lia,lib,lic,lid,lie,lif,lig;
184
185 fich >> lia >> lib >> lic >> lid >> lie >> lif >> lig ;
186
187 cur_rss = lia*4; // les valeurs sont en pages de 4 k
188 cur_datasz = lib*4;
189 cur_stack = lic*4;
190
191#endif
192
193}
194
195
196/*!
197 Recuperation de la memoire dispo ss Linux
198 ecrit d'apres les sources du code de top
199 O. Perdereau LAL Orsay 11/2002
200*/
201void ResourceUsage::ReadLinuxTotMem(){
202#if defined(Linux)
203
204 char flnm[]="/proc/meminfo";
205 char buff[512];
206 ifstream fich(flnm) ;
207
208 fich.getline(buff,500); // on saute une ligne
209
210 string tst;
211 long lia,lib,lic,lid,lie,lif;
212 fich >> tst >> lia >> lib >> lic >> lid >> lie >> lif;
213
214 max_rss = lia/1024; // conversion en kbytes
215
216#endif
217
218}
Note: See TracBrowser for help on using the repository browser.