LINUX.ORG.RU
решено ФорумTalks

Ядро Linux было случайно жестко запрограммировано максимум на 8 ядер за последние 15 лет, и никто этого не заметил.

 ,


0

4

В этом коммите добавлено автоматическое масштабирование настроек планировщика в зависимости от количества ядер в 2009 году.

Он был случайно жестко запрограммирован на максимальное количество ядер 8. Упс. Магическое значение взято из более старого коммита и осталось таким, каким оно было. Полный список различий можно найти на GitHub.

https://github.com/torvalds/linux/commit/acb4a848da821a095ae9e4d8b22ae2d9633ba5cd

Интересной настройкой является минимальная степень детализации. Предполагается, что это позволяет задачам выполняться в течение минимального времени 0,75 миллисекунды (или 3 мс в многоядерных системах), когда система перегружена (за период нужно выполнить больше задач, чем процессора). доступный).

В этом коммите в ядре v6 параметр min_granularity был переименован в base_slice.

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

  • В официальных комментариях к коду говорится, что он масштабируется с помощью log2(1+ядер), но это не так.
  • Все комментарии в коде некорректны.
  • Официальная документация и справочные страницы неверны.
  • Каждая статья в блоге, ответ на вопрос о переполнении стека и когда-либо опубликованное руководство по планировщику неверны.

Полная новость: https://thehftguy.com/2023/11/14/the-linux-kernel-has-been-accidentally-hardcoded-to-a-maximum-of-8-cores-for-nearly-20-years/

https://news.ycombinator.com/item?id=38261242

This article is clickbait and in no way has the kernel been hardcoded to a maximum of 8 cores. If you read the commit [0], you can see, that a /certain/ scaling factor for scheduling can scale linearly or logarithmically with the number of cores and for calculating this scaling factor, the number is capped to 8. This has nothing to do with the number of cores that can actually be used.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)

Это что значит, сейчас разблокинуют и все у кого больше 8 ядер разгонятся? А гипер-трейдинг за ядро считаются в данном контексте?

Kolins ★★★★
()

base_slice масштабируется в зависимости от количества процессоров

не ядро, и не линукс, а base_slice.

ок, base_slice не масштабируется. для количества ядер больше 8-и можно было бы нарезать и потоньше.

log2(8) = 3
log2(12) ~ 3.5
log2(16) = 4
log2(24) ~ 4.5

ну такоэ.

olelookoe ★★★
()

Кликбейт какой-то. Осуждаю.

wandrien ★★
()

Ты должен был добавить в конец своей статьи строчку «Переведено Сократ Персональный»

r0ck3r ★★★★★
()
Ответ на: комментарий от targitaj

а как тогда оно сейчас работает?

Нормально работает, там же в коде все явно написано.

factor задан в диапазоне от 1 до 8 в зависимости от режима «скейлинга». Количество ядер там лишь распределяет значения внутри диапазона. Если 8 и больше ядер то будет 8.

Даже если вместо 8 ядер поставить реальное количество, например 128 ядер то фактор все равно будет 8:

cpus = 128
factor = 1 + ilog2(cpus); // 1+7 = 8

Да, на 256 ядрах будет уже 9, но таких процов на x86-64 я не знаю. Может следующие AMD EPYC такие будут.

Obezyan
()
Ответ на: комментарий от Jaeger1999

Так и где же правда?

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

goingUp ★★★★★
()

В этом коммите добавлено автоматическое масштабирование настроек планировщика в зависимости от количества ядер в 2009 году.

Он был случайно жестко запрограммирован на максимальное количество ядер 8. Упс.

Нормально. Лишь спустя 10 лет стали доступны первые десктопные процессоры с кол-вом ядер более 8.

gag ★★★★★
()

ответ на вопрос о переполнении стека

stack overflow answer

это машинный перевод?..

caryoscelus
()
Ответ на: комментарий от targitaj

Не очень ясен смысл драмы.

А её нет. Всё в порядке.

wandrien ★★
()
Ответ на: комментарий от targitaj

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

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от ripgrep

Стабилизация API интерфейса может быть, когда одно и тоже может делаться в теории по разному, но сам интерфейс чтобы что-то сделать должен быть железно одинаковым. Проще говоря кишки меняются, а суть остаётся, лишнего вызова не будет так как inline так что это чисто для удобства. Больше мыслей нет.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от HE_KOT

Чего невозможно? Написано всё нормально по-русски. Проблема в другом: там враньё.

