Подтвердить что ты не робот

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

Я ищу значение временного фрагмента (или кванта) моего ядра Linux.

Есть ли файл /proc, который предоставляет такую ​​информацию?

(Или) Является ли он корректным в заголовке Linux моих дистрибутивов?

(Или) Есть ли функция C API Linux (возможно, sysinfo), которая раскрывает это значение?

Спасибо заранее.

4b9b3361

Ответ 1

Квант, выделенный для конкретного процесса, может варьироваться:

Вы можете настроить "срез", отредактировав sched_latency_ns и sched_min_granularity_ns, но обратите внимание, что "срез" не является фиксированным квантом. Также обратите внимание, что решения о преимущественном использовании CFS основаны на мгновенном состоянии. Задача могла получить полный (переменный) "срез" времени процессора, но преемственность будет срабатывать только в том случае, если доступна более достойная задача, поэтому "срез" не является "максимальным непрерывным временем процессора", что вы можете ожидать быть.. но это несколько похоже.

Для целевых процессов реального времени, в которых используется SCHED_RR, по умолчанию в ядре Linux определяется значение времени по умолчанию как RR_TIMESLICE в include/linux/sched/rt.h.

/*
 * default timeslice is 100 msecs (used only for SCHED_RR tasks).
 * Timeslices get refilled after they expire.
 */
#define RR_TIMESLICE            (100 * HZ / 1000)

Вы можете использовать sched_rr_get_interval() для получения интервала SCHED_RR для определенного процесса SCHED_RR.

Ответ 2

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

Временная шкала всегда будет находиться между sysctl_sched_min_granularity и sysctl_sched_latency, которые по умолчанию равны 0,75 мс и 6 мс соответственно и определены в kernel/sched/fair.c.

Но фактический тайм-лист не экспортируется в пользовательское пространство.

Ответ 3

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

Файлы sched_latency_ns и sched_min_granularity_ns (предназначенные для целей отладки и видимые только в том случае, если ядро ​​настроено с помощью CONFIG_SCHED_DEBUG) влияют на планирование процессов SCHED_OTHER. Как отмечалось в ответе Алексея Шмалько, временной срез под CFS не фиксирован (и не экспортируется в пространство пользователя), и будет зависеть от параметров и факторов ядра, таких как хорошее значение процесса.

sched_rr_get_interval() возвращает фиксированное значение, которое является квантом, гарантированным процессом SCHED_RR, если только он не вытеснен или не блокируется, В традиционном Linux квант SCHED_RR составляет 0,1 секунды. Начиная с Linux 3.9, ограничение настраивается через файл /proc/sys/kernel/sched_rr_timeslice_ms, где квант выражается как миллисекунда, значение по умолчанию 100.

Ответ 4

Я просмотрел эти билеты по одному и тому же сомнению временного фрагмента SCHED_RR в Linux. Но я не могу получить ясный ответ как отсюда, так и от исходного кода ядра. После дополнительной проверки я обнаружил, что ключевой момент - "RR_TIMESLICE" - это срез времени по умолчанию в jiffies, а не миллисекунда! Таким образом, временной срез по умолчанию для SCHED_RR всегда равен 100 мс, независимо от того, какой HZ вы сконфигурировали.

То же самое, что и значение "/proc/sys/kernel/sched_rr_timeslice_ms", значение которого вводится в миллисекундах, но оно хранится и выводится в jiffies! Итак, когда ваш CONFIG_HZ = 100, вы обнаружите, что:

# echo 100 > /proc/sys/kernel/sched_rr_timeslice_ms
# cat /proc/sys/kernel/sched_rr_timeslice_ms
10

Это немного запуталось. Надеюсь, это поможет вам понять это!