Какой планировщик процессов использует моя система Linux?

Вопрос или проблема

Я не совсем уверен, является ли Stack Overflow или Server Fault подходящим форумом для этого вопроса, но я попробую здесь.

Существует ли команда, которую я могу использовать, или файл, который я могу проверить, чтобы узнать, какой планировщик процессов я использую в своей системе Linux? Я не ищу планировщик ввода-вывода, а именно планировщик процессов, и пожалуйста, не ссылайтесь на руководства или инструкции о том, что такое планировщик, просто спрашиваю, есть ли команда или файл, который я могу выполнить/проверить, чтобы это увидеть. Я мог бы проверить документацию для своего ядра, но опять же, мне просто интересно, есть ли команда или файл, которые я могу проверить.

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

Существует ли команда, которую я могу использовать, или файл, который я могу проверить, чтобы узнать, какой планировщик процессов я использую в своей системе Linux?

Нет, потому что в отличие от планировщика ввода-вывода, существует только одна возможность: CFS (“Совершенно справедливый планировщик”), который включает возможности реального времени. CFS назван отчасти для того, чтобы отличить его от планировщика “O(1)”, который, как указано в той статье, был заменён в версии 2.6.23.

Октябрь 2023 года. Начиная с версии ядра 6.6, планировщик CFS был заменён на EEVDF (“Самый ранний подходящий виртуальный дедлайн”).

Что касается того, что это исходит от инженера Intel, это интересно, так как в последние годы они продемонстрировали огромный интерес к разработке Linux через свою собственную дистрибуцию, Clear Linux, которая в настоящее время превосходит все другие операционные системы на высокопроизводительном оборудовании Intel. “Заменён” означает, что старый планировщик больше недоступен. Чтобы узнать, какой из них использует ваша система, просто проверьте версию ядра:

< 2.6.23: Планировщик O(1).
>= 2.6.23 < 6.6: Совершенно справедливый планировщик.
>= 6.6: Планировщик EEVDF.

cat /proc/config.gz | gunzip | nano – (или cat /proc/config.gz | gunzip | gedit – , в этом случае) является лучшей альтернативой ответу eyoung100, который не требует “разархивирования” во временный файл.
Редактировать: Ещё проще – zcat /proc/config.gz | nano – или zcat /proc/config.gz | gedit –

Или, как предложил @terdon в комментариях к этому ответу, используйте zgrep. Я просто рекомендую другую строку поиска:

zgrep “CONFIG_SCHED_” /proc/config.gz

Если вы увидите, например: CONFIG_SCHED_y, это означает, что ядро настроено на использование планировщика MuQSS. Тем не менее, это не гарантирует, что это так. Вики Arch предполагает:

$ dmesg | grep -i muqss

Планировщик ЦП MuQSS v0.120 от Con Kolivas.

Попробуйте:

cat /proc/config.gz | gunzip > ~/running.config
nano -w ~/running.config
CTRL + W SCHEDULE

Смотрите здесь: Глава 14: Настройка

Если это поможет и я правильно понял вопросы, те, которые я использую уже какое-то время в Ubuntu, это:
ПЛАНИРОВЩИК ЦП
Перед ядром 6.6 это был CFS (Совершенно справедливый планировщик). Начиная с 6.6 и выше это будет EEVDF (Самый ранний подходящий виртуальный дедлайн). Обратите внимание, что EEVDF продолжает получать обновления. На версии 6.8, 6.9 и 6.10 он по-прежнему получает оптимизации. Я никогда не находил единого простого способа получить тип планировщика или ссылку на него, даже прочитал эту статью об этом https://blogs.igalia.com/changwoo/sched-ext-a-bpf-extensible-scheduler-class-part-1/ Я делал dmesg | grep ‘scheduler’, но получал только mq-deadline. Не было ничего вроде CFS или EEVDF.
ПЛАНИРОВЩИК ДИСКА
cat /sys/block/sda/queue/scheduler
sda можно заменить на ваш SSD, NVME и т.д., или даже можно проверить все сразу так (Следующее будет искать только устройства SDx & NVMEx):
cat /sys/block/{sd?,nvme*n1}/queue/scheduler
Это покажет что-то вроде этого:

Планировщик внутри скобок – это тот, который используется для этого блочного устройства. Так что для SDA это mq-deadline, а для случаев NVME он не использует никакого планировщика.

2024: Чтобы подвести итог разбросанной и актуальной информации из нескольких потоков:
Обзор
На сегодняшний день нет прямого метода идентификации, так как планировщик ЦП/процессов является неотъемлемой частью пространства ядра, и применение другого обычно осуществляется через ряд .patch файлов во время компиляции. Однако это может стать проще в версиях 6.12+ с введением пользовательских планировщиков, таких как семейство sched_ext (например: scx_bpfland, scx_lavd, scx_rusty, scx_rustland и т.д.), который может быть внедрён во время выполнения, а не жестко задан во время компиляции ядра. В настоящее время у вас может повезти найти подсказки (в лучшем случае) в .config ядра. В зависимости от процесса упаковки ядра дистрибуции и конфигурации файл конфигурации в реальном времени может находиться в разных местах, и метод извлечения варьируется в зависимости от того, сжат ли он.
[Ссылка] Места хранения конфигурации ядра
Наиболее распространенные места хранения конфигурации ядра в реальном времени:

