2013-05-06 6 views
28

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

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

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

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

Заранее спасибо.

ответ

25

По умолчанию Linux timelice для процессов реального времени определяется в ядре 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) 

Обратите внимание, что фактическое квант выделяется для конкретного процесса may be different, чем это значение:

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

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

+0

Однако кажется, что 'rt.h' появился с ядром Linux 3.9. – backlash

+7

Прежде чем ** Linux kernel v3.9 **, определение 'RR_TIMESLICE' было расположено в [include/linux/sched.h] (http://lxr.free-electrons.com/source/include/linux/sched .h? v = 3.8 # L1227). До ** Linux kernel v3.4 ** определение было названо 'DEF_TIMESLICE' и находилось в [kernel/sched/sched.h] (http://lxr.free-electrons.com/source/kernel/sched/ sched.h? v = 3.3 # L43). –

+3

Обратите внимание, что этот ответ касается только потоков, запланированных с приоритетом в реальном времени. RR –

20

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

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

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

+0

Это правда и для пакетных процессов? – user239558

+0

Это верно для каждого процесса, который запускается в планировщике CFS (а не в режиме реального времени) –

7

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

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

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

2

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

же, как значение «/ Труды/системы/ядра/sched_rr_timeslice_ms», который входное значение в миллисекунды, но хранить и выход в джиффисах! Итак, когда ваш CONFIG_HZ = 100, вы обнаружите, что:

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

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