Как возможна загрузка CPU под 100%?
От: Sharov Россия  
Дата: 09.10.19 09:37
Оценка: :))) :)
Здравствуйте.

Внезапно обнаружил, что не очень понимаю, как возможна загрузка cpu(всех ядер) под 100%.
Судите сами, состоянии когда конвейер пуст и процессор вообще ничего не делает невозможно. Т.е. проц. постоянно что-то делает, переключается между процессами и тд.
Т.е. постоянно загружен. Одна procexp показывает никакую загрузку cpu(1,2%). Подрубаю свою программу -- несколько минут под 100%, соотв. вой куллеров и т.д. Что изменилось?
В ненагруженном состоянии процессор гоняет задачи, которые укладываеются или вып. быстрее нежели отведенный квант, т.е. банально делают что-то вроде yield. В нагруженном состоянии мой процесс выжирает весь квант и просит еще(скажем обращение огромной матрицы без всяких gpu и проч.). Вот только я понять не могу, с точки зрения процессора ничего не изменилось, он все время при деле. Да, в системе появился новый процесс, который выжирает весь квант и cpu bound. Ну так и до этого процессор все время был занят.

Я для себя это объяснил тем, что воя нет поскольку основную часть времени процессор был занять переключанием контекста(yield), т.е. только он приготовился что-то делать, как давай менять задачу.
А тут появился процесс, который целый отведенный квант что-то колбасил. Это разумно звучит?
Кодом людям нужно помогать!
Re: Как возможна загрузка CPU под 100%?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 09.10.19 10:16
Оценка: 1 (1) +4
Здравствуйте, Sharov, Вы писали:

S>Внезапно обнаружил, что не очень понимаю, как возможна загрузка cpu(всех ядер) под 100%.

S>Судите сами, состоянии когда конвейер пуст и процессор вообще ничего не делает невозможно. Т.е. проц. постоянно что-то делает, переключается между процессами и тд.

Нет.
Процессор может просто быть остановлен и ожидать прерывания. Даже если никто другой (внешнее устройство, другое ядро и т.д., его не дёрнуло) — когда таймер скажет "просыпайся и перепроверь", он пойдёт работать снова.
Конкретные реализации этого разные — на x86 может быть HLT при разрешённых прерываниях, может быть MWAIT, может быть нужно ещё отдать команду северному мосту притормозить... — но оно всегда есть.

А 100% это когда он никогда не впадает в такой останов, потому что при проверке "а есть ли задачи, которые хотят процессора?" очередь таких задач непуста.
The God is real, unless declared integer.
Отредактировано 09.10.2019 10:27 netch80 . Предыдущая версия .
Re[2]: Как возможна загрузка CPU под 100%?
От: vsb Казахстан  
Дата: 09.10.19 10:18
Оценка: 1 (1) +1
Здравствуйте, netch80, Вы писали:

S>>Внезапно обнаружил, что не очень понимаю, как возможна загрузка cpu(всех ядер) под 100%.

S>>Судите сами, состоянии когда конвейер пуст и процессор вообще ничего не делает невозможно. Т.е. проц. постоянно что-то делает, переключается между процессами и тд.

N>Нет.

N>Процессор может просто быть остановлен и ожидать прерывания. Когда таймер скажет "просыпайся и перепроверь", он пойдёт работать снова.
N>Конкретные реализации этого разные — на x86 может быть HLT при разрешённых прерываниях, может быть MWAIT, может быть нужно ещё отдать команду северному мосту притормозить... — но оно всегда есть.

N>А 100% это когда он никогда не впадает в такой останов, потому что при проверке "а есть ли задачи, которые хотят процессора?" очередь таких задач непуста.


А как именно винда считает значение, которое нужно показать в диспетчере задач в качестве нагрузки?
Re[3]: Как возможна загрузка CPU под 100%?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 09.10.19 10:44
Оценка: 3 (1)
Здравствуйте, 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) и постоянный для данного ядра, не меняется при переключении задач.
The God is real, unless declared integer.
Отредактировано 09.10.2019 10:49 netch80 . Предыдущая версия .
Re: Как возможна загрузка CPU под 100%?
От: Zhendos  
Дата: 09.10.19 11:06
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте.


S>Внезапно обнаружил, что не очень понимаю, как возможна загрузка cpu(всех ядер) под 100%.

