The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Линус Торвальдс опроверг проблемы с планировщиком задач, всп..., opennews (??), 06-Янв-20, (0) [смотреть все] +1

Сообщения [Сортировка по времени | RSS]


42. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (42), 06-Янв-20, 12:04 
https://www.techpowerup.com/review/1usmus-custom-power-plan-.../

Windows loves to balance the CPU load across multiple CPU cores, moving threads from busy cores to idle ones. This is normal, expected behavior for a modern SMP-aware process scheduler, but Windows is actually pretty dumb about it.

В линуксе вот этот момент гораздо правильней реализован

Ответить | Правка | К родителю #26 | Наверх | Cообщить модератору

61. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +4 +/
Сообщение от Аноним (26), 06-Янв-20, 13:10 
Угу. Процитирую эту статью:

> Windows considers a core as "busy" even if there is only a single thread using it and moves that same thread to an idle core if one is available!

Ну, во первых, термина "busy" в планировщике Windows вообще нет (есть только его противоположность, idle). Во вторых, смена процессора выполнения потока "просто потому что появилось idle ядро" никогда не происходит. Советую почитать Windows Internals, например 7-ое издание. Там и терминология соответствующая, и материал соответствующий Windows 10 района 2016 года (например, там всё ещё Stride, а не StrideMask в KPRCB, т.е. нововведения для поддержки новых Ryzen там не покрыты).

> Furthermore, the Windows process scheduler makes no distinction whatsoever between physical and virtual cores, nor between CCXes with their separate caches.

Как минимум Windows 8 и выше прекрасно в курсе HT/SMT и в самом планировщике. Даже Windows 7 старалась сдвигать работу на физические ядра. Про детали CCX ничего не знаю, поэтому утверждать не буду.

> Just to clarify: the Windows scheduler is not SMT aware—only the Windows core-parking algorithm is SMT aware.

Это неверно как следствие первых двух ошибок.

В этой же статье далее рассказывается про их power plan, который делает "всё правильно". Но ничего не упоминается даже про то, что Microsoft дропает поддержку кастомных планов, и что на достаточно современных планшетах и ноутбуках всего один, новый, динамический план питания. Что весьма странно и, в совокупности с фактическими ошибками, не вызывает доверия к их экспертному мнению.

Возможно (даже вероятно) планировщик в Linux сложнее, способен обрабатывать даже очень невероятные ситуации. Я лишь утверждаю, что планировщик в Windows тоже неплох, да ещё и развивается.

Ответить | Правка | Наверх | Cообщить модератору

69. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +1 +/
Сообщение от Аноним (6), 06-Янв-20, 13:40 
> Угу. Процитирую эту статью:
>> Windows considers a core as "busy" even if there is only a single thread using it and moves that same thread to an idle core if one is available!
> Ну, во первых, термина "busy" в планировщике Windows вообще нет (есть только
> его противоположность, idle).

Ну как бы ядро (т.е. исполнитель) и тред (контекст исполнения, в т.ч. адрес исполняемого кода) и есть "противоположности".

; set context swap busy for the idle thread and acquire the PRCB Lock.
;

        mov     rdi, PbIdleThread[rbx]  ; get idle thread address

ifndef NT_UP

        mov     byte ptr ThSwapBusy[rdi], 1 ; set context swap busy


https://github.com/Zer0Mem0ry/ntoskrnl/blob/master/Ke/amd64/...

> Во вторых, смена процессора выполнения потока "просто потому
> что появилось idle ядро" никогда не происходит.


; The new thread is the Idle thread (same as old thread).  This can happen
; rarely when a thread scheduled for this processor is made unable to run
; on this processor. As this processor has again been marked idle, other
; processors may unconditionally assign new threads to this processor.

https://github.com/Zer0Mem0ry/ntoskrnl/blob/master/Ke/amd64/...

Интересно было бы поискать это "unconditionally" условие, но я не делал утверждения "никогда не происходит".)

Ответить | Правка | Наверх | Cообщить модератору

103. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +1 +/
Сообщение от Аноним (26), 06-Янв-20, 14:49 
Люблю когда по делу переписка.

По первому куску кода WRK:
Не знаю, зачем сюда уже подмешивать механизм context swap, который чаще всего выполняется в конце работы планировщика.

По второму куску кода WRK:
К чему он вообще? Он отвечает за завершение итерации idle loop, когда новый поток выполнения не найден, или найден, но на него переключиться нельзя (по разным причинам, например изменение affinity после перехода в standby режим потока).
Unconditionally - это скорее подчёркивает, что поскольку этот поток ничего полезного не делает (только спиннит ядро в ожидании работы), то никаких дополнительных условий при выборе ядра для нового потока в очереди выполнения проверять не надо.

> Во вторых, смена процессора выполнения потока "просто потому что появилось idle ядро" никогда не происходит.

Я пишу про то, что поток, выполнявшийся на одном ядре, без очень весомой причины (до сборки 19536, в ней это стало происходить чаще благодаря новому Cache Aware Scheduling) не станет выполняться на другом ядре, т.к. Ideal processor чаще всего остаётся неизменным в thread lifecycle.

Ну и в целом, приводить в пример урезанное ядро Windows XP - скучно. Реверс Windows 10 - совсем иные ощущения.

Зато я нашёл ошибку в своём начальном посте: Stride - свойство KNODE конечно, а не KPRCB (ноды, а не конкретного ядра).

Ответить | Правка | Наверх | Cообщить модератору

136. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (6), 06-Янв-20, 16:06 
> Люблю когда по делу переписка.

Э, нет, дружище, я тут не весть какой помощник. Мне это было интересно, когда сорцы WRK доступны не были.

