Назад | Перейти на главную страницу

Почему пользовательский и системный процессор в cpuacct.stat не суммируются с cpuacct.usage?

Вопрос относится к учету cpu cgroups Linux.

Я заметил это на уровне контейнера, но это сохраняется до верхнего уровня. Например:

# cat /sys/fs/cgroup/cpu/cpuacct.stat /sys/fs/cgroup/cpu/cpuacct.usage
user 34618
system 18038
743932863030

Единицами для первого являются сотые доли секунды, а для второго - наносекунды, то есть 346,18, 180,38 и 743,932863030.

У меня вопрос: почему первые два не совпадают со вторым?

Вы можете подумать: «А, они начинаются из другого источника», поэтому через несколько минут будут те же показатели:

# cat /sys/fs/cgroup/cpu/cpuacct.stat /sys/fs/cgroup/cpu/cpuacct.usage
user 40028
system 22098
818501029494

Дельты - 54,1, 40,6 и 74,57.

Я не разработчик ядра, но, копаясь в исходном коде ядра, cpuacct.usage (обновляется через cgroup_account_cputime) и cpuacct.stat (обновляется через cgroup_account_cputime_field похоже, рассчитываются разными компонентами ядра.

Насколько я понимаю, вывод cpu.stat, похоже, сильно зависит от конфигурации ядра, в частности CONFIG_VIRT_CPU_ACCOUNTING_GEN, CONFIG_VIRT_CPU_ACCOUNTING_NATIVE и CONFIG_VIRT_CPU_ACCOUNTING. По их описаниям они кажутся более точными. Соответствующий файл ядро / расписание / cputime.c, где обновления времени, похоже, вызваны некоторыми событиями ядра (irqs и т. д.)

Выход cpuacct.usage, кажется, рассчитывается планировщиком при переключении между задачами. Например update_curr, который вызывает cgroup_account_cputime вызывается из enqueue_entity и dequeue_entity, которые, кажется, планируют задачи. На это не похоже, что это влияет на конфигурацию.