winlin

add cpuinfo

@@ -201,6 +201,7 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -201,6 +201,7 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
201 SrsRusage* r = srs_get_system_rusage(); 201 SrsRusage* r = srs_get_system_rusage();
202 SrsProcSelfStat* u = srs_get_self_proc_stat(); 202 SrsProcSelfStat* u = srs_get_self_proc_stat();
203 SrsProcSystemStat* s = srs_get_system_proc_stat(); 203 SrsProcSystemStat* s = srs_get_system_proc_stat();
  204 + SrsCpuInfo* c = srs_get_cpuinfo();
204 205
205 ss << JOBJECT_START 206 ss << JOBJECT_START
206 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT 207 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
@@ -211,7 +212,12 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -211,7 +212,12 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
211 << JFIELD_ORG("rusage_ok", (r->ok? "true":"false")) << JFIELD_CONT 212 << JFIELD_ORG("rusage_ok", (r->ok? "true":"false")) << JFIELD_CONT
212 << JFIELD_ORG("self_cpu_stat_ok", (u->ok? "true":"false")) << JFIELD_CONT 213 << JFIELD_ORG("self_cpu_stat_ok", (u->ok? "true":"false")) << JFIELD_CONT
213 << JFIELD_ORG("system_cpu_stat_ok", (s->ok? "true":"false")) << JFIELD_CONT 214 << JFIELD_ORG("system_cpu_stat_ok", (s->ok? "true":"false")) << JFIELD_CONT
  215 + << JFIELD_ORG("cpuinfo_ok", (c->ok? "true":"false")) << JFIELD_CONT
214 << JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << JFIELD_CONT 216 << JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << JFIELD_CONT
  217 + << JFIELD_ORG("system_cpu", s->percent) << JFIELD_CONT
  218 + << JFIELD_ORG("self_cpu", u->percent) << JFIELD_CONT
  219 + << JFIELD_ORG("nb_processors", c->nb_processors) << JFIELD_CONT
  220 + << JFIELD_ORG("nb_processors_online", c->nb_processors_online) << JFIELD_CONT
215 << JFIELD_ORG("ppid", u->ppid) 221 << JFIELD_ORG("ppid", u->ppid)
216 << JOBJECT_END 222 << JOBJECT_END
217 << JOBJECT_END; 223 << JOBJECT_END;
@@ -241,7 +247,8 @@ int SrsApiRusages::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -241,7 +247,8 @@ int SrsApiRusages::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
241 ss << JOBJECT_START 247 ss << JOBJECT_START
242 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT 248 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
243 << JFIELD_ORG("data", JOBJECT_START) 249 << JFIELD_ORG("data", JOBJECT_START)
244 - << JFIELD_ORG("rusage_ok", (r->ok? "true":"false")) << JFIELD_CONT 250 + << JFIELD_ORG("ok", (r->ok? "true":"false")) << JFIELD_CONT
  251 + << JFIELD_ORG("sample_time", r->sample_time) << JFIELD_CONT
245 << JFIELD_ORG("ru_utime", r->r.ru_utime.tv_sec) << JFIELD_CONT 252 << JFIELD_ORG("ru_utime", r->r.ru_utime.tv_sec) << JFIELD_CONT
246 << JFIELD_ORG("ru_stime", r->r.ru_stime.tv_sec) << JFIELD_CONT 253 << JFIELD_ORG("ru_stime", r->r.ru_stime.tv_sec) << JFIELD_CONT
247 << JFIELD_ORG("ru_maxrss", r->r.ru_maxrss) << JFIELD_CONT 254 << JFIELD_ORG("ru_maxrss", r->r.ru_maxrss) << JFIELD_CONT
@@ -286,7 +293,9 @@ int SrsApiSelfProcStats::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -286,7 +293,9 @@ int SrsApiSelfProcStats::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
286 ss << JOBJECT_START 293 ss << JOBJECT_START
287 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT 294 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
288 << JFIELD_ORG("data", JOBJECT_START) 295 << JFIELD_ORG("data", JOBJECT_START)
289 - << JFIELD_ORG("self_cpu_stat_ok", (u->ok? "true":"false")) << JFIELD_CONT 296 + << JFIELD_ORG("ok", (u->ok? "true":"false")) << JFIELD_CONT
  297 + << JFIELD_ORG("sample_time", u->sample_time) << JFIELD_CONT
  298 + << JFIELD_ORG("percent", u->percent) << JFIELD_CONT