S>Судите сами, состоянии когда конвейер пуст и процессор вообще ничего не делает невозможно. Т.е. проц. постоянно что-то делает, переключается между процессами и тд.

Зачем ОС всегда переключаться между процессами? Если процесс на чем-то "завис" читает файл и данные с диска еще не пришли, ждет межпроцессорный семафор,
ждет событие из очереди событий и т.д., то ОС конечно же не возвращает ему управление пока нужно событие не наступило.
И если нет активных задач, то процессор конечно не используется.
Re[2]: Как возможна загрузка CPU под 100%?
От: Sharov Россия  
Дата: 09.10.19 11:11
Оценка:
Здравствуйте, netch80, Вы писали:


N>Нет.

N>Процессор может просто быть остановлен и ожидать прерывания. Даже если никто другой (внешнее устройство, другое ядро и т.д., его не дёрнуло) — когда таймер скажет "просыпайся и перепроверь", он пойдёт работать снова.

Кем он может быть остановлен?
Кодом людям нужно помогать!
Re[2]: Как возможна загрузка CPU под 100%?
От: Sharov Россия  
Дата: 09.10.19 11:13
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>И если нет активных задач, то процессор конечно не используется.


Так такие задачи всегда есть, всяческая диспетчеризация и т.д.
Кодом людям нужно помогать!
Re[3]: Как возможна загрузка CPU под 100%?
От: Zhendos  
Дата: 09.10.19 11:26
Оценка: 1 (1)
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Zhendos, Вы писали:


Z>>И если нет активных задач, то процессор конечно не используется.


S>Так такие задачи всегда есть, всяческая диспетчеризация и т.д.


Что вы имеете ввиду под "диспетчеризация" ? Если "Process Scheduling",
то естественно такая задача выполняется не чаше чем минимальный квант времени,
то есть например раз в 10 миллисекунд, все остальное время процессор не используется,
если активных, не ждущих какого-то события, процессов нет.
Плюс конечно современные "scheduler" достаточно интеллектуальны, чтобы запланировать
свой запуск не через 10 миллисекунд (цифры условны) по прерыванию таймера, а через N миллисекунд,
где N время когда придет время будит того кто спит.
Re[4]: Как возможна загрузка CPU под 100%?
От: Sharov Россия  
Дата: 09.10.19 11:32
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Что вы имеете ввиду под "диспетчеризация" ? Если "Process Scheduling",


Все что угодно, любой системный или пользовательский процесс. При современных скоростях, кол-ве приложений и т.д. всегда кому-нибудь нужно io (сеть проверить, диск и т.д.).
Я допускаю простои на девстенно чистой машине, на которую только что накатил ось, но и там уже куча процессов работает.

Совершенно не могу предстваить себе простаивающий процессор...
Кодом людям нужно помогать!
Re[5]: Как возможна загрузка CPU под 100%?
От: Zhendos  
Дата: 09.10.19 11:51
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Zhendos, Вы писали:


Z>>Что вы имеете ввиду под "диспетчеризация" ? Если "Process Scheduling",


S>Все что угодно, любой системный или пользовательский процесс. При современных скоростях, кол-ве приложений и т.д. всегда кому-нибудь нужно io (сеть проверить, диск и т.д.).


Так I/O и есть простой процессора Современный процессор потенциально может выполнить триллионы
операций в секунду, и пока не приходит прерывание микросхемы отвещающий за работу с диском или с сетью
все это время процессору нечего делать.
Re: Как возможна загрузка CPU под 100%?
От: Буравчик Россия  
Дата: 09.10.19 11:52
Оценка: 3 (1) +1
Здравствуйте, Sharov, Вы писали:

S>Да, в системе появился новый процесс, который выжирает весь квант и cpu bound. Ну так и до этого процессор все время был занят.


Да, процессор всегда что-то делает. Когда какие-то процессы хотят выполнения, он выполняет их. Когда "полезных" процессов для выполнения нет, он переключается на специальный системный процесс — процесс "бездействия" (system idle process).

В этом процессе бездействия процессору подается специальная команда, чтобы он "уснул" (команда HLT, например) и ждал когда его разбудят. В спящем режиме процессор отключает свои подсистемы и потребляет меньше энергии (меньше нагревается).

S>Судите сами, состоянии когда конвейер пуст и процессор вообще ничего не делает невозможно. Т.е. проц. постоянно что-то делает, переключается между процессами и тд.

