正在显示
4 个修改的文件
包含
230 行增加
和
51 行删除
| @@ -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 | ||
| @@ -77,6 +78,9 @@ void srs_update_system_rusage() | @@ -77,6 +78,9 @@ void srs_update_system_rusage() | ||
| 77 | srs_warn("getrusage failed, ignore"); | 78 | srs_warn("getrusage failed, ignore"); |
| 78 | return; | 79 | return; |
| 79 | } | 80 | } |
| 81 | + | ||
| 82 | + srs_update_system_time_ms(); | ||
| 83 | + _srs_system_rusage.sample_time = srs_get_system_time_ms(); | ||
| 80 | 84 | ||
| 81 | _srs_system_rusage.ok = true; | 85 | _srs_system_rusage.ok = true; |
| 82 | } | 86 | } |
| @@ -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,69 +167,145 @@ SrsProcSystemStat* srs_get_system_proc_stat() | @@ -104,69 +167,145 @@ SrsProcSystemStat* srs_get_system_proc_stat() | ||
| 104 | return &_srs_system_cpu_system_stat; | 167 | return &_srs_system_cpu_system_stat; |
| 105 | } | 168 | } |
| 106 | 169 | ||
| 170 | +bool get_proc_system_stat(SrsProcSystemStat& r) | ||
| 171 | +{ | ||
| 172 | + FILE* f = fopen("/proc/stat", "r"); | ||
| 173 | + if (f == NULL) { | ||
| 174 | + srs_warn("open system cpu stat failed, ignore"); | ||
| 175 | + return false; | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + for (;;) { | ||
| 179 | + int ret = fscanf(f, "%4s %lu %lu %lu %lu %lu " | ||
| 180 | + "%lu %lu %lu %lu\n", | ||
| 181 | + r.label, &r.user, &r.nice, &r.sys, &r.idle, &r.iowait, | ||
| 182 | + &r.irq, &r.softirq, &r.steal, &r.guest); | ||
| 183 | + r.ok = false; | ||
| 184 | + | ||
| 185 | + if (ret == EOF) { | ||
| 186 | + break; | ||
| 187 | + } | ||
| 188 | + | ||
| 189 | + if (strcmp("cpu", r.label) == 0) { | ||
| 190 | + r.ok = true; | ||
| 191 | + break; | ||
| 192 | + } | ||
| 193 | + } | ||
| 194 | + | ||
| 195 | + fclose(f); | ||
| 196 | + | ||
| 197 | + return r.ok; | ||
| 198 | +} | ||
| 199 | + | ||
| 200 | +bool get_proc_self_stat(SrsProcSelfStat& r) | ||
| 201 | +{ | ||
| 202 | + FILE* f = fopen("/proc/self/stat", "r"); | ||
| 203 | + if (f == NULL) { | ||
| 204 | + srs_warn("open self cpu stat failed, ignore"); | ||
| 205 | + return false; | ||
| 206 | + } | ||
| 207 | + | ||
| 208 | + int ret = fscanf(f, "%d %32s %c %d %d %d %d " | ||
| 209 | + "%d %u %lu %lu %lu %lu " | ||
| 210 | + "%lu %lu %ld %ld %ld %ld " | ||
| 211 | + "%ld %ld %llu %lu %ld " | ||
| 212 | + "%lu %lu %lu %lu %lu " | ||
| 213 | + "%lu %lu %lu %lu %lu " | ||
| 214 | + "%lu %lu %lu %d %d " | ||
| 215 | + "%u %u %llu " | ||
| 216 | + "%lu %ld", | ||
| 217 | + &r.pid, r.comm, &r.state, &r.ppid, &r.pgrp, &r.session, &r.tty_nr, | ||
| 218 | + &r.tpgid, &r.flags, &r.minflt, &r.cminflt, &r.majflt, &r.cmajflt, | ||
| 219 | + &r.utime, &r.stime, &r.cutime, &r.cstime, &r.priority, &r.nice, | ||
| 220 | + &r.num_threads, &r.itrealvalue, &r.starttime, &r.vsize, &r.rss, | ||
| 221 | + &r.rsslim, &r.startcode, &r.endcode, &r.startstack, &r.kstkesp, | ||
| 222 | + &r.kstkeip, &r.signal, &r.blocked, &r.sigignore, &r.sigcatch, | ||
| 223 | + &r.wchan, &r.nswap, &r.cnswap, &r.exit_signal, &r.processor, | ||
| 224 | + &r.rt_priority, &r.policy, &r.delayacct_blkio_ticks, | ||
| 225 | + &r.guest_time, &r.cguest_time); | ||
| 226 | + | ||
| 227 | + if (ret >= 0) { | ||
| 228 | + r.ok = true; | ||
| 229 | + } | ||
| 230 | + | ||
| 231 | + fclose(f); | ||
| 232 | + | ||
| 233 | + return r.ok; | ||
| 234 | +} | ||
| 235 | + | ||
| 107 | void srs_update_proc_stat() | 236 | void srs_update_proc_stat() |
| 108 | { | 237 | { |
| 238 | + srs_update_system_time_ms(); | ||
| 239 | + | ||
| 109 | // system cpu stat | 240 | // system cpu stat |
| 110 | if (true) { | 241 | if (true) { |
| 111 | - FILE* f = fopen("/proc/stat", "r"); | ||
| 112 | - if (f == NULL) { | ||
| 113 | - srs_warn("open system cpu stat failed, ignore"); | 242 | + SrsProcSystemStat r; |
| 243 | + if (!get_proc_system_stat(r)) { | ||
| 114 | return; | 244 | return; |
| 115 | } | 245 | } |
| 116 | 246 | ||
| 117 | - SrsProcSystemStat& r = _srs_system_cpu_system_stat; | ||
| 118 | - for (;;) { | ||
| 119 | - int ret = fscanf(f, "%4s %lu %lu %lu %lu %lu " | ||
| 120 | - "%lu %lu %lu %lu\n", | ||
| 121 | - r.label, &r.user, &r.nice, &r.sys, &r.idle, &r.iowait, | ||
| 122 | - &r.irq, &r.softirq, &r.steal, &r.guest); | ||
| 123 | - r.ok = false; | ||
| 124 | - | ||
| 125 | - if (ret == EOF) { | ||
| 126 | - break; | ||
| 127 | - } | ||
| 128 | - | ||
| 129 | - if (strcmp("cpu", r.label) == 0) { | ||
| 130 | - r.ok = true; | ||
| 131 | - break; | ||
| 132 | - } | 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); | ||
| 133 | } | 258 | } |
| 134 | 259 | ||
| 135 | - fclose(f); | 260 | + // upate cache. |
| 261 | + _srs_system_cpu_system_stat = r; | ||
| 136 | } | 262 | } |
| 137 | 263 | ||
| 138 | // self cpu stat | 264 | // self cpu stat |
| 139 | if (true) { | 265 | if (true) { |
| 140 | - FILE* f = fopen("/proc/self/stat", "r"); | ||
| 141 | - if (f == NULL) { | ||
| 142 | - srs_warn("open self cpu stat failed, ignore"); | 266 | + SrsProcSelfStat r; |
| 267 | + if (!get_proc_self_stat(r)) { | ||
| 143 | return; | 268 | return; |
| 144 | } | 269 | } |
| 145 | 270 | ||
| 146 | - SrsProcSelfStat& r = _srs_system_cpu_self_stat; | ||
| 147 | - int ret = fscanf(f, "%d %32s %c %d %d %d %d " | ||
| 148 | - "%d %u %lu %lu %lu %lu " | ||
| 149 | - "%lu %lu %ld %ld %ld %ld " | ||
| 150 | - "%ld %ld %llu %lu %ld " | ||
| 151 | - "%lu %lu %lu %lu %lu " | ||
| 152 | - "%lu %lu %lu %lu %lu " | ||
| 153 | - "%lu %lu %lu %d %d " | ||
| 154 | - "%u %u %llu " | ||
| 155 | - "%lu %ld", | ||
| 156 | - &r.pid, r.comm, &r.state, &r.ppid, &r.pgrp, &r.session, &r.tty_nr, | ||
| 157 | - &r.tpgid, &r.flags, &r.minflt, &r.cminflt, &r.majflt, &r.cmajflt, | ||
| 158 | - &r.utime, &r.stime, &r.cutime, &r.cstime, &r.priority, &r.nice, | ||
| 159 | - &r.num_threads, &r.itrealvalue, &r.starttime, &r.vsize, &r.rss, | ||
| 160 | - &r.rsslim, &r.startcode, &r.endcode, &r.startstack, &r.kstkesp, | ||
| 161 | - &r.kstkeip, &r.signal, &r.blocked, &r.sigignore, &r.sigcatch, | ||
| 162 | - &r.wchan, &r.nswap, &r.cnswap, &r.exit_signal, &r.processor, | ||
| 163 | - &r.rt_priority, &r.policy, &r.delayacct_blkio_ticks, | ||
| 164 | - &r.guest_time, &r.cguest_time); | ||
| 165 | - | ||
| 166 | - if (ret >= 0) { | ||
| 167 | - r.ok = true; | 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); | ||
| 168 | } | 282 | } |
| 169 | 283 | ||
| 170 | - fclose(f); | 284 | + // upate cache. |
| 285 | + _srs_system_cpu_self_stat = r; | ||
| 171 | } | 286 | } |
| 172 | } | 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; | ||
| 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 |
-
请 注册 或 登录 后发表评论