firkax ★★★★★
()
Ответ на: комментарий от targitaj

Не очень ясен смысл драмы.

Драма в том что ее нет. Все работает как было задумано. Планровщик трахнул журналиста.

Obezyan
()
Ответ на: комментарий от targitaj

Планировщик будет нарезать время на чуть меньше кванты, чем надо (думая что ядер мало, они дефицит и надо чтоб всем досталось), и это чуть увеличит оверхед его работы, когда можно было снизить.

Хотя по-моему если ядер больше чем желающих получить проц процессов то можно хоть по 1 секунде выделять, но линукс так не делает ни при каких обстоятельствах, и дело не в том коммите.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

это чуть увеличит оверхед его работы, когда можно было снизить

так, а на текущих машинах это пофиксят? В смысле, там же несколько ядер в статусе LTS?

targitaj ★★★★★
()
Ответ на: комментарий от targitaj

У меня на рабочей машине 48 потоков AMD Ryzen Threadripper 3960X 24-Core Processor

А какая разница? У меня 64 потока в AMD Ryzen Threadripper 3970X 32-Core Processor и у нас обоих factor = 4.

Если бы в формуле расчета не было ограничения на 8 ядер, а использовались все ядра то у вас был бы factor 6.6, а у меня - 7.

Т.к. фактор является знаменателем в формуле определения времени на выполнение программы то при использовании всех ядер программы получали бы тем меньшие промежутки времени для выполнения чем больше у нас ядер. И нафига оно надо? Поэтому и ограничили диапазон в линейном режиме до 8, а в логарифмическом до 4х.

Obezyan
()
Ответ на: комментарий от Obezyan

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

не наоборот?

targitaj ★★★★★
()
Ответ на: комментарий от targitaj

не наоборот?

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

Obezyan
()
Ответ на: комментарий от targitaj

Кто их знает. Да какая разница? Там скорее всего меньше процента отличие в итоговой производительности.

firkax ★★★★★
()
Ответ на: комментарий от Obezyan

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

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

firkax ★★★★★
()
Ответ на: комментарий от firkax

Я не знаю о какой формуле речь, но подозреваю ты куда-то не туда смотришь.

Обезьян смотрит вот сюда:

#define WRT_SYSCTL(name) \
	(normalized_sysctl_##name = sysctl_##name / (factor))
	WRT_SYSCTL(sched_base_slice);
#undef WRT_SYSCTL

разворачивает в голове

normalized_sysctl_sched_base_slice = sysctl_sched_base_slice / factor

и находит эти переменные там же в начале файла:

/*
 * Minimal preemption granularity for CPU-bound tasks:
 *
 * (default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds)
 */
unsigned int sysctl_sched_base_slice			= 750000ULL;
static unsigned int normalized_sysctl_sched_base_slice	= 750000ULL;
Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)
Ответ на: комментарий от Obezyan

@firkax - там кстати ошибка, в комментарии. Код выполняется как:

normalized_sysctl_sched_base_slice = sysctl_sched_base_slice / factor

т.е.

0.75 msec / (1 + ilog(ncpus))

а в комментарии указано умножить:

(default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds)

только журналистам не рассказывайте…

Obezyan
()

Не нужны вообще эти кванты. Даёшь каждому процессу по ядру! А кто процессы множит без необходимости - тех макать мордой в сики

DumLemming ★★
()
Ответ на: комментарий от Obezyan

Всё верно.

normalized_sysctl_sched_base_slice - это некоторая условная базовая константа которая по умолчанию 0.75мс

sysctl_sched_base_slice - это реальная длительность кванта времени

sysctl_sched_base_slice = normalized_sysctl_sched_base_slice * factor

Если ты через sysctl меняешь длину кванта (настоящую), то он меняет и normalized на такое число, из которого могла бы посчитаться установленная длина. Делается это для того (и только для того, больше нигде normalized не используется), чтобы при смене sysctl_sched_tunable_scaling и формулы подсчёта фактора автоматически изменить sysctl_sched_base_slice по новой формуле, но не на дефолтную, а с учётом ранее сделанных изменений.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от apt_install_lrzsz

Селфи с процом? :)

Вот из информации из системы: Процессоры: 24 × Intel® Xeon® CPU E5-2670 v3 @ 2.30GHz

th3m3 ★★★★★
()
Ответ на: комментарий от targitaj

У меня 24, но подумываю Xeon, тоже с 48 потоками взять.

th3m3 ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.