winlin

move some utilities from kernel to app. 0.9.99

@@ -128,7 +128,7 @@ int SrsForwarder::on_publish(SrsRequest* req, std::string forward_server) @@ -128,7 +128,7 @@ int SrsForwarder::on_publish(SrsRequest* req, std::string forward_server)
128 source_ep.c_str(), dest_ep.c_str(), ret); 128 source_ep.c_str(), dest_ep.c_str(), ret);
129 return ret; 129 return ret;
130 } 130 }
131 - srs_trace("start forward %s to %s, stream: %s/%s", 131 + srs_trace("start forward %s to %s, tcUrl=%s, stream=%s",
132 source_ep.c_str(), dest_ep.c_str(), tc_url.c_str(), 132 source_ep.c_str(), dest_ep.c_str(), tc_url.c_str(),
133 stream_name.c_str()); 133 stream_name.c_str());
134 134
@@ -36,6 +36,7 @@ using namespace std; @@ -36,6 +36,7 @@ using namespace std;
36 #include <srs_app_json.hpp> 36 #include <srs_app_json.hpp>
37 #include <srs_app_config.hpp> 37 #include <srs_app_config.hpp>
38 #include <srs_kernel_utility.hpp> 38 #include <srs_kernel_utility.hpp>
  39 +#include <srs_app_utility.hpp>
