Это вопрос, который задавался много раз, однако я не нашел ни одного надежного ответа.
Многие люди предлагают использовать команду top, но если вы запускаете top один раз (поскольку у вас есть скрипт, например, собирающий использование процессора каждую 1 секунду), он всегда будет давать один и тот же результат использования процессора (пример 1, пример 2).
Более точный способ вычислить загрузку ЦП - прочитать значения из /proc/stat
, но большинство ответов используют только первые 4 поля из /proc/stat
для его вычисления (один из примеров здесь).
/proc/stat/
имеет 10 полей на ядро процессора начиная с ядра Linux 2.6.33!
Я также нашел этот Точный расчет использования ЦП в Linux, используя вопрос /proc/stat, который указывает на ту же проблему, -that, большинство других вопросов принимают во внимание только 4 из многих fields-, но все же ответ, данный здесь, начинается с "Я думаю" (не уверен), и, кроме этого, он касается только первых 7 полей (из 10 в /proc/stat/
)
Этот Perl-скрипт использует все поля для вычисления загрузки процессора, что, опять же, я не считаю правильным после некоторого дальнейшего исследования.
После беглого просмотра в код ядра здесь, это выглядит, например, guest_nice
и guest fields
всегда растут вместе с nice
и user
(поэтому они не должны быть включены в расчете использования центрального процессора, так как они включены в nice
и user
поля уже)
/*
* Account guest cpu time to a process.
* @p: the process that the cpu time gets accounted to
* @cputime: the cpu time spent in virtual machine since the last update
* @cputime_scaled: cputime scaled by cpu frequency
*/
static void account_guest_time(struct task_struct *p, cputime_t cputime,
cputime_t cputime_scaled)
{
u64 *cpustat = kcpustat_this_cpu->cpustat;
/* Add guest time to process. */
p->utime += cputime;
p->utimescaled += cputime_scaled;
account_group_user_time(p, cputime);
p->gtime += cputime;
/* Add guest time to cpustat. */
if (task_nice(p) > 0) {
cpustat[CPUTIME_NICE] += (__force u64) cputime;
cpustat[CPUTIME_GUEST_NICE] += (__force u64) cputime;
} else {
cpustat[CPUTIME_USER] += (__force u64) cputime;
cpustat[CPUTIME_GUEST] += (__force u64) cputime;
}
}
Итак, чтобы подвести итог, каков точный способ расчета загрузки ЦП в Linux и какие поля следует учитывать в вычислениях и как (какие поля относятся к времени простоя, а какие к времени простоя)?