290 << JFIELD_ORG("pid", u->pid) << JFIELD_CONT 299 << JFIELD_ORG("pid", u->pid) << JFIELD_CONT
291 << JFIELD_STR("comm", u->comm) << JFIELD_CONT 300 << JFIELD_STR("comm", u->comm) << JFIELD_CONT
292 << JFIELD_STR("state", u->state) << JFIELD_CONT 301 << JFIELD_STR("state", u->state) << JFIELD_CONT
@@ -359,7 +368,9 @@ int SrsApiSystemProcStats::do_process_request(SrsSocket* skt, SrsHttpMessage* re @@ -359,7 +368,9 @@ int SrsApiSystemProcStats::do_process_request(SrsSocket* skt, SrsHttpMessage* re
359 ss << JOBJECT_START 368 ss << JOBJECT_START
360 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT 369 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
361 << JFIELD_ORG("data", JOBJECT_START) 370 << JFIELD_ORG("data", JOBJECT_START)
362 - << JFIELD_ORG("system_cpu_stat_ok", (s->ok? "true":"false")) << JFIELD_CONT 371 + << JFIELD_ORG("ok", (s->ok? "true":"false")) << JFIELD_CONT
  372 + << JFIELD_ORG("sample_time", s->sample_time) << JFIELD_CONT
  373 + << JFIELD_ORG("percent", s->percent) << JFIELD_CONT
363 << JFIELD_ORG("user", s->user) << JFIELD_CONT 374 << JFIELD_ORG("user", s->user) << JFIELD_CONT
364 << JFIELD_ORG("nice", s->nice) << JFIELD_CONT 375 << JFIELD_ORG("nice", s->nice) << JFIELD_CONT
365 << JFIELD_ORG("sys", s->sys) << JFIELD_CONT 376 << JFIELD_ORG("sys", s->sys) << JFIELD_CONT
@@ -56,11 +56,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -56,11 +56,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
56 56
57 // update rusage interval: 57 // update rusage interval:
58 // SRS_SYS_CYCLE_INTERVAL * SRS_SYS_RUSAGE_RESOLUTION_TIMES 58 // SRS_SYS_CYCLE_INTERVAL * SRS_SYS_RUSAGE_RESOLUTION_TIMES
59 -#define SRS_SYS_RUSAGE_RESOLUTION_TIMES 15 59 +#define SRS_SYS_RUSAGE_RESOLUTION_TIMES 30
60 60
61 // update rusage interval: 61 // update rusage interval:
62 // SRS_SYS_CYCLE_INTERVAL * SRS_SYS_CPU_STAT_RESOLUTION_TIMES 62 // SRS_SYS_CYCLE_INTERVAL * SRS_SYS_CPU_STAT_RESOLUTION_TIMES
63 -#define SRS_SYS_CPU_STAT_RESOLUTION_TIMES 15 63 +#define SRS_SYS_CPU_STAT_RESOLUTION_TIMES 30
64 64
65 SrsListener::SrsListener(SrsServer* server, SrsListenerType type) 65 SrsListener::SrsListener(SrsServer* server, SrsListenerType type)
66 { 66 {
@@ -63,6 +63,7 @@ static SrsRusage _srs_system_rusage; @@ -63,6 +63,7 @@ static SrsRusage _srs_system_rusage;
63 SrsRusage::SrsRusage() 63 SrsRusage::SrsRusage()
64 { 64 {
65 ok = false; 65 ok = false;
  66 + sample_time = 0;
66 memset(&r, 0, sizeof(rusage)); 67 memset(&r, 0, sizeof(rusage));
67 } 68 }
68 69
@@ -78,6 +79,9 @@ void srs_update_system_rusage() @@ -78,6 +79,9 @@ void srs_update_system_rusage()
78 return; 79 return;
79 } 80 }
80 81
  82 + srs_update_system_time_ms();
  83 + _srs_system_rusage.sample_time = srs_get_system_time_ms();
  84 +
81 _srs_system_rusage.ok = true; 85 _srs_system_rusage.ok = true;
82 } 86 }
83 87
@@ -87,11 +91,70 @@ static SrsProcSystemStat _srs_system_cpu_system_stat; @@ -87,11 +91,70 @@ static SrsProcSystemStat _srs_system_cpu_system_stat;
87 SrsProcSelfStat::SrsProcSelfStat() 91 SrsProcSelfStat::SrsProcSelfStat()
88 { 92 {
89 ok = false; 93 ok = false;
  94 + sample_time = 0;
  95 + percent = 0;
  96 +
  97 + pid = 0;
  98 + memset(comm, 0, sizeof(comm));
  99 + state = 0;
  100 + ppid = 0;
  101 + pgrp = 0;
  102 + session = 0;
  103 + tty_nr = 0;
  104 + tpgid = 0;
  105 + flags = 0;
  106 + minflt = 0;
  107 + cminflt = 0;
  108 + majflt = 0;
  109 + cmajflt = 0;
  110 + utime = 0;
  111 + stime = 0;
  112 + cutime = 0;
  113 + cstime = 0;
  114 + priority = 0;
  115 + nice = 0;
  116 + num_threads = 0;
  117 + itrealvalue = 0;
  118 + starttime = 0;
  119 + vsize = 0;
  120 + rss = 0;
  121 + rsslim = 0;
  122 + startcode = 0;
  123 + endcode = 0;
  124 + startstack = 0;
  125 + kstkesp = 0;
  126 + kstkeip = 0;
  127 + signal = 0;
  128 + blocked = 0;
  129 + sigignore = 0;
  130 + sigcatch = 0;
  131 + wchan = 0;
  132 + nswap = 0;
  133 + cnswap = 0;
  134 + exit_signal = 0;
  135 + processor = 0;
  136 + rt_priority = 0;
  137 + policy = 0;
  138 + delayacct_blkio_ticks = 0;
  139 + guest_time = 0;
  140 + cguest_time = 0;
90 } 141 }
91 142
92 SrsProcSystemStat::SrsProcSystemStat() 143 SrsProcSystemStat::SrsProcSystemStat()
93 { 144 {
94 ok = false; 145 ok = false;
  146 + sample_time = 0;
  147 + percent = 0;
  148 + memset(label, 0, sizeof(label));
  149 + user = 0;
  150 + nice = 0;
  151 + sys = 0;
  152 + idle = 0;
  153 + iowait = 0;
  154 + irq = 0;
  155 + softirq = 0;
  156 + steal = 0;
  157 + guest = 0;
95 } 158 }
96 159
97 SrsProcSelfStat* srs_get_self_proc_stat() 160 SrsProcSelfStat* srs_get_self_proc_stat()
@@ -104,17 +167,14 @@ SrsProcSystemStat* srs_get_system_proc_stat() @@ -104,17 +167,14 @@ SrsProcSystemStat* srs_get_system_proc_stat()
104 return &_srs_system_cpu_system_stat; 167 return &_srs_system_cpu_system_stat;
105 } 168 }
106 169
107 -void srs_update_proc_stat() 170 +bool get_proc_system_stat(SrsProcSystemStat& r)
108 { 171 {
109 - // system cpu stat  
110 - if (true) {  
111 FILE* f = fopen("/proc/stat", "r"); 172 FILE* f = fopen("/proc/stat", "r");
112 if (f == NULL) { 173 if (f == NULL) {
113 srs_warn("open system cpu stat failed, ignore"); 174 srs_warn("open system cpu stat failed, ignore");
114 - return; 175 + return false;
115 } 176 }
116 177
117 - SrsProcSystemStat& r = _srs_system_cpu_system_stat;  
118 for (;;) { 178 for (;;) {
119 int ret = fscanf(f, "%4s %lu %lu %lu %lu %lu " 179 int ret = fscanf(f, "%4s %lu %lu %lu %lu %lu "
120 "%lu %lu %lu %lu\n", 180 "%lu %lu %lu %lu\n",
@@ -133,17 +193,18 @@ void srs_update_proc_stat() @@ -133,17 +193,18 @@ void srs_update_proc_stat()
133 } 193 }
134 194
135 fclose(f); 195 fclose(f);
136 - }  
137 196
138 - // self cpu stat  
139 - if (true) { 197 + return r.ok;
  198 +}
  199 +
  200 +bool get_proc_self_stat(SrsProcSelfStat& r)
  201 +{
140 FILE* f = fopen("/proc/self/stat", "r"); 202 FILE* f = fopen("/proc/self/stat", "r");
141 if (f == NULL) { 203 if (f == NULL) {
142 srs_warn("open self cpu stat failed, ignore"); 204 srs_warn("open self cpu stat failed, ignore");
143 - return; 205 + return false;
144 } 206 }
145 207
146 - SrsProcSelfStat& r = _srs_system_cpu_self_stat;  
147 int ret = fscanf(f, "%d %32s %c %d %d %d %d " 208 int ret = fscanf(f, "%d %32s %c %d %d %d %d "
148 "%d %u %lu %lu %lu %lu " 209 "%d %u %lu %lu %lu %lu "
149 "%lu %lu %ld %ld %ld %ld " 210 "%lu %lu %ld %ld %ld %ld "
@@ -168,5 +229,83 @@ void srs_update_proc_stat() @@ -168,5 +229,83 @@ void srs_update_proc_stat()
168 } 229 }
169 230
170 fclose(f); 231 fclose(f);
  232 +
  233 + return r.ok;
  234 +}
  235 +
  236 +void srs_update_proc_stat()
  237 +{
  238 + srs_update_system_time_ms();
  239 +
  240 + // system cpu stat
  241 + if (true) {
  242 + SrsProcSystemStat r;
  243 + if (!get_proc_system_stat(r)) {
  244 + return;
  245 + }
  246 +
  247 + r.sample_time = srs_get_system_time_ms();
  248 +
  249 + // calc usage in percent
  250 + SrsProcSystemStat& o = _srs_system_cpu_system_stat;
  251 +
  252 + // @see: http://blog.csdn.net/nineday/article/details/1928847
  253 + int64_t total = (r.user + r.nice + r.sys + r.idle + r.iowait + r.irq + r.softirq + r.steal + r.guest)
  254 + - (o.user + o.nice + o.sys + o.idle + o.iowait + o.irq + o.softirq + o.steal + o.guest);
  255 + int64_t idle = r.idle - o.idle;
  256 + if (total > 0) {
  257 + r.percent = (float)(1 - idle / (double)total);
  258 + }
  259 +
  260 + // upate cache.
  261 + _srs_system_cpu_system_stat = r;
  262 + }
  263 +
  264 + // self cpu stat
  265 + if (true) {
  266 + SrsProcSelfStat r;
  267 + if (!get_proc_self_stat(r)) {
  268 + return;
  269 + }
  270 +
  271 + srs_update_system_time_ms();
  272 + r.sample_time = srs_get_system_time_ms();
  273 +
  274 + // calc usage in percent
  275 + SrsProcSelfStat& o = _srs_system_cpu_self_stat;
  276 +
  277 + // @see: http://stackoverflow.com/questions/16011677/calculating-cpu-usage-using-proc-files
  278 + int64_t total = r.sample_time - o.sample_time;
  279 + int64_t usage = (r.utime + r.stime) - (o.utime + o.stime);
  280 + if (total > 0) {
  281 + r.percent = (float)(usage * 1000 / (double)total / 100);
171 } 282 }
  283 +
  284 + // upate cache.
  285 + _srs_system_cpu_self_stat = r;
  286 + }
  287 +}
  288 +
  289 +SrsCpuInfo::SrsCpuInfo()
  290 +{
  291 + ok = false;
  292 +
  293 + nb_processors = 0;
  294 + nb_processors_online = 0;
  295 +}
  296 +
  297 +SrsCpuInfo* srs_get_cpuinfo()
  298 +{
  299 + static SrsCpuInfo* cpu = NULL;
  300 + if (cpu != NULL) {
  301 + return cpu;
  302 + }
  303 +
  304 + // initialize cpu info.
  305 + cpu = new SrsCpuInfo();
  306 + cpu->ok = true;
  307 + cpu->nb_processors = sysconf(_SC_NPROCESSORS_CONF);
  308 + cpu->nb_processors_online = sysconf(_SC_NPROCESSORS_ONLN);
  309 +
  310 + return cpu;
172 } 311 }
@@ -40,7 +40,11 @@ extern void srs_update_system_time_ms(); @@ -40,7 +40,11 @@ extern void srs_update_system_time_ms();
40 // @see: man getrusage 40 // @see: man getrusage
41 struct SrsRusage 41 struct SrsRusage
42 { 42 {
  43 + // whether the data is ok.
43 bool ok; 44 bool ok;
  45 + // the time in ms when sample.
  46 + int64_t sample_time;
  47 +
44 rusage r; 48 rusage r;
45 49
46 SrsRusage(); 50 SrsRusage();
@@ -56,6 +60,10 @@ struct SrsProcSelfStat @@ -56,6 +60,10 @@ struct SrsProcSelfStat
56 { 60 {
57 // whether the data is ok. 61 // whether the data is ok.
58 bool ok; 62 bool ok;
  63 + // the time in ms when sample.
  64 + int64_t sample_time;
  65 + // the percent of usage. 0.153 is 15.3%.
  66 + float percent;
59 67
60 // pid %d The process ID. 68 // pid %d The process ID.
61 int pid; 69 int pid;
@@ -203,6 +211,10 @@ struct SrsProcSystemStat @@ -203,6 +211,10 @@ struct SrsProcSystemStat
203 { 211 {
204 // whether the data is ok. 212 // whether the data is ok.
205 bool ok; 213 bool ok;
  214 + // the time in ms when sample.
  215 + int64_t sample_time;
  216 + // the percent of usage. 0.153 is 15.3%.
  217 + float percent;
206 218
207 // always be cpu 219 // always be cpu
208 char label[32]; 220 char label[32];
@@ -248,4 +260,21 @@ extern SrsProcSystemStat* srs_get_system_proc_stat(); @@ -248,4 +260,21 @@ extern SrsProcSystemStat* srs_get_system_proc_stat();
248 // the deamon st-thread will update it. 260 // the deamon st-thread will update it.
249 extern void srs_update_proc_stat(); 261 extern void srs_update_proc_stat();
250 262
  263 +// @see: cat /proc/cpuinfo
  264 +struct SrsCpuInfo
  265 +{
  266 + // whether the data is ok.
  267 + bool ok;
  268 +
  269 + // The number of processors configured.
  270 + int nb_processors;
  271 + // The number of processors currently online (available).
  272 + int nb_processors_online;
  273 +
  274 + SrsCpuInfo();
  275 +};
  276 +
  277 +// get system cpu info, use cache to avoid performance problem.
  278 +extern SrsCpuInfo* srs_get_cpuinfo();
  279 +
251 #endif 280 #endif