39 40
40 SrsApiRoot::SrsApiRoot() 41 SrsApiRoot::SrsApiRoot()
41 { 42 {
@@ -45,6 +45,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -45,6 +45,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
45 #include <srs_app_ingest.hpp> 45 #include <srs_app_ingest.hpp>
46 #endif 46 #endif
47 #include <srs_app_source.hpp> 47 #include <srs_app_source.hpp>
  48 +#include <srs_app_utility.hpp>
48 49
49 #define SERVER_LISTEN_BACKLOG 512 50 #define SERVER_LISTEN_BACKLOG 512
50 51
@@ -23,8 +23,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -23,8 +23,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 23
24 #include <srs_app_utility.hpp> 24 #include <srs_app_utility.hpp>
25 25
  26 +#include <unistd.h>
  27 +
26 #include <srs_kernel_log.hpp> 28 #include <srs_kernel_log.hpp>
27 #include <srs_app_config.hpp> 29 #include <srs_app_config.hpp>
  30 +#include <srs_kernel_utility.hpp>
28 31
29 int srs_get_log_level(std::string level) 32 int srs_get_log_level(std::string level)
30 { 33 {
@@ -42,3 +45,393 @@ int srs_get_log_level(std::string level) @@ -42,3 +45,393 @@ int srs_get_log_level(std::string level)
42 return SrsLogLevel::Trace; 45 return SrsLogLevel::Trace;
43 } 46 }
44 } 47 }
  48 +
  49 +static SrsRusage _srs_system_rusage;
  50 +
  51 +SrsRusage::SrsRusage()
  52 +{
  53 + ok = false;
  54 + sample_time = 0;
  55 + memset(&r, 0, sizeof(rusage));
  56 +}
  57 +
  58 +SrsRusage* srs_get_system_rusage()
  59 +{
  60 + return &_srs_system_rusage;
  61 +}
  62 +
  63 +void srs_update_system_rusage()
  64 +{
  65 + if (getrusage(RUSAGE_SELF, &_srs_system_rusage.r) < 0) {
  66 + srs_warn("getrusage failed, ignore");
  67 + return;
  68 + }
  69 +
  70 + srs_update_system_time_ms();
  71 + _srs_system_rusage.sample_time = srs_get_system_time_ms();
  72 +
  73 + _srs_system_rusage.ok = true;
  74 +}
  75 +
  76 +static SrsProcSelfStat _srs_system_cpu_self_stat;
  77 +static SrsProcSystemStat _srs_system_cpu_system_stat;
  78 +
  79 +SrsProcSelfStat::SrsProcSelfStat()
  80 +{
  81 + ok = false;
  82 + sample_time = 0;
  83 + percent = 0;
  84 +
  85 + pid = 0;
  86 + memset(comm, 0, sizeof(comm));
  87 + state = 0;
  88 + ppid = 0;
  89 + pgrp = 0;
  90 + session = 0;
  91 + tty_nr = 0;
  92 + tpgid = 0;
  93 + flags = 0;
  94 + minflt = 0;
  95 + cminflt = 0;
  96 + majflt = 0;
  97 + cmajflt = 0;
  98 + utime = 0;
  99 + stime = 0;
  100 + cutime = 0;
  101 + cstime = 0;
  102 + priority = 0;
  103 + nice = 0;
  104 + num_threads = 0;
  105 + itrealvalue = 0;
  106 + starttime = 0;
  107 + vsize = 0;
  108 + rss = 0;
  109 + rsslim = 0;
  110 + startcode = 0;
  111 + endcode = 0;
  112 + startstack = 0;
  113 + kstkesp = 0;
  114 + kstkeip = 0;
  115 + signal = 0;
  116 + blocked = 0;
  117 + sigignore = 0;
  118 + sigcatch = 0;
  119 + wchan = 0;
  120 + nswap = 0;
  121 + cnswap = 0;
  122 + exit_signal = 0;
  123 + processor = 0;
  124 + rt_priority = 0;
  125 + policy = 0;
  126 + delayacct_blkio_ticks = 0;
  127 + guest_time = 0;
  128 + cguest_time = 0;
  129 +}
  130 +
  131 +SrsProcSystemStat::SrsProcSystemStat()
  132 +{
  133 + ok = false;
  134 + sample_time = 0;
  135 + percent = 0;
  136 + memset(label, 0, sizeof(label));
  137 + user = 0;
  138 + nice = 0;
  139 + sys = 0;
  140 + idle = 0;
  141 + iowait = 0;
  142 + irq = 0;
  143 + softirq = 0;
  144 + steal = 0;
  145 + guest = 0;
  146 +}
  147 +
  148 +SrsProcSelfStat* srs_get_self_proc_stat()
  149 +{
  150 + return &_srs_system_cpu_self_stat;
  151 +}
  152 +
  153 +SrsProcSystemStat* srs_get_system_proc_stat()
  154 +{
  155 + return &_srs_system_cpu_system_stat;
  156 +}
  157 +
  158 +bool get_proc_system_stat(SrsProcSystemStat& r)
  159 +{
  160 + FILE* f = fopen("/proc/stat", "r");
  161 + if (f == NULL) {
  162 + srs_warn("open system cpu stat failed, ignore");
  163 + return false;
  164 + }
  165 +
  166 + for (;;) {
  167 + int ret = fscanf(f, "%4s %lu %lu %lu %lu %lu "
  168 + "%lu %lu %lu %lu\n",
  169 + r.label, &r.user, &r.nice, &r.sys, &r.idle, &r.iowait,
  170 + &r.irq, &r.softirq, &r.steal, &r.guest);
  171 + r.ok = false;
  172 +
  173 + if (ret == EOF) {
  174 + break;
  175 + }
  176 +
  177 + if (strcmp("cpu", r.label) == 0) {
  178 + r.ok = true;
  179 + break;
  180 + }
  181 + }
  182 +
  183 + fclose(f);
  184 +
  185 + return r.ok;
  186 +}
  187 +
  188 +bool get_proc_self_stat(SrsProcSelfStat& r)
  189 +{
  190 + FILE* f = fopen("/proc/self/stat", "r");
  191 + if (f == NULL) {
  192 + srs_warn("open self cpu stat failed, ignore");
  193 + return false;
  194 + }
  195 +
  196 + int ret = fscanf(f, "%d %32s %c %d %d %d %d "
  197 + "%d %u %lu %lu %lu %lu "
  198 + "%lu %lu %ld %ld %ld %ld "
  199 + "%ld %ld %llu %lu %ld "
  200 + "%lu %lu %lu %lu %lu "
  201 + "%lu %lu %lu %lu %lu "
  202 + "%lu %lu %lu %d %d "
  203 + "%u %u %llu "
  204 + "%lu %ld",
  205 + &r.pid, r.comm, &r.state, &r.ppid, &r.pgrp, &r.session, &r.tty_nr,
  206 + &r.tpgid, &r.flags, &r.minflt, &r.cminflt, &r.majflt, &r.cmajflt,
  207 + &r.utime, &r.stime, &r.cutime, &r.cstime, &r.priority, &r.nice,
  208 + &r.num_threads, &r.itrealvalue, &r.starttime, &r.vsize, &r.rss,
  209 + &r.rsslim, &r.startcode, &r.endcode, &r.startstack, &r.kstkesp,
  210 + &r.kstkeip, &r.signal, &r.blocked, &r.sigignore, &r.sigcatch,
  211 + &r.wchan, &r.nswap, &r.cnswap, &r.exit_signal, &r.processor,
  212 + &r.rt_priority, &r.policy, &r.delayacct_blkio_ticks,
  213 + &r.guest_time, &r.cguest_time);
  214 +
  215 + fclose(f);
  216 +
  217 + if (ret >= 0) {
  218 + r.ok = true;
  219 + }
  220 +
  221 + return r.ok;
  222 +}
  223 +
  224 +void srs_update_proc_stat()
  225 +{
  226 + srs_update_system_time_ms();
  227 +
  228 + // system cpu stat
  229 + if (true) {
  230 + SrsProcSystemStat r;
  231 + if (!get_proc_system_stat(r)) {
  232 + return;
  233 + }
  234 +
  235 + r.sample_time = srs_get_system_time_ms();
  236 +
  237 + // calc usage in percent
  238 + SrsProcSystemStat& o = _srs_system_cpu_system_stat;
  239 +
  240 + // @see: http://blog.csdn.net/nineday/article/details/1928847
  241 + int64_t total = (r.user + r.nice + r.sys + r.idle + r.iowait + r.irq + r.softirq + r.steal + r.guest)
  242 + - (o.user + o.nice + o.sys + o.idle + o.iowait + o.irq + o.softirq + o.steal + o.guest);
  243 + int64_t idle = r.idle - o.idle;
  244 + if (total > 0) {
  245 + r.percent = (float)(1 - idle / (double)total);
  246 + }
  247 +
  248 + // upate cache.
  249 + _srs_system_cpu_system_stat = r;
  250 + }
  251 +
  252 + // self cpu stat
  253 + if (true) {
  254 + SrsProcSelfStat r;
  255 + if (!get_proc_self_stat(r)) {
  256 + return;
  257 + }
  258 +
  259 + srs_update_system_time_ms();
  260 + r.sample_time = srs_get_system_time_ms();
  261 +
  262 + // calc usage in percent
  263 + SrsProcSelfStat& o = _srs_system_cpu_self_stat;
  264 +
  265 + // @see: http://stackoverflow.com/questions/16011677/calculating-cpu-usage-using-proc-files
  266 + int64_t total = r.sample_time - o.sample_time;
  267 + int64_t usage = (r.utime + r.stime) - (o.utime + o.stime);
  268 + if (total > 0) {
  269 + r.percent = (float)(usage * 1000 / (double)total / 100);
  270 + }
  271 +
  272 + // upate cache.
  273 + _srs_system_cpu_self_stat = r;
  274 + }
  275 +}
  276 +
  277 +SrsMemInfo::SrsMemInfo()
  278 +{
  279 + ok = false;
  280 + sample_time = 0;
  281 +
  282 + percent_ram = 0;
  283 + percent_swap = 0;
  284 +
  285 + MemActive = 0;
  286 + RealInUse = 0;
  287 + NotInUse = 0;
  288 + MemTotal = 0;
  289 + MemFree = 0;
  290 + Buffers = 0;
  291 + Cached = 0;
  292 + SwapTotal = 0;
  293 + SwapFree = 0;
  294 +}
  295 +
  296 +static SrsMemInfo _srs_system_meminfo;
  297 +
  298 +SrsMemInfo* srs_get_meminfo()
  299 +{
  300 + return &_srs_system_meminfo;
  301 +}
  302 +
  303 +void srs_update_meminfo()
  304 +{
  305 + FILE* f = fopen("/proc/meminfo", "r");
  306 + if (f == NULL) {
  307 + srs_warn("open meminfo failed, ignore");
  308 + return;
  309 + }
  310 +
  311 + SrsMemInfo& r = _srs_system_meminfo;
  312 + r.ok = false;
  313 +
  314 + for (;;) {
  315 + static char label[64];
  316 + static unsigned long value;
  317 + static char postfix[64];
  318 + int ret = fscanf(f, "%64s %lu %64s\n", label, &value, postfix);
  319 +
  320 + if (ret == EOF) {
  321 + break;
  322 + }
  323 +
  324 + if (strcmp("MemTotal:", label) == 0) {
  325 + r.MemTotal = value;
  326 + } else if (strcmp("MemFree:", label) == 0) {
  327 + r.MemFree = value;
  328 + } else if (strcmp("Buffers:", label) == 0) {
  329 + r.Buffers = value;
  330 + } else if (strcmp("Cached:", label) == 0) {
  331 + r.Cached = value;
  332 + } else if (strcmp("SwapTotal:", label) == 0) {
  333 + r.SwapTotal = value;
  334 + } else if (strcmp("SwapFree:", label) == 0) {
  335 + r.SwapFree = value;
  336 + }
  337 + }
  338 +
  339 + fclose(f);
  340 +
  341 + r.sample_time = srs_get_system_time_ms();
  342 + r.MemActive = r.MemTotal - r.MemFree;
  343 + r.RealInUse = r.MemActive - r.Buffers - r.Cached;
  344 + r.NotInUse = r.MemTotal - r.RealInUse;
  345 +
  346 + r.ok = true;
  347 + if (r.MemTotal > 0) {
  348 + r.percent_ram = (float)(r.RealInUse / (double)r.MemTotal);
  349 + }
  350 + if (r.SwapTotal > 0) {
  351 + r.percent_swap = (float)((r.SwapTotal - r.SwapFree) / (double)r.SwapTotal);
  352 + }
  353 +}
  354 +
  355 +SrsCpuInfo::SrsCpuInfo()
  356 +{
  357 + ok = false;
  358 +
  359 + nb_processors = 0;
  360 + nb_processors_online = 0;
  361 +}
  362 +
  363 +SrsCpuInfo* srs_get_cpuinfo()
  364 +{
  365 + static SrsCpuInfo* cpu = NULL;
  366 + if (cpu != NULL) {
  367 + return cpu;
  368 + }
  369 +
  370 + // initialize cpu info.
  371 + cpu = new SrsCpuInfo();
  372 + cpu->ok = true;
  373 + cpu->nb_processors = sysconf(_SC_NPROCESSORS_CONF);
  374 + cpu->nb_processors_online = sysconf(_SC_NPROCESSORS_ONLN);
  375 +
  376 + return cpu;
  377 +}
  378 +
  379 +SrsPlatformInfo::SrsPlatformInfo()
  380 +{
  381 + ok = false;
  382 +
  383 + srs_startup_time = srs_get_system_time_ms();
  384 +
  385 + os_uptime = 0;
  386 + os_ilde_time = 0;
  387 +
  388 + load_one_minutes = 0;
  389 + load_five_minutes = 0;
  390 + load_fifteen_minutes = 0;
  391 +}
  392 +
  393 +static SrsPlatformInfo _srs_system_platform_info;
  394 +
  395 +SrsPlatformInfo* srs_get_platform_info()
  396 +{
  397 + return &_srs_system_platform_info;
  398 +}
  399 +
  400 +void srs_update_platform_info()
  401 +{
  402 + SrsPlatformInfo& r = _srs_system_platform_info;
  403 + r.ok = true;
  404 +
  405 + if (true) {
  406 + FILE* f = fopen("/proc/uptime", "r");
  407 + if (f == NULL) {
  408 + srs_warn("open uptime failed, ignore");
  409 + return;
  410 + }
  411 +
  412 + int ret = fscanf(f, "%lf %lf\n", &r.os_uptime, &r.os_ilde_time);
  413 +
  414 + fclose(f);
  415 +
  416 + if (ret < 0) {
  417 + r.ok = false;
  418 + }
  419 + }
  420 +
  421 + if (true) {
  422 + FILE* f = fopen("/proc/loadavg", "r");
  423 + if (f == NULL) {
  424 + srs_warn("open loadavg failed, ignore");
  425 + return;
  426 + }
  427 +
  428 + int ret = fscanf(f, "%lf %lf %lf\n",
  429 + &r.load_one_minutes, &r.load_five_minutes, &r.load_fifteen_minutes);
  430 +
  431 + fclose(f);
  432 +
  433 + if (ret < 0) {
  434 + r.ok = false;
  435 + }
  436 + }
  437 +}