> По первому куску кода WRK:
> Не знаю, зачем сюда уже подмешивать механизм context swap, который чаще всего
> выполняется в конце работы планировщика.

Не читал первую ссылку, но исхожу из того, что её автор "busy" не сам придумал, а откуда-то выцепил. Из вышеприведённого или подобного куска. Ссылка на KiIdleLoop - намёк на казалось бы просто вопрос "на каком IRQL выполняется спящий поток?", которым можно много кого завалить.

> По второму куску кода WRK:
> К чему он вообще? Он отвечает за завершение итерации idle loop, когда
> новый поток выполнения не найден, или найден, но на него переключиться
> нельзя (по разным причинам, например изменение affinity после перехода в standby
> режим потока).
> Unconditionally - это скорее подчёркивает, что поскольку этот поток ничего полезного не
> делает (только спиннит ядро в ожидании работы), то никаких дополнительных условий
> при выборе ядра для нового потока в очереди выполнения проверять не
> надо.

К "просто потому что появилось idle ядро", которую каждый понял по-своему. Тут как раз "swap from idle to idle".

>> Во вторых, смена процессора выполнения потока "просто потому что появилось idle ядро" никогда не происходит.
> Я пишу про то, что поток, выполнявшийся на одном ядре, без очень
> весомой причины (до сборки 19536, в ней это стало происходить чаще
> благодаря новому Cache Aware Scheduling) не станет выполняться на другом ядре,
> т.к. Ideal processor чаще всего остаётся неизменным в thread lifecycle.

К примеру, у нас 2 ядра и 4 потока. 2 выполняются на одном ядре, 2 на другом. Первые 2 завершились. Это весомая причина? Понятно, что должно быть перераспределение.

> Ну и в целом, приводить в пример урезанное ядро Windows XP -
> скучно. Реверс Windows 10 - совсем иные ощущения.

Представляю, какие были ощущения у online-solutions.ru
когда MS выкатило очередной подарок. :)

> Зато я нашёл ошибку в своём начальном посте: Stride - свойство KNODE
> конечно, а не KPRCB (ноды, а не конкретного ядра).

А что, сейчас такие вещи нигде толком не обсуждаются?

Ответить | Правка | Наверх | Cообщить модератору

170. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (26), 06-Янв-20, 17:39 
> исхожу из того, что её автор "busy" не сам придумал, а откуда-то выцепил.

Вероятнее всего. Вопрос - понимает ли автор, что стоит за этим словом?

> на каком IRQL выполняется спящий поток?

Да, занятный, но я бы на него ответил контрвопросом "в какой-то конкретный момент или в целом?". Но вообще это наверное для проверки на вшивость разработчика драйверов, нежели ради реальных знаний.

> Понятно, что должно быть перераспределение.

Да, но оно не* результат перераспределения как такового, а, например, результат поиска работы того же idle thread. Но Ideal процессор то не менялся.

> Представляю, какие были ощущения у online-solutions.ru
> когда MS выкатило очередной подарок.

Кто это? Никогда о них не слышал. Вот у настоящих производителей антивирусных пакетов я думаю неплохо так горит от каждого обновления Windows, ибо их любимый хардкод и хаки начинают рассыпаться (и вводить в BSoD/GSoD или приводить к ошибке обновления до новой версии).

> А что, сейчас такие вещи нигде толком не обсуждаются?

Есть любители поковырять ядро, но обычно знания остаются у расковырявшего. Увы.

Ответить | Правка | Наверх | Cообщить модератору

202. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (6), 06-Янв-20, 19:19 
>> исхожу из того, что её автор "busy" не сам придумал, а откуда-то выцепил.
> Вероятнее всего. Вопрос - понимает ли автор, что стоит за этим словом?

Он относит busy к ядру процессора, которое в принципе не может быть idle (но может находиться в HALT state).

>> на каком IRQL выполняется спящий поток?
> Да, занятный, но я бы на него ответил контрвопросом "в какой-то конкретный
> момент или в целом?". Но вообще это наверное для проверки на
> вшивость разработчика драйверов, нежели ради реальных знаний.

Это к пониманию работы механизма переключения контекстов выполнения (а это только планировщик, но и диспетчер).

>> Понятно, что должно быть перераспределение.
> Да, но оно не* результат перераспределения как такового, а, например, результат поиска
> работы того же idle thread. Но Ideal процессор то не менялся.
>> Представляю, какие были ощущения у online-solutions.ru
>> когда MS выкатило очередной подарок.
> Кто это? Никогда о них не слышал. Вот у настоящих производителей антивирусных
> пакетов я думаю неплохо так горит от каждого обновления Windows, ибо
> их любимый хардкод и хаки начинают рассыпаться (и вводить в BSoD/GSoD
> или приводить к ошибке обновления до новой версии).

Споров организовал в своё время. Их OSAM тогда сразу же обогнал AutoRuns. Основной продукт был с серьёзным замахом, но так и не выпустили, поскольку MS кислород перекрыли.

Ответить | Правка | Наверх | Cообщить модератору

173. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Anonymoustus (ok), 06-Янв-20, 17:46 
> Реверс Windows 10 - совсем иные ощущения.

Ну и что там внутри, мой анонимный брат?

Ответить | Правка | К родителю #103 | Наверх | Cообщить модератору

176. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (26), 06-Янв-20, 17:54 
Гора неочевидного кода, твой анонимный брат. Неочевидного - потому что ты не знаешь настоящей причины, зачем он там. А ведь он нужен.

Ах да, это же прямо как исходники Linux, с патчсетами от крупных компаний-производителей процессоров, спеки то всё равно только они имеют. Конец минутки неудачной иронии.

