LINUX.ORG.RU

hrtimer_nanosleep latency можно ли снизить без SCHED_FIFO/SCHED_RR?

 ,


0

1

к примеру запускаю бенчмарк latency с приоритетом SCHED_OTHER вижу что средняя задержка 51us:

$ cyclictest -N -n -t 4 --policy=other -l 10000
# /dev/cpu_dma_latency set to 0us
policy: other/other: loadavg: 0.26 0.24 0.58 1/403 9917           

T: 0 ( 9884) P: 0 I:1000 C:  10000 Min:   9346 Act:   50931 Avg:   51096 Max:  295918
T: 1 ( 9885) P: 0 I:1500 C:   6669 Min:   3103 Act:   51031 Avg:   51264 Max:  273922
T: 2 ( 9886) P: 0 I:2000 C:   5002 Min:   5635 Act:   51020 Avg:   51055 Max:  157874
T: 3 ( 9887) P: 0 I:2500 C:   4001 Min:   2565 Act:   51159 Avg:   47168 Max:  367442
Проверял так же самописной простейшей прогой, в более чем 99% случаев значение задержки 51-52us. cpu cstates отключены, с ними на 10us больше.

если запускать с приоритетом SCHED_FIFO задержка 1us.

пробовал по разному собирать ядро меняя всячески конфиги PREEMT/HZ 100-1000/NOHZ, ситуация не меняется ни в какую сторону. сижу на gentoo, но пробовал archlinux, таже latency 51us. менял значения в файлах /proc/sys/kernel/sched_latency_ns sched_min_granularity_ns, тоже без изменений.

Откуда это значение в 51us? если у ядра есть какой то time slice задающий минимальное время работы процесса, то почему результат измерения latency не размазан равномерно по этому периоду?

отвечу

в ядре существет константа определяющая величину на которую можно максимально продлить таймер, чтобы не прерывать системы очень часто: .timer_slack_ns = 50000, /* 50 usec default slack */ в функции hrtimer_nanosleep() ядра этот параметр применяться к процессам имеющими не deadline и не realtime scheluder policy:

long hrtimer_nanosleep(const struct timespec64 *rqtp,
		       const enum hrtimer_mode mode, const clockid_t clockid)
{
...
slack = current->timer_slack_ns;
if (dl_task(current) || rt_task(current))
	slack = 0;

hrtimer_init_on_stack(&t.timer, clockid, mode);
hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack);
...
получается точность таймера для обычных процессов нельзя повысить без редактирования ядра или выставления им scheluder policy - RT.

str8fast ()