Как вычисляется длина очереди выполнения в файловой системе proc linux
Я пытаюсь получить количество запускаемых процессов из ядра Linux. sar -q дает эту информацию с готовностью. Однако я пытаюсь получить это значение из файловой системы / proc. В / proc нет файла, который бы непосредственно давал это значение, тогда как вычисляется runq-sz. Страница вики http://en.wikipedia.org/wiki/Load_(computing) дает некоторое представление о том, как длина очереди выполнения вычисляется на основе значений ldavg, но неясно. Может ли кто-то предоставить больше указателей на это. ура
2 ответа
Как сказал Gcla, вы используете кошку
cat /proc/loadavg
читать loadavarage from из ядра - но, строго говоря, это не длина очереди.
Взгляни на
grep procs_running /proc/stat
а также
grep procs_blocked /proc/stat
Первая - это текущая текущая очередь, а вторая - количество процессов, заблокированных на диске ввода-вывода. Средняя нагрузка является функцией от суммы обоих.
Вот функция в демоне 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()
функция обеспечивает общее количество как запущенных в данный момент задач, так и задач, готовых к запуску на процессоре; это мгновенная мера. Я считаю, что это будет соответствовать sar
runq-sz
переменная.
Грэхем