Ответить | Правка | Наверх | Cообщить модератору

212. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Anonymoustus (ok), 06-Янв-20, 19:54 
> Гора неочевидного кода, твой анонимный брат. Неочевидного - потому что ты не
> знаешь настоящей причины, зачем он там. А ведь он нужен.

Ох уж эти индусы…


> Ах да, это же прямо как исходники Linux, с патчсетами от крупных
> компаний-производителей процессоров, спеки то всё равно только они имеют. Конец минутки
> неудачной иронии.

«Это свобода!» — говорили они нам лет около двадцати назад.

Ответить | Правка | Наверх | Cообщить модератору

81. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Ordu (ok), 06-Янв-20, 14:00 
Хочу уточнить: твои придирки, как я понял, относятся не к фактической части, а к теоретической? То есть ты не споришь с тем, что венда выполняет совершенно ненужные перекидывания потоков с ядра на ядро, тебя не устраивает то, как эти перекидывания объясняются, так?
Ответить | Правка | К родителю #61 | Наверх | Cообщить модератору

129. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (26), 06-Янв-20, 15:28 
> То есть ты не споришь с тем, что венда выполняет совершенно ненужные перекидывания потоков с ядра на ядро,

Я утверждаю, что их нет (до введения Cache Aware Scheduling пару недель назад).

> тебя не устраивает то, как эти перекидывания объясняются, так?

Меня не устраивают неверные утверждения про то что современный планировщик Windows не в курсе про SMT/HT/NUMA/архитектуру Ryzen, или что он имеет всего одну глобальную очередь потоков на выполнение  (или даже что он имеет одну локальную для ядра очередь потоков). А следовательно - про его простоту.

Ответить | Правка | Наверх | Cообщить модератору

149. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Ordu (ok), 06-Янв-20, 17:03 
>> То есть ты не споришь с тем, что венда выполняет совершенно ненужные перекидывания потоков с ядра на ядро,
> Я утверждаю, что их нет (до введения Cache Aware Scheduling пару недель
> назад).

В смысле, они были до введения Cache Aware Scheduling пару недель назад, я правильно понял? Статья от ноября 2019 года. То есть она всё говорит правильно.

Ответить | Правка | Наверх | Cообщить модератору

178. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (26), 06-Янв-20, 17:59 
Как так можно читать, чтобы из двух, вроде бы чётко написанных сообщений, вывести противоположное утверждение? НЕ было. Так ясно?
В статье лажа не по этой причине, а из-за следующих двух параграфов с голословными заявлениями (и противоречащим реалиям, если посмотреть код или почитать авторитетные источники вроде Windows Internals), ставящих под сомнение всё их экспертное мнение.
Ответить | Правка | Наверх | Cообщить модератору

194. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (156), 06-Янв-20, 18:55 
Где это такое видано чтобы оба сабжевых оратора были не правы? Либо черное либо белое. Либо один прав, либо другой, третьего не дано. Таков путь.
Ответить | Правка | Наверх | Cообщить модератору

204. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Ordu (ok), 06-Янв-20, 19:23 
> Как так можно читать, чтобы из двух, вроде бы чётко написанных сообщений,
> вывести противоположное утверждение?

Как можно писать, что я читаю одно твоё сообщение за другим, и до сих пор продолжаю уточнять, что именно ты имеешь в виду?

> НЕ было. Так ясно?

Нет, не ясно. Чего именно не было? Те графики в статье показывающие как поток выполенения перепрыгивает с ядра на ядро -- туфта нарисованная в фотошопе?

> В статье лажа не по этой причине,

"Не по этой" -- это не по какой? Я простите не телепат, чтобы угадывать, на что именно ты ссылаешься всеми этими своими местоимениями.

Ответить | Правка | К родителю #178 | Наверх | Cообщить модератору

214. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (26), 06-Янв-20, 19:56 
> они были до введения Cache Aware Scheduling пару недель назад
> НЕ было. Так ясно?
> Нет, не ясно. Чего именно не было?

:/ Поток перепрыгивает с ядра на ядро не по причине "планировщик неоправданно переключить ядро", как в начальном вопросе:

> венда выполняет совершенно ненужные перекидывания потоков с ядра на ядро

А по причине того, что ядро освобождается, и ищет работу. Оно находит работу в очереди у другого ядра (если повезёт - в той же ноде или ноде с теми же характеристиками). Оно обрабатывает её, вместо простоя. Где ненужность?

> "Не по этой" -- это не по какой?

Не по тобою же обозначенной в первом же твоём сообщении (и статье).

> венда выполняет совершенно ненужные перекидывания потоков с ядра на ядро
> Windows loves to balance the CPU load across multiple CPU cores, moving threads from busy cores to idle ones. This is normal, expected behavior for a modern SMP-aware process scheduler, but Windows is actually pretty dumb about it.

А реальная лажа в статье в утверждениях:

> Furthermore, the Windows process scheduler makes no distinction whatsoever between physical and virtual cores, nor between CCXes with their separate caches.

Планировщик Windows знает про HT. Про CCX я не знаю, ничего утверждать не буду.

> the Windows scheduler is not SMT aware—only the Windows core-parking algorithm is SMT aware.

Планировщик Windows тоже знает про SMT.

> Linux handles this rather better: it actively prefers to keep threads on the same core for as long as there are no scheduling conflicts on that core.

Планировщик Windows тоже предпочитает оставлять потоки на последнем ядре выполнения. Но может и сменить.

Ответить | Правка | Наверх | Cообщить модератору

234. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  –1 +/
Сообщение от Ordu (ok), 06-Янв-20, 21:12 
>> они были до введения Cache Aware Scheduling пару недель назад
>> НЕ было. Так ясно?
>> Нет, не ясно. Чего именно не было?
> :/ Поток перепрыгивает с ядра на ядро не по причине "планировщик неоправданно
> переключить ядро", как в начальном вопросе:
>> венда выполняет совершенно ненужные перекидывания потоков с ядра на ядро
> А по причине того, что ядро освобождается, и ищет работу. Оно находит
> работу в очереди у другого ядра (если повезёт - в той
> же ноде или ноде с теми же характеристиками). Оно обрабатывает её,
> вместо простоя. Где ненужность?

В перекидывании потока: за ним ведь приходится тянуть все кеши. Какая разница планировщику какие ядра будут простаивать без работы? Без разницы, ну так и зачем двигать поток кушающий 100% времени процессорного ядра с занятого ядра на свободное? Что от этого изменится в лучшую сторону?

Ничего в лучшую сторону не изменится, а вот накладные расходы будут. Значит перекидывания ненужные.

>> "Не по этой" -- это не по какой?
> Не по тобою же обозначенной в первом же твоём сообщении (и статье).
>> венда выполняет совершенно ненужные перекидывания потоков с ядра на ядро
>> Windows loves to balance the CPU load across multiple CPU cores, moving threads from busy cores to idle ones. This is normal, expected behavior for a modern SMP-aware process scheduler, but Windows is actually pretty dumb about it.

Ты не ответил на вопрос: графики из статьи нарисованы в фотошопе? На самом деле, этот вопрос был задан в первом моём сообщении, я его повторял потом в разных вариациях, но ты так до сих пор на него и не ответил.

Если графики не были нарисованы в фотошопе, то вот тогда у меня появится следующий вопрос: как эти графики можно объяснить, не прибегая к словам "ненужные перекидывания потоков", "dumb Windows scheduler" и тому подобных?

> А реальная лажа в статье в утверждениях:

Я отмечу, что ты не предлагаешь никакой альтернативы им. Важно надуваешь щёки, пытаясь выглядеть знатоком ядра Windows и планировщика в нём, но объяснить поведение ядра, продемонстрированное графиками, тебе пока не удаётся.

Ответить | Правка | Наверх | Cообщить модератору

318. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +1 +/
Сообщение от Аноним (26), 07-Янв-20, 09:18 
> В перекидывании потока: за ним ведь приходится тянуть все кеши.

Ну, нет. Представим ситуацию. Поток A всегда выполнялся на ядре 0. Его квант истёк, его вытеснил поток B. Вдруг ядро 2 начало простаивать, а A стоит в очереди на ядро 0, которое находится в той же ноде, что и ядро 2. Ядро 2 должно простаивать? Или может всё таки лучше забрать поток A себе? Планировщик скорее всего сделает последнее (за вычетом ограничений affinity и подобного). Кэши просто так никто перетягивать не будет. Поток B вероятнее всего уже весь кэш L1 заполнил своими данными. А L2 может вообще быть общим для ядер 0 и 2. Что перетягивать? Как перетягивать? Да, будут cache miss'ы. Но это лишь замедление работы, а не полное простаивание ядра (пока есть работа в очереди).

> Какая разница планировщику какие ядра будут простаивать без работы?

Они не будут (простаивать без работы). См. выше.

> Без разницы, ну так и зачем двигать поток кушающий 100% времени процессорного ядра с занятого ядра на свободное?

Не зачем. Но поток не может вечно крутится на ядре. Он может крутится лишь определённый кусок времени (квант), затем он должен уступить другим потокам. В этот момент и может произойти ситуация, описанная выше, где поток A - это как раз "поток кушающий 100% времени процессорного ядра".

> Ты не ответил на вопрос: графики из статьи нарисованы в фотошопе?

Нет, конечно. Потоки могут выполняться не только на последнем использованном для выполнения ядре, они действительно могут "перекидываться". См. пример выше.

> На самом деле, этот вопрос был задан в первом моём сообщении, я его повторял потом в разных вариациях, но ты так до сих пор на него и не ответил.

Про графики речь зашла лишь в твоём сообщении 8.204. Отвечал я на твоё первое сообщение 4.81.

> Я отмечу, что ты не предлагаешь никакой альтернативы им.

В моём же сообщении 3.61 я сразу написал:
> Советую почитать Windows Internals, например 7-ое издание.

Ибо там, даже если очень лень вникать, просто из содержания можно извлечь ложность утверждений из статьи.
> Thread selection on multiprocessor systems
> Heterogeneous scheduling (big.LITTLE)

Про то, что планировщик Windows знает, про разницу между физическими и логическими ядрами, рассказывает раздел "Package sets and SMT sets", но увы, тут уже придётся вчитаться хотя бы в первый его параграф.

> Важно надуваешь щёки, пытаясь выглядеть знатоком ядра Windows и планировщика в нём, но объяснить поведение ядра, продемонстрированное графиками, тебе пока не удаётся.

Я не знаток конечно, я лишь консультирую по NT Internals. Зачем я должен объяснять поведение планировщика рандомному человеку, когда этот рандомный человек, если он захочет конечно, может прочитать замечательную книгу от настоящих знатоков? Смысл пересказывать содержимое книги?

Ответить | Правка | Наверх | Cообщить модератору

328. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +1 +/
Сообщение от Ordu (ok), 07-Янв-20, 12:09 
>> В перекидывании потока: за ним ведь приходится тянуть все кеши.
> Ну, нет. Представим ситуацию. Поток A всегда выполнялся на ядре 0. Его
> квант истёк, его вытеснил поток B.

