Ejecutando algunas pruebas rudimentarias, también veo esto en 10.13.4.
Escribí un pequeño programa en C llamado looper que hacía algunas operaciones matemáticas básicas en un bucle infinito:
#include <stdio.h>
int main(){
unsigned long long prev = 0;
unsigned long long current = 1;
unsigned long long total = 0;
while(1){
total = current + prev;
prev = current;
current = total;
printf("%llu\n", total);
}
}
Ejecuté varias copias de esto en mi caja de FreeBSD y las examiné usando htop(1)
. Usando renice(8)
pude ver que el valor de Niza se incrementaba, el valor de Prioridad se incrementaba y el porcentaje de CPU disminuía -el comportamiento esperado.
Ejecuté el mismo programa en macOS 10.13.4 y repetí el proceso. Si bien pude ver que el valor de Niza aumentaba, el valor de Prioridad y el porcentaje de CPU se mantuvieron constantes.
Me pregunto si es un error, no he tenido motivos para mirar tan de cerca los valores de Niza en macOS antes -el comportamiento ha sido lo suficientemente cercano a lo que esperaba que no me he inclinado a investigar.
Si tiene una cuenta de desarrollador, valdría la pena informar esto a Apple.
Мой первый ответ на этот вопрос заключался в том, что «давление ввода-вывода» тесно связано с понятием «время ожидания ввода-вывода ЦП». И время ожидания процессорного ввода-вывода, которое я наблюдал, также показалось мне слишком низким. Поэтому я не должен надеяться, что «давление IO» будет иметь больше смысла.
Тем не менее, теперь у меня по крайней мере есть обходной путь для проблемы с временем ожидания ЦП . То есть загрузка с nohz=off
дает ожидаемое время iowait. В качестве альтернативы я могу добиться того же эффекта, принудительно опрашивая процессор вместо бездействия -. Это также гарантирует, что тик планировщика никогда не остановится :
cd /sys/devices/system/cpu
# Disable all cpuidle states, including C1 ("halt"), but not POLL
for i in cpu*/cpuidle/state[1-9]*/disable; do echo 1 | sudo tee $i; done
# Reset to default (C-states enabled)
for i in cpu*/cpuidle/state*/disable; do echo 0 | sudo tee $i; done
Загрузка с nohz=off
также увеличивает значения «давления ввода-вывода». Меня пока не убеждают новые ценности. Они кажутся ближе к тому, что я ожидал...
Хотя, если я правильно понял код,для nohz=off
не имеет смысла увеличивать давление ввода-вывода таким же образом, как и iowait! По крайней мере, исходный патч для информации о срывах давления кажется полностью управляемым событиями. Я не вижу этого, полагаясь на галочку планировщика!
Следующие atop
строки были взяты во время работыdd if=test iflag=direct bs=1M of=/dev/null
(не менее шестидесяти секунд):
CPU | sys 2% | user 1% | irq 1% | idle 300% | wait 96%
cpu | sys 1% | user 0% | irq 0% | idle 89% | cpu003 w 10%
cpu | sys 1% | user 0% | irq 0% | idle 23% | cpu001 w 76%
cpu | sys 0% | user 0% | irq 0% | idle 98% | cpu000 w 1%
cpu | sys 0% | user 0% | irq 0% | idle 90% | cpu002 w 9%
CPL | avg1 0.76 | avg5 0.92 | avg15 0.84 | | numcpu 4
PSI | cs 0/0/0 | ms 0/0/0 | mf 0/0/0 | is 83/57/44 | if 83/57/44
ms
равно 0. Таким образом, невозможно, чтобы мы считали какое-то (не -пренебрежимо малое )время iowait как «остановку в борьбе за память» вместо «остановку в ожидании ввода-вывода». (Я не уверен, как это работает в более широком смысле ). psi keeps track of the task states associated with each CPU and samples the time they spend in stall states. Every 2 seconds, the samples are averaged across CPUs - weighted by the CPUs' non-idle time to eliminate artifacts from unused CPUs - and translated into percentages of walltime.
-- [PATCH 08/10] psi: pressure stall information for CPU, memory, and IO
. cpu1 имеет 76/77 = 98,7% давление ввода-вывода (полное ). И это должен быть самый большой член в средневзвешенном значении. Поэтому я все еще думаю, что заявленное значение немного ниже ожидаемого.
В приведенных выше тестах «полные» значения в основном совпадали с «некоторыми» значениями. Так что я ожидаю, что загадочные несоответствия в равной степени применимы к «давлению ввода-вывода (некоторым )».
Важно, что время «не -простоя», используемое для взвешивания среднего значения, исключает только чистое время простоя. Таким образом, время «не -простоя» — это больше, чем просто использование ЦП. Время «не -бездействия» также включает «время ожидания ввода-вывода процессора».
struct psi_group_cpu { /* States of the tasks belonging to this group */ unsigned int tasks[NR_PSI_TASK_COUNTS]; /* There are runnable or D-state tasks */ int nonidle;
groupc->nonidle = tasks[NR_RUNNING] || tasks[NR_IOWAIT] || tasks[NR_MEMSTALL];
ПРЕДОСТЕРЕЖЕНИЕ :PSI буквально не использует отчетное -ЦП "iowait". Он ведет собственный учет. Опять же, мой связанный вопрос показывает, что «iowait» может быть значительно занижен -, но я думаю, что PSI-эквивалент «iowait» был предназначен для того, чтобы избежать этой проблемы.
Закрепляя команду dd
на одном процессоре с помощью taskset -c 0
, я достигаю нагрузки ввода-вывода 96%, если NO_IDLE_HZ
подавлен, и 90% в противном случае. Эти цифры кажутся мне более правдоподобными.