Почему в новой Linux «информация о остановке под давлением» для ввода-вывода не отображается как 100%?

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.

0
28.06.2019, 01:39
1 ответ

Мой первый ответ на этот вопрос заключался в том, что «давление ввода-вывода» тесно связано с понятием «время ожидания ввода-вывода ЦП». И время ожидания процессорного ввода-вывода, которое я наблюдал, также показалось мне слишком низким. Поэтому я не должен надеяться, что «давление 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
  • cpu3 имеет 11% не -простоя (100 -89 ). 10% было засчитано как «iowait».
  • cpu1 имеет 77% не -простоя (100 -23 ). 76% было засчитано как «iowait».
  • cpu2+cpu0 имеют 12% не -простоя. 10% было засчитано как «iowait».
  • 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% в противном случае. Эти цифры кажутся мне более правдоподобными.

0
28.01.2020, 03:30

Теги

Похожие вопросы