С какого полового члена его вытеснил поток B если при этом ядра 1, 2, и 3 простаивают?

>> Какая разница планировщику какие ядра будут простаивать без работы?
> Они не будут (простаивать без работы). См. выше.

Ты статью-то читал, на которую реагируешь? Графики смотрел, которые мы обсуждаем? Там в любой момент времени, потребляется 100-101% времени одного ядра, потому что есть один поток жрущий 100% одного ядра, и фоновые процессы, которые практически всё время спят.

>> На самом деле, этот вопрос был задан в первом моём сообщении, я его повторял потом в разных вариациях, но ты так до сих пор на него и не ответил.
> Про графики речь зашла лишь в твоём сообщении 8.204. Отвечал я на
> твоё первое сообщение 4.81.

В моём первом сообщении был вопрос: "твои придирки, как я понял, относятся не к фактической части, а к теоретической?". Фактическая часть -- это как раз те самые графики, которые демонстрируют как имея несколько свободных ядер, венда перекидывает поток жрущий 100% времени одного ядра между ядрами. Теоретическая часть -- это объяснение происходящего с отсылками к устройству планировщика задач венды.

>> Я отмечу, что ты не предлагаешь никакой альтернативы им.
> В моём же сообщении 3.61 я сразу написал:
>> Советую почитать Windows Internals, например 7-ое издание.

Иди ты с этой альтернативой знаешь куда? Мне венда не въелась совершенно, из любопытства я могу почитать обсуждаемую статью, чтобы узнать немного о том, как она работает. Но всякие вендовс интерналс я прекратил читать лет двадцать назад, когда заглянул в linux и увидел, что здесь можно читать не дурацкую писанину технических писателей, а непосредственно исходный код.

>> Важно надуваешь щёки, пытаясь выглядеть знатоком ядра Windows и планировщика в нём, но объяснить поведение ядра, продемонстрированное графиками, тебе пока не удаётся.
> Я не знаток конечно, я лишь консультирую по NT Internals.

Лол. Мне нравятся твои консультации: "идите и почитайте windows internals". Тебе за такие советы реально кто-то платит денег? Вообще, насколько я понимаю задачу консультирования, в ней очень важно иметь навык понимания собеседника, потому как ежели консультант не в состоянии понять того, кого он консультирует, то он действительно никогда не сможет дать совета лучше, чем "RTFM". Второй важный навык -- это умение объяснять и отвечать на вопросы. Ты здесь и сейчас продемонстрировал, что ни один из этих навыков тебе недоступен. Я чёрть-его-знает-сколько времени выуживал из тебя ответы на простые вопросы, получая ненужные мне ответы на вопросы, которых я не задавал. Как ты вообще работаешь консультантом при этом?

В качество профориентационного совета: тебе лучше податься в маркетинг или в политику -- там как раз очень полезно умение уходить от прямых вопросов, создавая при этом впечатление открытости и готовности развёрнуто отвечать на любые вопросы.

> Зачем я
> должен объяснять поведение планировщика рандомному человеку, когда этот рандомный человек,
> если он захочет конечно, может прочитать замечательную книгу от настоящих знатоков?
> Смысл пересказывать содержимое книги?

Мне не нужно содержимое книги, мне хочется знать короткое объяснение простому феномену: почему венда жонглирует потоком между свободными ядрами, хотя оно могло бы оставить его крутится на одном ядре.

Ответить | Правка | Наверх | Cообщить модератору

330. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (26), 07-Янв-20, 12:55 
> С какого полового члена его вытеснил поток B если при этом ядра 1, 2, и 3 простаивают?

"С какого полового члена" взято что они простаивают? Из сценария из статьи, точнее из графика из неё, из которого не понятно даже это нагрузка от одного процесса или от всей системы? Я про свой сценарий, который может совпадать со сценарием из статьи, когда помимо одного однопоточного приложения есть неравномерная нагрузка и на остальные ядра (от других процессов), но не 100%.

> Ты статью-то читал, на которую реагируешь? Графики смотрел, которые мы обсуждаем?

Конечно читал, ибо реагирую.

> В моём первом сообщении был вопрос: "твои придирки, как я понял, относятся не к фактической части, а к теоретической?". Фактическая часть -- это как раз те самые графики, которые демонстрируют как имея несколько свободных ядер, венда перекидывает поток жрущий 100% времени одного ядра между ядрами. Теоретическая часть -- это объяснение происходящего с отсылками к устройству планировщика задач венды.

Если так поставить, да. Мои "придирки", "относятся не к фактической части, а к теоретической".

Ну и спасибо за полезные советы, я ими непременно воспользуюсь по назначению.

Ответить | Правка | Наверх | Cообщить модератору

335. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  –1 +/
Сообщение от Ordu (ok), 07-Янв-20, 13:18 
>> С какого полового члена его вытеснил поток B если при этом ядра 1, 2, и 3 простаивают?
> "С какого полового члена" взято что они простаивают? Из сценария из статьи,
> точнее из графика из неё, из которого не понятно даже это
> нагрузка от одного процесса или от всей системы?

Посмотри внимательно на график. Там две кривые прыгают вверх-вниз -- это два ядра, между которыми прыгает поток. А внизу, около нуля, ещё несколько кривых -- это все остальные ядра.

> Я про свой
> сценарий, который может совпадать со сценарием из статьи,

Да кому он нужен твой сценарий, если в статье идёт обсуждение вполне конкретного сценария? И вообще, если ты меняешь сценарий, ты хоть предупреждай собеседников. Я бы даже не парился общаться с тобой, если бы с самого начала знал, что ты на своей волне сам с собой разговариваешь.