S>Т.е. постоянно загружен. Одна procexp показывает никакую загрузку cpu(1,2%). Подрубаю свою программу -- несколько минут под 100%, соотв. вой куллеров и т.д. Что изменилось?

Система перестала выполнять idle process, разбудила процессор и сказала ему, чтобы он стал выполнять твой процесс.
Потребление увеличилось, температура увеличилась, кулеры включились.
Best regards, Буравчик
Отредактировано 09.10.2019 12:06 Буравчик . Предыдущая версия .
Re[6]: Как возможна загрузка CPU под 100%?
От: Sharov Россия  
Дата: 09.10.19 12:06
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Так I/O и есть простой процессора Современный процессор потенциально может выполнить триллионы


Я имел ввиду данные из сети или диска, которые проходят через cpu. Т.е. заблокировался один, подбираем другой, подобрали, пришли данные для первого и так все время.
Как он успевает простаивать даже без нагрузки --
Кодом людям нужно помогать!
Re[2]: Как возможна загрузка CPU под 100%?
От: Sharov Россия  
Дата: 09.10.19 12:13
Оценка:
Здравствуйте, Буравчик, Вы писали:


Б>Да, процессор всегда что-то делает. Когда какие-то процессы хотят выполнения, он выполняет их. Когда "полезных" процессов для выполнения нет, он переключается на специальный системный процесс — процесс "бездействия" (system idle process).

Б>В этом процессе бездействия процессору подается специальная команда, чтобы он "уснул" (команда HLT, например) и ждал когда его разбудят. В спящем режиме процессор отключает свои подсистемы и потребляет меньше энергии (меньше нагревается).

Благодарю, вот эти моменты я недопонимал.
Кодом людям нужно помогать!
Re[7]: Как возможна загрузка CPU под 100%?
От: Zhendos  
Дата: 09.10.19 12:37
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Zhendos, Вы писали:


Z>>Так I/O и есть простой процессора Современный процессор потенциально может выполнить триллионы


S>Я имел ввиду данные из сети или диска, которые проходят через cpu. Т.е. заблокировался один, подбираем другой, подобрали, пришли данные для первого и так все время.

S>Как он успевает простаивать даже без нагрузки --

Я же писал выше, сравните скорость на которой может работать процессор и скорость периферии,
даже если 1Гб сетевая карта загружена на 100% (в большинстве случаев это не так из-за времени из-за ограничения скорости с другой
стороны, плюс время на доставку пакетов)
и SATA3 диск будет постоянно занят, то все равно у процессора будет свободна куча тактов,
просто из-за того что скорость вышеуказанной периферии на порядок меньше скорости CPU.
Re[2]: Как возможна загрузка CPU под 100%?
От: Michael7 Россия  
Дата: 09.10.19 13:40
Оценка: 1 (1)
Здравствуйте, Буравчик, Вы писали:

Б>Система перестала выполнять idle process, разбудила процессор и сказала ему, чтобы он стал выполнять твой процесс.

Б>Потребление увеличилось, температура увеличилась, кулеры включились.

Кстати, еще что важно, что уже довольно давно, наверное лет с 15-20 обычные "бытовые", "офисные" компы фактически разучились непрерывно работать без "idle process". Если на них запустить какой-нибудь счет 24/7 они не факт, что хотя бы сутки проработают, не повиснув или не перезагрузившись или даже вообще не выйдя из строя. Причем мало озаботиться хорошим кулером для процессора, еще надо смотреть на качество материнской платы, так как vrm на ней могут не выдержать или еще что-нибудь.
Re[3]: Как возможна загрузка CPU под 100%?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 09.10.19 14:35
Оценка: 1 (1)
Здравствуйте, Sharov, Вы писали:

N>>Нет.

N>>Процессор может просто быть остановлен и ожидать прерывания. Даже если никто другой (внешнее устройство, другое ядро и т.д., его не дёрнуло) — когда таймер скажет "просыпайся и перепроверь", он пойдёт работать снова.

S>Кем он может быть остановлен?


Ядром (в смысле, программным кодом ядра), на основании того факта, что сейчас делать нечего.
Вот представь себе, у тебя толпа задач, включая:
— Крон: поставил "разбудить меня в 15:00".
— Сброс кэша диска: следующая побудка через 1.29 секунд.
— Браузер с RSDN: стал в состояние "ждём события от оконной среды (нажатие клавиатуры, движение мышки...)" с таймаутом на через 0.43 секунды, потому что на краю экрана маячит анимированный gif, который надо перерисовать. Для ядра это видимся как несколько ниток, все в спячке на чём-то (готовность таймера, возможность чтения из файлового хэндла).