@@ -30,10 +30,314 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -30,10 +30,314 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 30
31 #include <srs_core.hpp> 31 #include <srs_core.hpp>
32 32
  33 +#include <sys/resource.h>
  34 +
33 /** 35 /**
34 * convert level in string to log level in int. 36 * convert level in string to log level in int.
35 * @return the log level defined in SrsLogLevel. 37 * @return the log level defined in SrsLogLevel.
36 */ 38 */
37 extern int srs_get_log_level(std::string level); 39 extern int srs_get_log_level(std::string level);
38 40
  41 +// @see: man getrusage
  42 +struct SrsRusage
  43 +{
  44 + // whether the data is ok.
  45 + bool ok;
  46 + // the time in ms when sample.
  47 + int64_t sample_time;
  48 +
  49 + rusage r;
  50 +
  51 + SrsRusage();
  52 +};
  53 +
  54 +// get system rusage, use cache to avoid performance problem.
  55 +extern SrsRusage* srs_get_system_rusage();
  56 +// the deamon st-thread will update it.
  57 +extern void srs_update_system_rusage();
  58 +
  59 +// @see: man 5 proc, /proc/[pid]/stat
  60 +struct SrsProcSelfStat
  61 +{
  62 + // whether the data is ok.
  63 + bool ok;
  64 + // the time in ms when sample.
  65 + int64_t sample_time;
  66 + // the percent of usage. 0.153 is 15.3%.
  67 + float percent;
  68 +
  69 + // pid %d The process ID.
  70 + int pid;
  71 + // comm %s The filename of the executable, in parentheses. This is visible whether or not the executable is
  72 + // swapped out.
  73 + char comm[32];
  74 + // state %c One character from the string "RSDZTW" where R is running, S is sleeping in an interruptible wait, D
  75 + // is waiting in uninterruptible disk sleep, Z is zombie, T is traced or stopped (on a signal), and W is
  76 + // paging.
  77 + char state;
  78 + // ppid %d The PID of the parent.
  79 + int ppid;
  80 + // pgrp %d The process group ID of the process.
  81 + int pgrp;
  82 + // session %d The session ID of the process.
  83 + int session;
  84 + // tty_nr %d The controlling terminal of the process. (The minor device number is contained in the combination of
  85 + // bits 31 to 20 and 7 to 0; the major device number is in bits 15 t0 8.)
  86 + int tty_nr;
  87 + // tpgid %d The ID of the foreground process group of the controlling terminal of the process.
  88 + int tpgid;
  89 + // flags %u (%lu before Linux 2.6.22)
  90 + // The kernel flags word of the process. For bit meanings, see the PF_* defines in <linux/sched.h>.
  91 + // Details depend on the kernel version.
  92 + unsigned int flags;
  93 + // minflt %lu The number of minor faults the process has made which have not required loading a memory page from
  94 + // disk.
  95 + unsigned long minflt;
  96 + // cminflt %lu The number of minor faults that the process’s waited-for children have made.
  97 + unsigned long cminflt;
  98 + // majflt %lu The number of major faults the process has made which have required loading a memory page from disk.
  99 + unsigned long majflt;
  100 + // cmajflt %lu The number of major faults that the process’s waited-for children have made.
  101 + unsigned long cmajflt;
  102 + // utime %lu Amount of time that this process has been scheduled in user mode, measured in clock ticks (divide by
  103 + // sysconf(_SC_CLK_TCK). This includes guest time, guest_time (time spent running a virtual CPU, see
  104 + // below), so that applications that are not aware of the guest time field do not lose that time from
  105 + // their calculations.
  106 + unsigned long utime;
  107 + // stime %lu Amount of time that this process has been scheduled in kernel mode, measured in clock ticks (divide by
  108 + // sysconf(_SC_CLK_TCK).
  109 + unsigned long stime;
  110 + // cutime %ld Amount of time that this process’s waited-for children have been scheduled in user mode, measured in
  111 + // clock ticks (divide by sysconf(_SC_CLK_TCK). (See also times(2).) This includes guest time,
  112 + // cguest_time (time spent running a virtual CPU, see below).
  113 + long cutime;
  114 + // cstime %ld Amount of time that this process’s waited-for children have been scheduled in kernel mode, measured in
  115 + // clock ticks (divide by sysconf(_SC_CLK_TCK).
  116 + long cstime;
  117 + // priority %ld
  118 + // (Explanation for Linux 2.6) For processes running a real-time scheduling policy (policy below; see
  119 + // sched_setscheduler(2)), this is the negated scheduling priority, minus one; that is, a number in the
  120 + // range -2 to -100, corresponding to real-time priorities 1 to 99. For processes running under a non-
  121 + // real-time scheduling policy, this is the raw nice value (setpriority(2)) as represented in the kernel.
  122 + // The kernel stores nice values as numbers in the range 0 (high) to 39 (low), corresponding to the user-
  123 + // visible nice range of -20 to 19.
  124 + //
  125 + // Before Linux 2.6, this was a scaled value based on the scheduler weighting given to this process.
  126 + long priority;
  127 + // nice %ld The nice value (see setpriority(2)), a value in the range 19 (low priority) to -20 (high priority).
  128 + long nice;
  129 + // num_threads %ld
  130 + // Number of threads in this process (since Linux 2.6). Before kernel 2.6, this field was hard coded to
  131 + // 0 as a placeholder for an earlier removed field.
  132 + long num_threads;
  133 + // itrealvalue %ld
  134 + // The time in jiffies before the next SIGALRM is sent to the process due to an interval timer. Since
  135 + // kernel 2.6.17, this field is no longer maintained, and is hard coded as 0.
  136 + long itrealvalue;
  137 + // starttime %llu (was %lu before Linux 2.6)
  138 + // The time in jiffies the process started after system boot.
  139 + long long starttime;
  140 + // vsize %lu Virtual memory size in bytes.
  141 + unsigned long vsize;
  142 + // rss %ld Resident Set Size: number of pages the process has in real memory. This is just the pages which count
  143 + // towards text, data, or stack space. This does not include pages which have not been demand-loaded in,
  144 + // or which are swapped out.
  145 + long rss;
  146 + // rsslim %lu Current soft limit in bytes on the rss of the process; see the description of RLIMIT_RSS in getprior-
  147 + // ity(2).
  148 + unsigned long rsslim;
  149 + // startcode %lu
  150 + // The address above which program text can run.
  151 + unsigned long startcode;
  152 + // endcode %lu The address below which program text can run.
  153 + unsigned long endcode;
  154 + // startstack %lu
  155 + // The address of the start (i.e., bottom) of the stack.
  156 + unsigned long startstack;
  157 + // kstkesp %lu The current value of ESP (stack pointer), as found in the kernel stack page for the process.
  158 + unsigned long kstkesp;
  159 + // kstkeip %lu The current EIP (instruction pointer).
  160 + unsigned long kstkeip;
  161 + // signal %lu The bitmap of pending signals, displayed as a decimal number. Obsolete, because it does not provide
  162 + // information on real-time signals; use /proc/[pid]/status instead.
  163 + unsigned long signal;
  164 + // blocked %lu The bitmap of blocked signals, displayed as a decimal number. Obsolete, because it does not provide
  165 + // information on real-time signals; use /proc/[pid]/status instead.
  166 + unsigned long blocked;
  167 + // sigignore %lu
  168 + // The bitmap of ignored signals, displayed as a decimal number. Obsolete, because it does not provide
  169 + // information on real-time signals; use /proc/[pid]/status instead.
  170 + unsigned long sigignore;
  171 + // sigcatch %lu
  172 + // The bitmap of caught signals, displayed as a decimal number. Obsolete, because it does not provide
  173 + // information on real-time signals; use /proc/[pid]/status instead.
  174 + unsigned long sigcatch;
  175 + // wchan %lu This is the "channel" in which the process is waiting. It is the address of a system call, and can be
  176 + // looked up in a namelist if you need a textual name. (If you have an up-to-date /etc/psdatabase, then
  177 + // try ps -l to see the WCHAN field in action.)
  178 + unsigned long wchan;
  179 + // nswap %lu Number of pages swapped (not maintained).
  180 + unsigned long nswap;
  181 + // cnswap %lu Cumulative nswap for child processes (not maintained).
  182 + unsigned long cnswap;
  183 + // exit_signal %d (since Linux 2.1.22)
  184 + // Signal to be sent to parent when we die.
  185 + int exit_signal;
  186 + // processor %d (since Linux 2.2.8)
  187 + // CPU number last executed on.
  188 + int processor;
  189 + // rt_priority %u (since Linux 2.5.19; was %lu before Linux 2.6.22)
  190 + // Real-time scheduling priority, a number in the range 1 to 99 for processes scheduled under a real-time
  191 + // policy, or 0, for non-real-time processes (see sched_setscheduler(2)).
  192 + unsigned int rt_priority;
  193 + // policy %u (since Linux 2.5.19; was %lu before Linux 2.6.22)
  194 + // Scheduling policy (see sched_setscheduler(2)). Decode using the SCHED_* constants in linux/sched.h.
  195 + unsigned int policy;
  196 + // delayacct_blkio_ticks %llu (since Linux 2.6.18)
  197 + // Aggregated block I/O delays, measured in clock ticks (centiseconds).
  198 + unsigned long long delayacct_blkio_ticks;
  199 + // guest_time %lu (since Linux 2.6.24)
  200 + // Guest time of the process (time spent running a virtual CPU for a guest operating system), measured in
  201 + // clock ticks (divide by sysconf(_SC_CLK_TCK).
  202 + unsigned long guest_time;
  203 + // cguest_time %ld (since Linux 2.6.24)
  204 + // Guest time of the process’s children, measured in clock ticks (divide by sysconf(_SC_CLK_TCK).
  205 + long cguest_time;
  206 +
  207 + SrsProcSelfStat();
  208 +};
  209 +
  210 +// @see: man 5 proc, /proc/stat
  211 +struct SrsProcSystemStat
  212 +{
  213 + // whether the data is ok.
  214 + bool ok;
  215 + // the time in ms when sample.
  216 + int64_t sample_time;
  217 + // the percent of usage. 0.153 is 15.3%.
  218 + float percent;
  219 +
  220 + // always be cpu
  221 + char label[32];
  222 +
  223 + //The amount of time, measured in units of USER_HZ (1/100ths of a second on most architectures, use
  224 + // sysconf(_SC_CLK_TCK) to obtain the right value)
  225 + //
  226 + // the system spent in user mode,
  227 + unsigned long user;
  228 + // user mode with low priority (nice),
  229 + unsigned long nice;
  230 + // system mode,
  231 + unsigned long sys;
  232 + // and the idle task, respectively.
  233 + unsigned long idle;
  234 +
  235 + // In Linux 2.6 this line includes three additional columns:
  236 + //
  237 + // iowait - time waiting for I/O to complete (since 2.5.41);
  238 + unsigned long iowait;
  239 + // irq - time servicing interrupts (since 2.6.0-test4);
  240 + unsigned long irq;
  241 + // softirq - time servicing softirqs (since 2.6.0-test4).
  242 + unsigned long softirq;
  243 +
  244 + // Since Linux 2.6.11, there is an eighth column,
  245 + // steal - stolen time, which is the time spent in other oper-
  246 + // ating systems when running in a virtualized environment
  247 + unsigned long steal;
  248 +
  249 + // Since Linux 2.6.24, there is a ninth column,
  250 + // guest, which is the time spent running a virtual CPU for guest
  251 + // operating systems under the control of the Linux kernel.
  252 + unsigned long guest;
  253 +
  254 + SrsProcSystemStat();
  255 +};
  256 +
  257 +// get system cpu stat, use cache to avoid performance problem.
  258 +extern SrsProcSelfStat* srs_get_self_proc_stat();
  259 +// get system cpu stat, use cache to avoid performance problem.
  260 +extern SrsProcSystemStat* srs_get_system_proc_stat();
  261 +// the deamon st-thread will update it.
  262 +extern void srs_update_proc_stat();
  263 +
  264 +// @see: cat /proc/meminfo
  265 +struct SrsMemInfo
  266 +{
  267 + // whether the data is ok.
  268 + bool ok;
  269 + // the time in ms when sample.
  270 + int64_t sample_time;
  271 + // the percent of usage. 0.153 is 15.3%.
  272 + float percent_ram;
  273 + float percent_swap;
  274 +
  275 + // MemActive = MemTotal - MemFree
  276 + int64_t MemActive;
  277 + // RealInUse = MemActive - Buffers - Cached
  278 + int64_t RealInUse;
  279 + // NotInUse = MemTotal - RealInUse
  280 + // = MemTotal - MemActive + Buffers + Cached
  281 + // = MemTotal - MemTotal + MemFree + Buffers + Cached
  282 + // = MemFree + Buffers + Cached
  283 + int64_t NotInUse;
  284 +
  285 + int64_t MemTotal;
  286 + int64_t MemFree;
  287 + int64_t Buffers;
  288 + int64_t Cached;
  289 + int64_t SwapTotal;
  290 + int64_t SwapFree;
  291 +
  292 + SrsMemInfo();
  293 +};
  294 +
  295 +// get system meminfo, use cache to avoid performance problem.
  296 +extern SrsMemInfo* srs_get_meminfo();
  297 +// the deamon st-thread will update it.
  298 +extern void srs_update_meminfo();
  299 +
  300 +// @see: cat /proc/cpuinfo
  301 +struct SrsCpuInfo
  302 +{
  303 + // whether the data is ok.
  304 + bool ok;
  305 +
  306 + // The number of processors configured.
  307 + int nb_processors;
  308 + // The number of processors currently online (available).
  309 + int nb_processors_online;
  310 +
  311 + SrsCpuInfo();
  312 +};
  313 +
  314 +// get system cpu info, use cache to avoid performance problem.
  315 +extern SrsCpuInfo* srs_get_cpuinfo();
  316 +
  317 +// platform(os, srs) summary
  318 +struct SrsPlatformInfo
  319 +{
  320 + // whether the data is ok.
  321 + bool ok;
  322 +
  323 + // srs startup time, in ms.
  324 + int64_t srs_startup_time;
  325 +
  326 + // @see: cat /proc/uptime
  327 + double os_uptime;
  328 + double os_ilde_time;
  329 +
  330 + // @see: cat /proc/loadavg
  331 + double load_one_minutes;
  332 + double load_five_minutes;
  333 + double load_fifteen_minutes;
  334 +
  335 + SrsPlatformInfo();
  336 +};
  337 +
  338 +// get platform info, use cache to avoid performance problem.
  339 +extern SrsPlatformInfo* srs_get_platform_info();
  340 +// the deamon st-thread will update it.
  341 +extern void srs_update_platform_info();
  342 +
