Вопрос или проблема
Я не совсем уверен, является ли 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:
- O(1) планировщик — использовался в версиях ядра до 2.6.23.
- Completely Fair Scheduler (CFS) — введен с версии 2.6.23 и был основным планировщиком до версии 6.6.
- 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
Эти файлы могут содержать настройки ядра, и с их помощью можно точно понять, какой планировщик используется.
Заключение
Итак, чтобы узнать, какой процессный планировщик используется в вашей системе, выполните следующие шаги:
- Используйте
uname -r
, чтобы узнать версию ядра. - Примените
zgrep "CONFIG_SCHED_" /proc/config.gz
для проверки конфигурации планировщика. - В случае необходимости проверьте другие конфигурационные файлы, связанные с вашим ядром.
Такой подход даст вам четкое понимание того, какой планировщик процессов управляет вашими задачами в Linux.