Информация об изменениях

Сообщение Re[3]: Как возможна загрузка CPU под 100%? от 09.10.2019 10:44

Изменено 09.10.2019 10:49 netch80

Re[3]: Как возможна загрузка CPU под 100%?
Здравствуйте, vsb, Вы писали:

vsb>А как именно винда считает значение, которое нужно показать в диспетчере задач в качестве нагрузки?


Про винду не знаю.

Linux, FreeBSD и прочие — при переключениях между состояниями вычисляют по разности показаний таймера время, прошедшее с прошлого переключения, и плюсуют его к соответствующей категории. Категории у них примерно такие: idle (нет задачи, спим), user land, kernel land — user process, kernel land — softinterrupt ("bottom half"), kernel land — direct interrupt processing ("top half"). В текущем man top от Linux, например, такой список:

           us, user    : time running un-niced user processes
           sy, system  : time running kernel processes
           ni, nice    : time running niced user processes
           id, idle    : time spent in the kernel idle handler
           wa, IO-wait : time waiting for I/O completion
           hi : time spent servicing hardware interrupts
           si : time spent servicing software interrupts
           st : time stolen from this vm by the hypervisor


тут user land разделено на niced (снижен приоритет) и un-niced, hi == top half, si == bottom half, ну ещё гипервизор, если участвует, и IO wait (зачем это, не копал).

Подсчёт в случае idle будет выглядеть где-то так:

    this_cpu_state->switch_timestamp = get_now();
    do_idle_sleep();
    deeptime_t now = get_now();
    this_cpu_state->sum_idle += get_now() - this_cpu_state->switch_timestamp;
    this_cpu_state->switch_timestamp = now;


get_now() — какое-то очень дешёвое обращение к таймеру (типа TSC счётчика в процессоре), deeptime_t — тип с достаточной точностью. this_cpu_state — псевдоуказатель, который реализуется через регистр процессора (на x86 это может быть FS или GS) и постоянный для данного ядра, не меняется при переключении задач.
Re[3]: Как возможна загрузка CPU под 100%?
Здравствуйте, vsb, Вы писали:

vsb>А как именно винда считает значение, которое нужно показать в диспетчере задач в качестве нагрузки?


Про винду не знаю.

Linux, FreeBSD и прочие — при переключениях между состояниями вычисляют по разности показаний таймера время, прошедшее с прошлого переключения, и плюсуют его к соответствующей категории. Категории у них примерно такие: idle (нет задачи, спим), user land, kernel land — user process, kernel land — softinterrupt ("bottom half"), kernel land — direct interrupt processing ("top half"). В текущем man top от Linux, например, такой список:

           us, user    : time running un-niced user processes
           sy, system  : time running kernel processes
           ni, nice    : time running niced user processes
           id, idle    : time spent in the kernel idle handler
           wa, IO-wait : time waiting for I/O completion
           hi : time spent servicing hardware interrupts
           si : time spent servicing software interrupts
           st : time stolen from this vm by the hypervisor


тут user land разделено на niced (снижен приоритет) и un-niced, hi == top half, si == bottom half, ну ещё гипервизор, если участвует, и IO wait (зачем это, не копал).

Подсчёт в случае idle будет выглядеть где-то так:

    this_cpu_state->switch_timestamp = get_now();
    do_idle_sleep();
    deeptime_t now = get_now();
    this_cpu_state->sum_idle += now - this_cpu_state->switch_timestamp;
    this_cpu_state->switch_timestamp = now;


get_now() — какое-то очень дешёвое обращение к таймеру (типа TSC счётчика в процессоре), deeptime_t — тип с достаточной точностью. this_cpu_state — псевдоуказатель, который реализуется через регистр процессора (на x86 это может быть FS или GS) и постоянный для данного ядра, не меняется при переключении задач.