Как вычисляется длина очереди выполнения в файловой системе 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() функция обеспечивает общее количество как запущенных в данный момент задач, так и задач, готовых к запуску на процессоре; это мгновенная мера. Я считаю, что это будет соответствовать sarrunq-sz переменная.

Грэхем

Другие вопросы по тегам