正在显示
4 个修改的文件
包含
194 行增加
和
15 行删除
| @@ -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 |
-
请 注册 或 登录 后发表评论