Все задачи (в виде тредов или чисто ядерных задач) спят и соответственно в очереди спящих. Очередь готовых к выполнению — пуста. Планировщик (шедулер, диспетчер) видит пустую очередь и выполняет вход в остановленное состояние, задав таймеру "проснуться обратно через 0.43 секунды" (минимальный из всех таймаутов). Но его могут и раньше разбудить: двинул мышкой — ок, сигнал в браузер.

И вообще, читай классику. Там нет многих современных штук типа SMP, но достаточно, чтобы понять общие идеи.
The God is real, unless declared integer.
Re[7]: Как возможна загрузка CPU под 100%?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 09.10.19 14:35
Оценка: +1
Здравствуйте, Sharov, Вы писали:

S>Я имел ввиду данные из сети или диска, которые проходят через cpu.

Кто тебе сказал такую ерунду?
Почитай, что такое DMA. Процессор может вообще не прикасаться к данным, а будет только рулить процессом, программируя контроллер DMA и/или девайсы, умеющие в bus mastering. Именно благодаря этому даже в самых высокоскоростных сетевых устройствах используются относительно маломощные процессоры. Или, например, на моей платке с FPGA процессор, работающий на частоте в 100 МГц, умудряется выдавать FullHD (и даже 4к) видео через DisplayPort выход.
[КУ] оккупировала армия.
Re: Как возможна загрузка CPU под 100%?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 09.10.19 14:38
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Внезапно обнаружил, что не очень понимаю, как возможна загрузка cpu(всех ядер) под 100%.

S>Судите сами, состоянии когда конвейер пуст и процессор вообще ничего не делает невозможно. Т.е. проц. постоянно что-то делает, переключается между процессами и тд.
S>Т.е. постоянно загружен. Одна procexp показывает никакую загрузку cpu(1,2%). Подрубаю свою программу -- несколько минут под 100%, соотв. вой куллеров и т.д. Что изменилось?
S>В ненагруженном состоянии процессор гоняет задачи, которые укладываеются или вып. быстрее нежели отведенный квант, т.е. банально делают что-то вроде yield. В нагруженном состоянии мой процесс выжирает весь квант и просит еще(скажем обращение огромной матрицы без всяких gpu и проч.). Вот только я понять не могу, с точки зрения процессора ничего не изменилось, он все время при деле. Да, в системе появился новый процесс, который выжирает весь квант и cpu bound. Ну так и до этого процессор все время был занят.

Вот если бы ты таки прочитал книжку о разработке процессоров, которую я когда-то рекомендовал, то такие глупости не говорил бы
[КУ] оккупировала армия.
Re: Как возможна загрузка CPU под 100%?
От: MasterZiv СССР  
Дата: 09.10.19 14:44
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Внезапно обнаружил, что не очень понимаю, как возможна загрузка cpu(всех ядер) под 100%.

S>Судите сами, состоянии когда конвейер пуст и процессор вообще ничего не делает невозможно. Т.е. проц. постоянно что-то делает, переключается между процессами и тд.

Во-первых, такое состояние возможно.
Во-вторых, загрузка CPU -- это не когда процессор делает что-то, а когда процессор делает что-то ПОЛЕЗНОЕ, да ещё и (часто) отличное от кода ядра операционной системы.
Re[2]: Как возможна загрузка CPU под 100%?
От: Sharov Россия  
Дата: 09.10.19 15:34
Оценка:
Здравствуйте, koandrew, Вы писали:

K>Вот если бы ты таки прочитал книжку о разработке процессоров, которую я когда-то рекомендовал, то такие глупости не говорил бы


Какую конкретно? Я читал, перманентно перечитываю, H&P, смотрел Принстонский курс на курсере лет 6 назад про архитектуру цпу, на митовском курсе (edx) 6.004, даже делал(и)
свою реализацию опереточного процессора с опереточной ОС. Но нигде я не встречал и не говорили, что процессор может заснуть, т.е. вообще ничего не делать. Мне казалось, что ему постоянно есть
чем заняться...
Кодом людям нужно помогать!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.