>> Ты статью-то читал, на которую реагируешь? Графики смотрел, которые мы обсуждаем?
> Конечно читал, ибо реагирую.

https://www.physics-astronomy.org/2019/04/marijuana-contains...

Ответить | Правка | К родителю #330 | Наверх | Cообщить модератору

345. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +1 +/
Сообщение от Аноним (26), 07-Янв-20, 15:26 
> Посмотри внимательно на график. Там две кривые прыгают вверх-вниз -- это два ядра, между которыми прыгает поток. А внизу, около нуля, ещё несколько кривых -- это все остальные ядра.

В этой статье нет даже объяснения, что этот график изображает. "Single-threaded workload bouncing between cores". Это график той самой нагрузки (только от неё)? Или нагрузки на ядра (в целом, с учётом остальных потоков других процессов)? В статье нет даже упоминания этого графика, хотя контекстуально он вероятно релевантен. Но он просто "есть", в отрыве от статьи.
Я привожу пример сценария, в котором график будет корректным, соответствовать контексту, но означать не "тупость" планировщика, как это указано в статье. Да и помимо этого графика в статье есть ошибочные утверждения (что легко проверяется с помощью качественной книги или IDA Pro/Ghidra/...).

> [14.335] Да кому он нужен твой сценарий, если в статье идёт обсуждение вполне конкретного сценария?
> [13.330] сценарий, который может совпадать со сценарием из статьи

:/

> [14.335] И вообще, если ты меняешь сценарий, ты хоть предупреждай собеседников.
> [11.318] Представим ситуацию.

:/

Спасибо за ссылку, могу вкинуть ещё парочку интересных.

Ответить | Правка | К родителю #335 | Наверх | Cообщить модератору

354. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Ordu (ok), 07-Янв-20, 20:04 
>> Посмотри внимательно на график. Там две кривые прыгают вверх-вниз -- это два ядра, между которыми прыгает поток. А внизу, около нуля, ещё несколько кривых -- это все остальные ядра.
> В этой статье нет даже объяснения, что этот график изображает. "Single-threaded workload
> bouncing between cores". Это график той самой нагрузки (только от неё)?
> Или нагрузки на ядра (в целом, с учётом остальных потоков других
> процессов)? В статье нет даже упоминания этого графика, хотя контекстуально он
> вероятно релевантен. Но он просто "есть", в отрыве от статьи.

У меня не возникло проблем понять этот график. Автор сделал открыл какую-то тулзу, которая рисует график загрузки ядер, прибил все процессы, которые давали заметную нагрузку, после чего запустил какую-то однопоточную нагрузку -- может быть это был while(1) i++; скомпилированный с -O0, может быть это было какое-то приложение, которое считало гуглоплексы знаков пи, может это было что-то ещё. И он получил графики, которые мы видим.

Я не вижу способа, как он здесь мог накосячить -- запустить что-то, что блокировалось на вводе-выводе? Но график был бы иной, он бы не достиг 100% загрузки процессора. Может у него был какой-то другой процесс, который съедал, допустим, 20% времени процессора, а его процесс кушал 80%? Или его нагрузка была многопоточной? Но в этом случае ему сильно повезло, что эти процессы так чётко отъедали процессорное время так, чтобы в сумме получалось бы 100%, и ещё ему повезло, что они всегда по двум ядрам раскидывались и не занимали остальные. Короче, я не вижу, как он мог сделать что-то не то.

Может я неправильно понимаю график, и эти кривые отражают что-то иное, не загрузку хардварных тредов? Но что, например? Я не вижу, что это может быть ещё.

Я выше дважды сказал "я не вижу", если насчёт хотя бы одного "я не вижу", ты можешь сказать "а я вижу" и объяснишь, что именно ты видишь, то я соглашусь с тобой, что тут серьёзный косяк со стороны автора. Если ты не можешь предположить ничего, значит косяка тут нет: автора и его картинку можно понять единственным образом и дополнительных пояснений не требуется.

> Я привожу пример сценария, в котором график будет корректным, соответствовать контексту,
> но означать не "тупость" планировщика, как это указано в статье.

Ты не приводишь сценария, который бы соответствовал графику. Если бы на систему была сколь-нибудь существенная нагрузка кроме тех вычислений знаков пи, то мы бы это видели. Более того, на графике мы видим пару всплесков фоновой активности, когда вдруг другие ядра ненадолго просыпаются и начинают что-то делать.

> Спасибо за ссылку, могу вкинуть ещё парочку интересных.

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

Ответить | Правка | К родителю #345 | Наверх | Cообщить модератору

358. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (26), 07-Янв-20, 21:09 
Я уже начинаю уставать от этого диалога, если честно.

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

Дополню сценарий дополнительными комментариями:
Планировщик, запускаемый на только что освободившемся ядре 2 (которое могло выполнять очень лёгкую работу, и/или в конце добровольно отдавать управление, поэтому на графике, даже если это график полной нагрузки каждого ядра, оно могло быть любым кол-вом процентов), решает забрать нашу сложную ("single-threaded workload", поток A из 11.318) работу у ядра 0, которая недавно была вытеснена другим потоком по причине истечения кванта времени (SMT, preemptive scheduling). Это позволяет избежать простаивания на любом ядре в любой момент времени (что, конечно, хорошо), но да, это действительно перекидывание потока с ядра на ядро. Да, оно ведёт к L1 cache miss, но есть хороший шанс (обеспеченный алгоритмически, ибо планировщик Windows знает про сеты процессоров и NUMA ноды), что L2 или L3 всё ещё содержат нужные данные.
Подчеркну, что ядро 0, отдав наш поток A, могло начать заниматься чем угодно (любая ненулевая нагрузка любой сложности), но это должно было бы произойти (если есть хотя бы один ещё поток в очереди), ядро должно хотя бы иногда переключать контекст (опять, кванты времени). А ядро 2 могло в любой момент (разумеется, после того, как ядро 0 переключилась с потока А) украсть поток A, чтобы не простаивать. Объективно, это позволяет эффективнее использовать все ядра.

