我正在尝试从 linux 内核获取可运行进程的数量。sar -q 很容易提供此信息。但是我试图从 /proc 文件系统中获取这个值。/proc中没有文件直接给出这个值,那么runq-sz是如何计算的。wiki 页面http://en.wikipedia.org/wiki/Load_(computing)提供了一些关于如何根据 ldavg 值计算运行队列长度的见解,但尚不清楚。有人可以提供更多关于此的指示。干杯
问问题
3511 次
2 回答
3
这是 sysstat 守护进程中的函数,它提供信息 sar 打印出来:
https://github.com/sysstat/sysstat/blob/master/rd_stats.c#L392
if ((fp = fopen(LOADAVG, "r")) == NULL)
return;
/* Read load averages and queue length */
fscanf(fp, "%d.%d %d.%d %d.%d %ld/%d %*d\n",
&load_tmp[0], &st_queue->load_avg_1,
&load_tmp[1], &st_queue->load_avg_5,
&load_tmp[2], &st_queue->load_avg_15,
&st_queue->nr_running,
&st_queue->nr_threads);
它从 中读取/proc/loadavg
,由该核函数填充
http://lxr.free-electrons.com/source/fs/proc/loadavg.c#L13
static int loadavg_proc_show(struct seq_file *m, void *v)
{
unsigned long avnrun[3];
get_avenrun(avnrun, FIXED_1/200, 0);
seq_printf(m, "%lu.%02lu %lu.%02lu %lu.%02lu %ld/%d %d\n",
LOAD_INT(avnrun[0]), LOAD_FRAC(avnrun[0]),
LOAD_INT(avnrun[1]), LOAD_FRAC(avnrun[1]),
LOAD_INT(avnrun[2]), LOAD_FRAC(avnrun[2]),
nr_running(), nr_threads,
task_active_pid_ns(current)->last_pid);
return 0;
}
该nr_running()
函数提供当前正在运行的任务和准备在 CPU 上运行的任务的总数;这是一个即时的措施。我相信这将与sar
runq-sz
变量一致。
格雷厄姆
于 2013-10-11T18:47:39.950 回答
3
正如 gcla 所说,你猫使用
cat /proc/loadavg
从内核读取 loadvarage - 但严格来说,它不是队列长度。
看一眼
grep procs_running /proc/stat
和
grep procs_blocked /proc/stat
首先是实际运行队列,其次是磁盘 IO 上阻塞的进程数。平均负载是两者之和的函数。
于 2013-10-11T20:21:14.227 回答