/proc/config.gz (если CONFIG_IKCONFIG=m CONFIG_IKCONFIG_PROC=y был использован)
/lib/modules/$(uname -r)/build/.config (если был указан INSTALL_MOD_PATH и установлены заголовки ядра)
/boot/config-$(uname -r) (если процессы упаковки дистрибуции копируют его сюда)
/boot/config

В качестве альтернативы получите исходный код пакета ядра дистрибуции и найдите конфигурацию. В дистрибутивах с ручной настройкой, таких как Gentoo, вы обычно найдете её здесь после выполнения make menuconfig:

/usr/src/linux/.config
/usr/src/linux-$(uname -r)/.config

[Решение] Осмотр планировщика через конфигурацию ядра
Чтобы получить настройки планировщика сжатой конфигурации ядра без явной разархивации:
zgrep “CONFIG_SCHED_” /proc/config.gz

Несжатую конфигурацию ядра можно просмотреть напрямую с помощью:
grep -E “CONFIG_SCHED_” /lib/modules/$(uname -r)/build/.config

[Пример] Идентификация
Например, с планировщиком BORE вы увидите это (релевантная строка: CONFIG_SCHED_BORE=y):
$ zgrep “CONFIG_SCHED_” /proc/config.gz
CONFIG_SCHED_CORE=y
CONFIG_SCHED_MM_CID=y
CONFIG_SCHED_BORE=y
CONFIG_SCHED_AUTOGROUP=y
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_SCHED_CLUSTER=y
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
CONFIG_SCHED_MC_PRIO=y
CONFIG_SCHED_HRTICK=y
CONFIG_SCHED_STACK_END_CHECK=y
CONFIG_SCHED_DEBUG=y
CONFIG_SCHED_INFO=y
CONFIG_SCHED_TRACER=y

Некоторые дистрибутивы или пользовательские пакеты ядра могут уже указывать эту информацию в:
$ uname -a
Linux archlinux 6.9.8-273-tkg-bore #1 SMP PREEMPT_DYNAMIC TKG Пт, 12 Июл 2024 19:40:19 +0000 x86_64 GNU/Linux

В итоге, если нет никаких указаний на то, какой планировщик используется в конфигурации ядра, это, скорее всего, планировщик по умолчанию от upstream, который является EEVDF с версии 6.6 вместо CFS. Чтобы избежать заблуждений, проверьте исходный код пакета ядра вашей дистрибуции.

Ответ или решение

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

Определение планировщика процессов

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

Основные планировщики Linux:

  1. O(1) планировщик — использовался в версиях ядра до 2.6.23.
  2. Completely Fair Scheduler (CFS) — введен с версии 2.6.23 и был основным планировщиком до версии 6.6.
  3. Earliest Eligible Virtual Deadline First (EEVDF) — стал основным планировщиком начиная с версии 6.6.

Проверка версии ядра

Первым шагом является проверка версии ядра вашей системы. Это можно сделать с помощью команды:

uname -r

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

  • Версия < 2.6.23: O(1)
  • Версия от 2.6.23 до < 6.6: CFS
  • Версия >= 6.6: EEVDF

Получение информации о планировщике

Для получения более детальной информации о том, какой планировщик действительно используется в вашей системе, вы можете просмотреть конфигурационный файл ядра. Если конфигурация вашего ядра была собрана с опцией CONFIG_IKCONFIG, то можно использовать следующую команду для анализа сжатого конфигурационного файла:

zgrep "CONFIG_SCHED_" /proc/config.gz

Вывод этой команды покажет текущие настройки, связанные с планировщиком. Например:

  • CONFIG_SCHED_CFS — означает, что используется CFS.
  • CONFIG_SCHED_EEVDF — означает, что используется EEVDF.

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

Рассмотрение альтернативных источников конфигурации

Кроме проверки /proc/config.gz, можно также проверить следующие файлы:

  • /boot/config-$(uname -r)
  • /lib/modules/$(uname -r)/build/.config

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

Заключение

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

  1. Используйте uname -r, чтобы узнать версию ядра.
  2. Примените zgrep "CONFIG_SCHED_" /proc/config.gz для проверки конфигурации планировщика.
  3. В случае необходимости проверьте другие конфигурационные файлы, связанные с вашим ядром.

Такой подход даст вам четкое понимание того, какой планировщик процессов управляет вашими задачами в Linux.

Оцените материал
Добавить комментарий

Капча загружается...