В статье же, по незнанию автора (статьи, ибо автор статьи и графика может не совпадать) этот эффект истолковывается иначе (и делаются неверные выводы), якобы ядро 2 крадёт поток A у ядра 0 только потому, что оно освободилось (в реальности ядро 0 просто отключилось от потока A по расписанию, и начало другую работу; если другой работы бы не было, планировщик продлил бы т.н. Quantum Target и вернул управление потоку A). Утверждая про некорректное истолкование, я напрямую опираюсь на чётко описанный материал в самой авторитетной технической книге по внутренностям Windows.

Ответить | Правка | К родителю #354 | Наверх | Cообщить модератору

370. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Ordu (ok), 08-Янв-20, 02:06 
>  Объективно, это позволяет эффективнее использовать все ядра.

Да, тогда когда занятых работой потоков больше чем ядер. Когда их меньше, получается фигня.

> В статье же, по незнанию автора (статьи, ибо автор статьи и графика
> может не совпадать) этот эффект истолковывается иначе (и делаются неверные выводы),
> якобы ядро 2 крадёт поток A у ядра 0 только потому,
> что оно освободилось (в реальности ядро 0 просто отключилось от потока
> A по расписанию, и начало другую работу; если другой работы бы
> не было, планировщик продлил бы т.н. Quantum Target и вернул управление
> потоку A). Утверждая про некорректное истолкование, я напрямую опираюсь на чётко
> описанный материал в самой авторитетной технической книге по внутренностям Windows.

Ах вот оно что... Знаешь как планировщику следовало бы поступить? Ему бы следовало мониторить активность задач, и заметить, что одна задача серьёзно занята чем-то и хочет сожрать столько процессорных квантов, сколько возможно, и в то же время он должен был заметить, что суммарная производительность остальных ядер более чем в 100 раз больше, чем требуется остальным задачам, а раз так, то следует прибить гвоздями занятую задачу к тому ядру, на котором он выполняется, и шедулить остальные задачи по свободным ядрам.

Именно это делает ядро linux, именно поэтому в аналогичной ситуации на линуксе, сильно занятая задача будет "захватывать" ядро на несколько секунд за раз, а не на 40 миллисекунд в среднем. Ядро windows этого не делает, что ты своими объяснениями подтверждаешь. Именно поэтому "dumb windows scheduler", и "ненужное перекидывание потоков".

Обрати внимание, несмотря на техническую неграмотность, автор статьи лучше тебя ухватил суть проблемы. Это очень похоже на тот редкий случай, когда избыточная грамотность вредит.

Самое интересное, что твоё более точное описание ничего не изменило в моём понимании ситуации. Ну, то есть, понятно, что крайне сложно выстроить идеальную ситуацию, когда в системе есть ровно один процесс, и всегда есть много процессов, и даже если они и спят 99.99% времени, всё же они иногда просыпаются и требуют квантов процессорного времени. Это настолько понятно, что не заслуживает даже упоминания, если по-хорошему. И способность венды держать занятый поток на одном ядре в идеальной ситуации, когда нет этих почти-всегда-спящих процессов -- совершенно бесполезная способность, потому что так не бывает. А как при этом объяснять это -- "ядро крадёт задачу" или "планировщик выделяет квант другой задаче" -- с мой точки зрения не важно совершенно: это просто разные уровни объяснений. Так же как одну и ту же программу можно написать на lisp'е или на asm'е, в каждом случае выбирая различные абстракции в предметной области, так и объяснять можно на разных уровнях и в разных абстракциях.

Ответить | Правка | К родителю #358 | Наверх | Cообщить модератору

374. "Линус Торвальдс опроверг проблемы с планировщиком задач, всп..."  +/
Сообщение от Аноним (26), 08-Янв-20, 10:55 
> Да, тогда когда занятых работой потоков больше чем ядер.

Это практически всегда так. На моём домашнем десктопе с 6 логическими ядрами, даже с незапущенным IIS и SQL Server, порядка 240 процессов и 4300 потоков. 0% ни на одно ядро я никогда не наблюдаю.

> Ему бы следовало мониторить активность задач, и заметить, что одна задача серьёзно занята чем-то и хочет сожрать столько процессорных квантов, сколько возможно,

Угу, он это и делает.

В Windows Server базовый квант времени (Quantum Reset) в 4 раза дольше, чем в Windows, специально чтобы снизить количество переключений контекста, но и в клиентских редакциях можно включить такой квант. В клиентских редакциях настоящий квант времени зависит от типа процесса: foreground/background, что тоже может продлевать квант времени. Также есть механизм Priority Boost, но он зависит от конкретной "single-threaded workload".
Когда заканчивается квант времени, почти всегда будет использован механизм, который позволяет просто продлить квант времени. Можно повысить приоритет (понизить niceness в Linux), тогда переключение потока на ядре будет ещё реже.

> суммарная производительность остальных ядер более чем в 100 раз больше, чем требуется остальным задачам

Очень опасное наблюдение, которое целиком опирается на неизменность нагрузки потоков (что, вообще говоря, очень большая редкость). Планировщик Windows записывает историю нагрузки, и использует её, но не на горячем пути планировщика, а в более редких/сложных ситуациях (см. далее).

