如何在linux proc文件系统中计算运行队列长度

时间:2013-08-16 12:32:07

标签: linux procfs sar

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

2 个答案:

答案 0 :(得分:1)

这是sysstat守护进程中的函数,它提供了info打印输出:

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变量对齐。

格雷厄姆

答案 1 :(得分:1)

正如gcla所说你用猫

cat /proc/loadavg

从内核读取loadavarage - 但严格地说,它不是队列长度。

看看

grep procs_running /proc/stat

grep procs_blocked /proc/stat

首先是实际运行的队列,第二个是磁盘IO上阻塞的进程数。负载平均值是两者之和的函数。