39 #endif 343 #endif
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR "0" 32 #define VERSION_MAJOR "0"
33 #define VERSION_MINOR "9" 33 #define VERSION_MINOR "9"
34 -#define VERSION_REVISION "98" 34 +#define VERSION_REVISION "99"
35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION 35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "srs" 37 #define RTMP_SIG_SRS_KEY "srs"
@@ -58,393 +58,3 @@ void srs_update_system_time_ms() @@ -58,393 +58,3 @@ void srs_update_system_time_ms()
58 58
59 _srs_system_time_us_cache = now_us; 59 _srs_system_time_us_cache = now_us;
60 } 60 }
61 -  
62 -static SrsRusage _srs_system_rusage;  
63 -  
64 -SrsRusage::SrsRusage()  
65 -{  
66 - ok = false;  
67 - sample_time = 0;  
68 - memset(&r, 0, sizeof(rusage));  
69 -}  
70 -  
71 -SrsRusage* srs_get_system_rusage()  
72 -{  
73 - return &_srs_system_rusage;  
74 -}  
75 -  
76 -void srs_update_system_rusage()  
77 -{  
78 - if (getrusage(RUSAGE_SELF, &_srs_system_rusage.r) < 0) {  
79 - srs_warn("getrusage failed, ignore");  
80 - return;  
81 - }  
82 -  
83 - srs_update_system_time_ms();  
84 - _srs_system_rusage.sample_time = srs_get_system_time_ms();  
85 -  
86 - _srs_system_rusage.ok = true;  
87 -}  
88 -  
89 -static SrsProcSelfStat _srs_system_cpu_self_stat;  
90 -static SrsProcSystemStat _srs_system_cpu_system_stat;  
91 -  
92 -SrsProcSelfStat::SrsProcSelfStat()  
93 -{  
94 - ok = false;  
95 - sample_time = 0;  
96 - percent = 0;  
97 -  
98 - pid = 0;  
99 - memset(comm, 0, sizeof(comm));  
100 - state = 0;  
101 - ppid = 0;  
102 - pgrp = 0;  
103 - session = 0;  
104 - tty_nr = 0;  
105 - tpgid = 0;  
106 - flags = 0;  
107 - minflt = 0;  
108 - cminflt = 0;  
109 - majflt = 0;  
110 - cmajflt = 0;  
111 - utime = 0;  
112 - stime = 0;  
113 - cutime = 0;  
114 - cstime = 0;  
115 - priority = 0;  
116 - nice = 0;  
117 - num_threads = 0;  
118 - itrealvalue = 0;  
119 - starttime = 0;  
120 - vsize = 0;  
121 - rss = 0;  
122 - rsslim = 0;  
123 - startcode = 0;  
124 - endcode = 0;  
125 - startstack = 0;  
126 - kstkesp = 0;  
127 - kstkeip = 0;  
128 - signal = 0;  
129 - blocked = 0;  
130 - sigignore = 0;  
131 - sigcatch = 0;  
132 - wchan = 0;  
133 - nswap = 0;  
134 - cnswap = 0;  
135 - exit_signal = 0;  
136 - processor = 0;  
137 - rt_priority = 0;  
138 - policy = 0;  
139 - delayacct_blkio_ticks = 0;  
140 - guest_time = 0;  
141 - cguest_time = 0;  
142 -}  
143 -  
144 -SrsProcSystemStat::SrsProcSystemStat()  
145 -{  
146 - ok = false;  
147 - sample_time = 0;  
148 - percent = 0;  
149 - memset(label, 0, sizeof(label));  
150 - user = 0;  
151 - nice = 0;  
152 - sys = 0;  
153 - idle = 0;  
154 - iowait = 0;  
155 - irq = 0;  
156 - softirq = 0;  
157 - steal = 0;  
158 - guest = 0;  
159 -}  
160 -  
161 -SrsProcSelfStat* srs_get_self_proc_stat()  
162 -{  
163 - return &_srs_system_cpu_self_stat;  
164 -}  
165 -  
166 -SrsProcSystemStat* srs_get_system_proc_stat()  
167 -{  
168 - return &_srs_system_cpu_system_stat;  
169 -}  
170 -  
171 -bool get_proc_system_stat(SrsProcSystemStat& r)  
172 -{  
173 - FILE* f = fopen("/proc/stat", "r");  
174 - if (f == NULL) {  
175 - srs_warn("open system cpu stat failed, ignore");  
176 - return false;  
177 - }  
178 -  
179 - for (;;) {  
180 - int ret = fscanf(f, "%4s %lu %lu %lu %lu %lu "  
181 - "%lu %lu %lu %lu\n",  
182 - r.label, &r.user, &r.nice, &r.sys, &r.idle, &r.iowait,  
183 - &r.irq, &r.softirq, &r.steal, &r.guest);  
184 - r.ok = false;  
185 -  
186 - if (ret == EOF) {  
187 - break;  
188 - }  
189 -  
190 - if (strcmp("cpu", r.label) == 0) {  
191 - r.ok = true;  
192 - break;  
193 - }  
194 - }  
195 -  
196 - fclose(f);  
197 -  
198 - return r.ok;  
199 -}  
200 -  
201 -bool get_proc_self_stat(SrsProcSelfStat& r)  
202 -{  
203 - FILE* f = fopen("/proc/self/stat", "r");  
204 - if (f == NULL) {  
205 - srs_warn("open self cpu stat failed, ignore");  
206 - return false;  
207 - }  
208 -  
209 - int ret = fscanf(f, "%d %32s %c %d %d %d %d "  
210 - "%d %u %lu %lu %lu %lu "  
211 - "%lu %lu %ld %ld %ld %ld "  
212 - "%ld %ld %llu %lu %ld "  
213 - "%lu %lu %lu %lu %lu "  
214 - "%lu %lu %lu %lu %lu "  
215 - "%lu %lu %lu %d %d "  
216 - "%u %u %llu "  
217 - "%lu %ld",  
218 - &r.pid, r.comm, &r.state, &r.ppid, &r.pgrp, &r.session, &r.tty_nr,  
219 - &r.tpgid, &r.flags, &r.minflt, &r.cminflt, &r.majflt, &r.cmajflt,  
220 - &r.utime, &r.stime, &r.cutime, &r.cstime, &r.priority, &r.nice,  
221 - &r.num_threads, &r.itrealvalue, &r.starttime, &r.vsize, &r.rss,  
222 - &r.rsslim, &r.startcode, &r.endcode, &r.startstack, &r.kstkesp,  
223 - &r.kstkeip, &r.signal, &r.blocked, &r.sigignore, &r.sigcatch,  
224 - &r.wchan, &r.nswap, &r.cnswap, &r.exit_signal, &r.processor,  
225 - &r.rt_priority, &r.policy, &r.delayacct_blkio_ticks,  
226 - &r.guest_time, &r.cguest_time);  
227 -  
228 - fclose(f);  
229 -  
230 - if (ret >= 0) {  
231 - r.ok = true;  
232 - }  
233 -  
234 - return r.ok;  
235 -}  
236 -  
237 -void srs_update_proc_stat()  
238 -{  
239 - srs_update_system_time_ms();  
240 -  
241 - // system cpu stat  
242 - if (true) {  
243 - SrsProcSystemStat r;  
244 - if (!get_proc_system_stat(r)) {  
245 - return;  
246 - }  
247 -  
248 - r.sample_time = srs_get_system_time_ms();  
249 -  
250 - // calc usage in percent  
251 - SrsProcSystemStat& o = _srs_system_cpu_system_stat;  
252 -  
253 - // @see: http://blog.csdn.net/nineday/article/details/1928847  
254 - int64_t total = (r.user + r.nice + r.sys + r.idle + r.iowait + r.irq + r.softirq + r.steal + r.guest)  
255 - - (o.user + o.nice + o.sys + o.idle + o.iowait + o.irq + o.softirq + o.steal + o.guest);  
256 - int64_t idle = r.idle - o.idle;  
257 - if (total > 0) {  
258 - r.percent = (float)(1 - idle / (double)total);  
259 - }  
260 -  
261 - // upate cache.  
262 - _srs_system_cpu_system_stat = r;  
263 - }  
264 -  
265 - // self cpu stat  
266 - if (true) {  
267 - SrsProcSelfStat r;  
268 - if (!get_proc_self_stat(r)) {  
269 - return;  
270 - }  
271 -  
272 - srs_update_system_time_ms();  
273 - r.sample_time = srs_get_system_time_ms();  
274 -  
275 - // calc usage in percent  
276 - SrsProcSelfStat& o = _srs_system_cpu_self_stat;  
277 -  
278 - // @see: http://stackoverflow.com/questions/16011677/calculating-cpu-usage-using-proc-files  
279 - int64_t total = r.sample_time - o.sample_time;  
280 - int64_t usage = (r.utime + r.stime) - (o.utime + o.stime);  
281 - if (total > 0) {  
282 - r.percent = (float)(usage * 1000 / (double)total / 100);  
283 - }  
284 -  
285 - // upate cache.  
286 - _srs_system_cpu_self_stat = r;  
287 - }  
288 -}  
289 -  
290 -SrsMemInfo::SrsMemInfo()  
291 -{  
292 - ok = false;  
293 - sample_time = 0;  
294 -  
295 - percent_ram = 0;  
296 - percent_swap = 0;  
297 -  
298 - MemActive = 0;  
299 - RealInUse = 0;  
300 - NotInUse = 0;  
301 - MemTotal = 0;  
302 - MemFree = 0;  
303 - Buffers = 0;  
304 - Cached = 0;  
305 - SwapTotal = 0;  
306 - SwapFree = 0;  
307 -}  
308 -  
309 -static SrsMemInfo _srs_system_meminfo;  
310 -  
311 -SrsMemInfo* srs_get_meminfo()  
312 -{  
313 - return &_srs_system_meminfo;  
314 -}  
315 -  
316 -void srs_update_meminfo()  
317 -{  
318 - FILE* f = fopen("/proc/meminfo", "r");  
319 - if (f == NULL) {  
320 - srs_warn("open meminfo failed, ignore");  
321 - return;  
322 - }  
323 -  
324 - SrsMemInfo& r = _srs_system_meminfo;  
325 - r.ok = false;  
326 -  
327 - for (;;) {  
328 - static char label[64];  
329 - static unsigned long value;  
330 - static char postfix[64];  
331 - int ret = fscanf(f, "%64s %lu %64s\n", label, &value, postfix);  
332 -  
333 - if (ret == EOF) {  
334 - break;  
335 - }  
336 -  
337 - if (strcmp("MemTotal:", label) == 0) {  
338 - r.MemTotal = value;  
339 - } else if (strcmp("MemFree:", label) == 0) {  
340 - r.MemFree = value;  
341 - } else if (strcmp("Buffers:", label) == 0) {  
342 - r.Buffers = value;  
343 - } else if (strcmp("Cached:", label) == 0) {  
344 - r.Cached = value;  
345 - } else if (strcmp("SwapTotal:", label) == 0) {  
346 - r.SwapTotal = value;  
347 - } else if (strcmp("SwapFree:", label) == 0) {  
348 - r.SwapFree = value;  
349 - }  
350 - }  
351 -  
352 - fclose(f);  
353 -  
354 - r.sample_time = srs_get_system_time_ms();  
355 - r.MemActive = r.MemTotal - r.MemFree;  
356 - r.RealInUse = r.MemActive - r.Buffers - r.Cached;  
357 - r.NotInUse = r.MemTotal - r.RealInUse;  
358 -  
359 - r.ok = true;  
360 - if (r.MemTotal > 0) {  
361 - r.percent_ram = (float)(r.RealInUse / (double)r.MemTotal);  
362 - }  
363 - if (r.SwapTotal > 0) {  
364 - r.percent_swap = (float)((r.SwapTotal - r.SwapFree) / (double)r.SwapTotal);  
365 - }  
366 -}  
367 -  
368 -SrsCpuInfo::SrsCpuInfo()  
369 -{  
370 - ok = false;  
371 -  
372 - nb_processors = 0;  
373 - nb_processors_online = 0;  
374 -}  
375 -  
376 -SrsCpuInfo* srs_get_cpuinfo()  
377 -{  
378 - static SrsCpuInfo* cpu = NULL;  
379 - if (cpu != NULL) {  
380 - return cpu;  
381 - }  
382 -  
383 - // initialize cpu info.  
384 - cpu = new SrsCpuInfo();  
385 - cpu->ok = true;  
386 - cpu->nb_processors = sysconf(_SC_NPROCESSORS_CONF);  
387 - cpu->nb_processors_online = sysconf(_SC_NPROCESSORS_ONLN);  
388 -  
389 - return cpu;  
390 -}  
391 -  
392 -SrsPlatformInfo::SrsPlatformInfo()  
393 -{  
394 - ok = false;  
395 -  
396 - srs_startup_time = srs_get_system_time_ms();  
397 -  
398 - os_uptime = 0;  
399 - os_ilde_time = 0;  
400 -  
401 - load_one_minutes = 0;  
402 - load_five_minutes = 0;  
403 - load_fifteen_minutes = 0;  
404 -}  
405 -  
406 -static SrsPlatformInfo _srs_system_platform_info;  
407 -  
408 -SrsPlatformInfo* srs_get_platform_info()  
409 -{  
410 - return &_srs_system_platform_info;  
411 -}  
412 -  
413 -void srs_update_platform_info()  
414 -{  
415 - SrsPlatformInfo& r = _srs_system_platform_info;  
416 - r.ok = true;  
417 -  
418 - if (true) {  
419 - FILE* f = fopen("/proc/uptime", "r");  
420 - if (f == NULL) {  
421 - srs_warn("open uptime failed, ignore");  
422 - return;  
423 - }  
424 -  
425 - int ret = fscanf(f, "%lf %lf\n", &r.os_uptime, &r.os_ilde_time);  
426 -  
427 - fclose(f);  
428 -  
429 - if (ret < 0) {  
430 - r.ok = false;  
431 - }  
432 - }  
433 -  
434 - if (true) {  
435 - FILE* f = fopen("/proc/loadavg", "r");  
436 - if (f == NULL) {  
437 - srs_warn("open loadavg failed, ignore");  
438 - return;  
439 - }  
440 -  
441 - int ret = fscanf(f, "%lf %lf %lf\n",  
442 - &r.load_one_minutes, &r.load_five_minutes, &r.load_fifteen_minutes);  
443 -  
444 - fclose(f);  
445 -  
446 - if (ret < 0) {  
447 - r.ok = false;  
448 - }  
449 - }  
450 -}  
@@ -30,313 +30,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -30,313 +30,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 30
31 #include <srs_core.hpp> 31 #include <srs_core.hpp>
32 32
33 -#include <sys/resource.h>  
34 -  
35 // get current system time in ms, use cache to avoid performance problem 33 // get current system time in ms, use cache to avoid performance problem
36 extern int64_t srs_get_system_time_ms(); 34 extern int64_t srs_get_system_time_ms();
37 // the deamon st-thread will update it. 35 // the deamon st-thread will update it.
38 extern void srs_update_system_time_ms(); 36 extern void srs_update_system_time_ms();
39 37
40 -// @see: man getrusage  
41 -struct SrsRusage  
42 -{  
43 - // whether the data is ok.  
44 - bool ok;  
45 - // the time in ms when sample.  
46 - int64_t sample_time;  
47 -  
48 - rusage r;  
49 -  
50 - SrsRusage();  
51 -};  
52 -  
53 -// get system rusage, use cache to avoid performance problem.  
54 -extern SrsRusage* srs_get_system_rusage();  
55 -// the deamon st-thread will update it.  
56 -extern void srs_update_system_rusage();  
57 -  
58 -// @see: man 5 proc, /proc/[pid]/stat  
59 -struct SrsProcSelfStat  
60 -{  
61 - // whether the data is 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;  
67 -  
68 - // pid %d The process ID.  
69 - int pid;  
70 - // comm %s The filename of the executable, in parentheses. This is visible whether or not the executable is  
71 - // swapped out.  
72 - char comm[32];  
73 - // state %c One character from the string "RSDZTW" where R is running, S is sleeping in an interruptible wait, D  
74 - // is waiting in uninterruptible disk sleep, Z is zombie, T is traced or stopped (on a signal), and W is  
75 - // paging.  
76 - char state;  
77 - // ppid %d The PID of the parent.  
78 - int ppid;  
79 - // pgrp %d The process group ID of the process.  
80 - int pgrp;  
81 - // session %d The session ID of the process.  
82 - int session;  
83 - // tty_nr %d The controlling terminal of the process. (The minor device number is contained in the combination of  
84 - // bits 31 to 20 and 7 to 0; the major device number is in bits 15 t0 8.)  
85 - int tty_nr;  
86 - // tpgid %d The ID of the foreground process group of the controlling terminal of the process.  
87 - int tpgid;  
88 - // flags %u (%lu before Linux 2.6.22)  
89 - // The kernel flags word of the process. For bit meanings, see the PF_* defines in <linux/sched.h>.  
90 - // Details depend on the kernel version.  
91 - unsigned int flags;  
92 - // minflt %lu The number of minor faults the process has made which have not required loading a memory page from  
93 - // disk.  
94 - unsigned long minflt;  
95 - // cminflt %lu The number of minor faults that the process’s waited-for children have made.  
96 - unsigned long cminflt;  
97 - // majflt %lu The number of major faults the process has made which have required loading a memory page from disk.  
98 - unsigned long majflt;  
99 - // cmajflt %lu The number of major faults that the process’s waited-for children have made.  
100 - unsigned long cmajflt;  
101 - // utime %lu Amount of time that this process has been scheduled in user mode, measured in clock ticks (divide by  
102 - // sysconf(_SC_CLK_TCK). This includes guest time, guest_time (time spent running a virtual CPU, see  
103 - // below), so that applications that are not aware of the guest time field do not lose that time from  
104 - // their calculations.  
105 - unsigned long utime;  
106 - // stime %lu Amount of time that this process has been scheduled in kernel mode, measured in clock ticks (divide by  
107 - // sysconf(_SC_CLK_TCK).  
108 - unsigned long stime;  
109 - // cutime %ld Amount of time that this process’s waited-for children have been scheduled in user mode, measured in  
110 - // clock ticks (divide by sysconf(_SC_CLK_TCK). (See also times(2).) This includes guest time,  
111 - // cguest_time (time spent running a virtual CPU, see below).  
112 - long cutime;  
113 - // cstime %ld Amount of time that this process’s waited-for children have been scheduled in kernel mode, measured in  
114 - // clock ticks (divide by sysconf(_SC_CLK_TCK).  
115 - long cstime;  
116 - // priority %ld  
117 - // (Explanation for Linux 2.6) For processes running a real-time scheduling policy (policy below; see  
118 - // sched_setscheduler(2)), this is the negated scheduling priority, minus one; that is, a number in the  
119 - // range -2 to -100, corresponding to real-time priorities 1 to 99. For processes running under a non-  
120 - // real-time scheduling policy, this is the raw nice value (setpriority(2)) as represented in the kernel.  
121 - // The kernel stores nice values as numbers in the range 0 (high) to 39 (low), corresponding to the user-  
122 - // visible nice range of -20 to 19.  
123 - //  
124 - // Before Linux 2.6, this was a scaled value based on the scheduler weighting given to this process.  
125 - long priority;  
126 - // nice %ld The nice value (see setpriority(2)), a value in the range 19 (low priority) to -20 (high priority).  
127 - long nice;  
128 - // num_threads %ld  
129 - // Number of threads in this process (since Linux 2.6). Before kernel 2.6, this field was hard coded to  
130 - // 0 as a placeholder for an earlier removed field.  
131 - long num_threads;  
132 - // itrealvalue %ld  
133 - // The time in jiffies before the next SIGALRM is sent to the process due to an interval timer. Since  
134 - // kernel 2.6.17, this field is no longer maintained, and is hard coded as 0.  
135 - long itrealvalue;  
136 - // starttime %llu (was %lu before Linux 2.6)  
137 - // The time in jiffies the process started after system boot.  
138 - long long starttime;  
139 - // vsize %lu Virtual memory size in bytes.  
140 - unsigned long vsize;  
141 - // rss %ld Resident Set Size: number of pages the process has in real memory. This is just the pages which count  
142 - // towards text, data, or stack space. This does not include pages which have not been demand-loaded in,  
143 - // or which are swapped out.  
144 - long rss;  
145 - // rsslim %lu Current soft limit in bytes on the rss of the process; see the description of RLIMIT_RSS in getprior-  
146 - // ity(2).  
147 - unsigned long rsslim;  
148 - // startcode %lu  
149 - // The address above which program text can run.  
150 - unsigned long startcode;  
151 - // endcode %lu The address below which program text can run.  
152 - unsigned long endcode;  
153 - // startstack %lu  
154 - // The address of the start (i.e., bottom) of the stack.  
155 - unsigned long startstack;  
156 - // kstkesp %lu The current value of ESP (stack pointer), as found in the kernel stack page for the process.  
157 - unsigned long kstkesp;  
158 - // kstkeip %lu The current EIP (instruction pointer).  
159 - unsigned long kstkeip;  
160 - // signal %lu The bitmap of pending signals, displayed as a decimal number. Obsolete, because it does not provide  
161 - // information on real-time signals; use /proc/[pid]/status instead.  
162 - unsigned long signal;  
163 - // blocked %lu The bitmap of blocked signals, displayed as a decimal number. Obsolete, because it does not provide  
164 - // information on real-time signals; use /proc/[pid]/status instead.  
165 - unsigned long blocked;  
166 - // sigignore %lu  
167 - // The bitmap of ignored signals, displayed as a decimal number. Obsolete, because it does not provide  
168 - // information on real-time signals; use /proc/[pid]/status instead.  
169 - unsigned long sigignore;  
170 - // sigcatch %lu  
171 - // The bitmap of caught signals, displayed as a decimal number. Obsolete, because it does not provide  
172 - // information on real-time signals; use /proc/[pid]/status instead.  
173 - unsigned long sigcatch;  
174 - // wchan %lu This is the "channel" in which the process is waiting. It is the address of a system call, and can be  
175 - // looked up in a namelist if you need a textual name. (If you have an up-to-date /etc/psdatabase, then  
176 - // try ps -l to see the WCHAN field in action.)  
177 - unsigned long wchan;  
178 - // nswap %lu Number of pages swapped (not maintained).  
179 - unsigned long nswap;  
180 - // cnswap %lu Cumulative nswap for child processes (not maintained).  
181 - unsigned long cnswap;  
182 - // exit_signal %d (since Linux 2.1.22)  
183 - // Signal to be sent to parent when we die.  
184 - int exit_signal;  
185 - // processor %d (since Linux 2.2.8)  
186 - // CPU number last executed on.  
187 - int processor;  
188 - // rt_priority %u (since Linux 2.5.19; was %lu before Linux 2.6.22)  
189 - // Real-time scheduling priority, a number in the range 1 to 99 for processes scheduled under a real-time  
190 - // policy, or 0, for non-real-time processes (see sched_setscheduler(2)).  
191 - unsigned int rt_priority;  
192 - // policy %u (since Linux 2.5.19; was %lu before Linux 2.6.22)  
193 - // Scheduling policy (see sched_setscheduler(2)). Decode using the SCHED_* constants in linux/sched.h.  
194 - unsigned int policy;  
195 - // delayacct_blkio_ticks %llu (since Linux 2.6.18)  
196 - // Aggregated block I/O delays, measured in clock ticks (centiseconds).  
197 - unsigned long long delayacct_blkio_ticks;  
198 - // guest_time %lu (since Linux 2.6.24)  
199 - // Guest time of the process (time spent running a virtual CPU for a guest operating system), measured in  
200 - // clock ticks (divide by sysconf(_SC_CLK_TCK).  
201 - unsigned long guest_time;  
202 - // cguest_time %ld (since Linux 2.6.24)  
203 - // Guest time of the process’s children, measured in clock ticks (divide by sysconf(_SC_CLK_TCK).  
204 - long cguest_time;  
205 -  
206 - SrsProcSelfStat();  
207 -};  
208 -  
209 -// @see: man 5 proc, /proc/stat  
210 -struct SrsProcSystemStat  
211 -{  
212 - // whether the data is 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;  
218 -  
219 - // always be cpu  
220 - char label[32];  
221 -  
222 - //The amount of time, measured in units of USER_HZ (1/100ths of a second on most architectures, use  
223 - // sysconf(_SC_CLK_TCK) to obtain the right value)  
224 - //  
225 - // the system spent in user mode,  
226 - unsigned long user;  
227 - // user mode with low priority (nice),  
228 - unsigned long nice;  
229 - // system mode,  
230 - unsigned long sys;  
231 - // and the idle task, respectively.  
232 - unsigned long idle;  
233 -  
234 - // In Linux 2.6 this line includes three additional columns:  
235 - //  
236 - // iowait - time waiting for I/O to complete (since 2.5.41);  
237 - unsigned long iowait;  
238 - // irq - time servicing interrupts (since 2.6.0-test4);  
239 - unsigned long irq;  
240 - // softirq - time servicing softirqs (since 2.6.0-test4).  
241 - unsigned long softirq;  
242 -  
243 - // Since Linux 2.6.11, there is an eighth column,  
244 - // steal - stolen time, which is the time spent in other oper-  
245 - // ating systems when running in a virtualized environment  
246 - unsigned long steal;  
247 -  
248 - // Since Linux 2.6.24, there is a ninth column,  
249 - // guest, which is the time spent running a virtual CPU for guest  
250 - // operating systems under the control of the Linux kernel.  
251 - unsigned long guest;  
252 -  
253 - SrsProcSystemStat();  
254 -};  
255 -  
256 -// get system cpu stat, use cache to avoid performance problem.  
257 -extern SrsProcSelfStat* srs_get_self_proc_stat();  
258 -// get system cpu stat, use cache to avoid performance problem.  
259 -extern SrsProcSystemStat* srs_get_system_proc_stat();  
260 -// the deamon st-thread will update it.  
261 -extern void srs_update_proc_stat();  
262 -  
263 -// @see: cat /proc/meminfo  
264 -struct SrsMemInfo  
265 -{  
266 - // whether the data is ok.  
267 - bool ok;  
268 - // the time in ms when sample.  
269 - int64_t sample_time;  
270 - // the percent of usage. 0.153 is 15.3%.  
271 - float percent_ram;  
272 - float percent_swap;  
273 -  
274 - // MemActive = MemTotal - MemFree  
275 - int64_t MemActive;  
276 - // RealInUse = MemActive - Buffers - Cached  
277 - int64_t RealInUse;  
278 - // NotInUse = MemTotal - RealInUse  
279 - // = MemTotal - MemActive + Buffers + Cached  
280 - // = MemTotal - MemTotal + MemFree + Buffers + Cached  
281 - // = MemFree + Buffers + Cached  
282 - int64_t NotInUse;  
283 -  
284 - int64_t MemTotal;  
285 - int64_t MemFree;  
286 - int64_t Buffers;  
287 - int64_t Cached;  
288 - int64_t SwapTotal;  
289 - int64_t SwapFree;  
290 -  
291 - SrsMemInfo();  
292 -};  
293 -  
294 -// get system meminfo, use cache to avoid performance problem.  
295 -extern SrsMemInfo* srs_get_meminfo();  
296 -// the deamon st-thread will update it.  
297 -extern void srs_update_meminfo();  
298 -  
299 -// @see: cat /proc/cpuinfo  
300 -struct SrsCpuInfo  
301 -{  
302 - // whether the data is ok.  
303 - bool ok;  
304 -  
305 - // The number of processors configured.  
306 - int nb_processors;  
307 - // The number of processors currently online (available).  
308 - int nb_processors_online;  
309 -  
310 - SrsCpuInfo();  
311 -};  
312 -  
313 -// get system cpu info, use cache to avoid performance problem.  
314 -extern SrsCpuInfo* srs_get_cpuinfo();  
315 -  
316 -// platform(os, srs) summary  
317 -struct SrsPlatformInfo  
318 -{  
319 - // whether the data is ok.  
320 - bool ok;  
321 -  
322 - // srs startup time, in ms.  
323 - int64_t srs_startup_time;  
324 -  
325 - // @see: cat /proc/uptime  
326 - double os_uptime;  
327 - double os_ilde_time;  
328 -  
329 - // @see: cat /proc/loadavg  
330 - double load_one_minutes;  
331 - double load_five_minutes;  
332 - double load_fifteen_minutes;  
333 -  
334 - SrsPlatformInfo();  
335 -};  
336 -  
337 -// get platform info, use cache to avoid performance problem.  
338 -extern SrsPlatformInfo* srs_get_platform_info();  
339 -// the deamon st-thread will update it.  
340 -extern void srs_update_platform_info();  
341 -  
342 #endif 38 #endif