> шедулить остальные задачи по свободным ядрам

Так и происходит, это свободные ядра сами делают (планировщик, запускаемый в их контексте).
Перекидывание может произойти в редком случае: все остальные потоки приоритета потока A и выше не готовы к выполнению. Чем "дальше" два ядра, тем меньше вероятность перекидывания (т.к. планировщик знает про конфигурацию ядер и итеративно расширяет поиск готовых к исполнению потоков, но до определённого порога, обычно границей является NUMA нода). Как видно из того же графика (опять, на нём нет даже масштаба времени), перекидывание практически всегда происходит между двумя (редко - тремя) ядрами (а в Zen 2 каждый CCX содержит 4 ядра!).

---

Почитал я про стандартный CFS (опирался на Wikipedia, https://blog.acolyer.org/2016/04/26/the-linux-scheduler-a-de.../ и на https://opensource.com/article/19/2/fair-scheduling-linux). Ни в коей мере не утверждаю правильность понимания, но следующий набор замечаний.

> The CFS scheduler has a target latency, which is the minimum amount of time—idealized to an infinitely small duration—required for every runnable task to get at least one turn on the processor.
> Of course, an idealized infinitely small duration must be approximated in the real world, and the default approximation is 20ms. Each runnable task then gets a 1/N slice of the target latency, where N is the number of tasks.

Немного (сильно) противоречит утверждению:

> сильно занятая задача будет "захватывать" ядро на несколько секунд за раз, а не на 40 миллисекунд в среднем.

Или это про то, что CFS будет всегда возвращать управление "сильно занятой задаче"? Но всё равно, что с остальными потоками в очереди? Никогда не получат ядро?

Далее вводится очень разумный концепт minimum granularity, затем знакомый термин virtual runtime (vruntime) (в Windows эта метрика более чёткая, в плане, на пару счётчиков больше).

> Suppose task T1 has run for its weighted 1/N slice, and runnable task T2 currently has the lowest virtual runtime (vruntime) among the tasks contending for the processor. The vruntime records, in nanoseconds, how long a task has run on the processor. In this case, T1 would be preempted in favor of T2.
> The scheduler tracks the vruntime for all tasks, runnable and blocked. The lower a task's vruntime, the more deserving the task is for time on the processor. CFS accordingly moves low-vruntime tasks towards the front of the scheduling line. Details are forthcoming because the line is implemented as a tree, not a list.

Но ведь это означает, что та самая "single-threaded workload" будет иметь очень большой vruntime и всегда оказываться далеко в "очереди" (которая на самом деле дерево) на исполнение, т.е. она всегда будет уступать более лёгким/быстрым (термин мой) потокам. Не проблема, но интересное замечание.

> Yet configurable scheduling domains can be used to group processors for load balancing or even segregation. If several processors share the same scheduling policy, then load balancing among them is an option; if a particular processor has a scheduling policy different from the others, then this processor would be segregated from the others with respect to scheduling.

В планировщике Windows это называется processor package, так что это знакомо.
Затем я открываю статью "The Linux Scheduler: a Decade of Wasted Cores", патчи из которой, как я слышал, были приняты в планировщик несколько лет назад. Интересный материал, затем я дохожу до этого момента:

> Now we have a new problem of balancing work across multiple runqueues.
> Suppose that one queue has one low-priority thread and another has ten high-priority threads.
> We could have each core check not only its runqueue but also the queues of other cores, but this would defeat the purpose of per-core runqueues.

Вот, серьёзное алгоритмическое отличие от планировщика Windows. Планировщик Windows полезет в очереди других ядер в порядке удалённости от текущего. В то время как CFS:

> Therefore, what Linux and most other schedulers do is periodically run a load-balancing algorithm that will keep the queues roughly balanced.
> Since load balancing is expensive the scheduler tries not to do it more often than is absolutely necessary. In addition to periodic load-balancing therefore, the scheduler can also trigger emergency load balancing when a core becomes idle.

Как я понимаю, Windows предпочитает балансировать нагрузку "здесь и сейчас", когда ядро готово войти в состояние простоя, а CFS выделяет это в отдельную регулярно запускающуюся рутину (с возможностью экстренного запуска как в Windows). Сравнивать лучше/хуже не буду, но отмечу, что подход CFS более предсказуем, в то время как планировщик Windows почти* всегда работает в контексте "надо прямо сейчас решить что дальше делать".

почти* - есть например отдельный алгоритм по борьбе с CPU Starvation и priority inversion, который работает вне контекста конкретного потока, но он асинхронный и работает как "консультант", рекомендуя правки к финальному решению планировщика Windows, опираясь на историю нагрузки каждого потока.

Сделаю вывод из прочитанного: Linux предпочитает простаивание ядер (если даже load balancing и перекинет все потоки кроме потока A на другие ядра), но удерживает (если load balancing так решит) потоки в пределах одной runqueue. Windows действует "жадно", решая, что лучше в каждый момент (но опираясь на историю в *некоторых* случаях), что может приводить к краже потоков, если эта кража дешёвая (внутри одного processor package, ибо более широкие поиски задействуются очень редко), а другой работы соответствующего приоритета нет. Это иногда случающееся перекидывание потоков имеет обоснование (снижение количества простаивающих ядер), но cache miss'ы могут случаться чаще (они весьма вероятны и на CFS, ибо если load balancing оставит хотя бы один другой поток на ядре, где выполняется поток A - точно так же будет борьба за L1 и L2 в течение каждого target granularity, а отношение ядер/потоков явно не в пользу ядер).

Ответить | Правка | К родителю #370 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру