2

我正在尝试从 linux 内核获取可运行进程的数量。sar -q 很容易提供此信息。但是我试图从 /proc 文件系统中获取这个值。/proc中没有文件直接给出这个值,那么runq-sz是如何计算的。wiki 页面http://en.wikipedia.org/wiki/Load_(computing)提供了一些关于如何根据 ldavg 值计算运行队列长度的见解,但尚不清楚。有人可以提供更多关于此的指示。干杯

4

2 回答 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 回答