Я изучал планировщик CFS.Согласно CFS, vruntime - это время, в течение которого процесс запускается на процессоре.Итак, как только процесс потребляет некоторый процессор, его vruntime увеличивается.
Чтобы глубже понять концепцию context_switch, я рассмотрел реализацию метода context_switch файла kernel / sched / core.c.
context_switch(struct rq *rq, struct task_struct *prev,
struct task_struct *next)
Чтобы узнать процессы, участвующие в переключении контекста, особенно чтобы узнать, какой процесс запланирован и какой процесс запланирован, я добавил
trace_printk(KERN_INFO "**$$,traceme,%d,%llu,%llu,%d,%llu,%llu\n", (int)(prev->pid),prev->se.vruntime,prev->se.sum_exec_runtime, (int)(next->pid),next->se.vruntime,next->se.sum_exec_runtime);
в функцию context_switch () ядра / sched / core.cфайл.
Некоторые примеры данных после очистки
//(prev->pid),prev->se.vruntime,prev->se.sum_exec_runtime, (int)(next->pid),next->se.vruntime,next->se.sum_exec_runtime
Line-1 : 7560,24498429469681,823155565,7566,24498418258892,1637962
Line-2 : 7566,24498418261234,1640304,7580,24498417733416,1018016
Line-3 : 7580,24498417752807,1037407,686,24498429468802,48339928895
Line-4 : 686,24498429469817,48339929910,7566,24498418261234,1640304
Line-5 : 7566,24498418263610,1642680,7581,24498417762357,1038126
Line-6 : 7581,24498417781339,1057108,7560,24498429469681,823155565
Line-7 : 7560,24498429470724,823156608,7566,24498418263610,1642680
Line-8 : 7566,24498418265980,1645050,7582,24498418395747,1202608
Line-9 : 7582,24498418414400,1221261,686,24498429469817,48339929910
Line-10: 686,24498429470804,48339930897,7566,24498418265980,1645050
Line-11: 7566,24498418268334,1647404,7583,24498417826636,1168325
Line-12: 7583,24498417845297,1186986,7560,24498429470724,823156608
Line-13: 7560,24498429471802,823157686,7566,24498418268334,1647404
Line-14: 7566,24498418270800,1649870,686,24498429470804,48339930897
// Up to this line vruntime of all process increased in each run as expected.
Line-15: 686,24498438028365,48348488458,7560,24498429471802,823157686
Line-16: 0,0,0,7,918077230457,2930949708
Line-17: 7,918077232097,2930951348,0,0,0
Line-18: 7560,6056741110796,823305719,7584,24498429478909,1156272 <---- Here vruntime of process 7560 is decreased . Why?
Из приведенных выше данных мы можем определить, сколько времени выполнялся каждый процесс перед планированием.
p_pid p_vrt p_sum_exe_rt n_pid n_vrt n_sum_exe_rt | prev_tslice next_tslice CPU
7560 , 24498429469681, 823155565, 7566 , 24498418258892, 1637962, | , 1191 , 2327
7566 , 24498418261234, 1640304, 7580 , 24498417733416, 1018016, | , 2342 , 19462
7580 , 24498417752807, 1037407, 686 , 24498429468802, 48339928895, | , 19391 , 1003
686 , 24498429469817, 48339929910, 7566 , 24498418261234, 1640304, | , 1015 , 2342
7566 , 24498418263610, 1642680, 7581 , 24498417762357, 1038126, | , 2376 , 18429
7581 , 24498417781339, 1057108, 7560 , 24498429469681, 823155565, | , 18982 , 1191
7560 , 24498429470724, 823156608, 7566 , 24498418263610, 1642680, | , 1043 , 2376
7566 , 24498418265980, 1645050, 7582 , 24498418395747, 1202608, | , 2370 , 19520
7582 , 24498418414400, 1221261, 686 , 24498429469817, 48339929910, | , 18653 , 1015
686 , 24498429470804, 48339930897, 7566 , 24498418265980, 1645050, | , 987 , 2370
7566 , 24498418268334, 1647404, 7583 , 24498417826636, 1168325, | , 2354 , 19617
7583 , 24498417845297, 1186986, 7560 , 24498429470724, 823156608, | , 18661 , 1043
7560 , 24498429471802, 823157686, 7566 , 24498418268334, 1647404, | , 1078 , 2354
7566 , 24498418270800, 1649870, 686 , 24498429470804, 48339930897, | , 2466 , 987
686 , 24498438028365, 48348488458, 7560 , 24498429471802, 823157686, | , 8557561 , 1078
//----------------------- Up to this line vruntime is increased
7560 , 6056741110796, 823305719, 7584 , 24498429478909, 1156272, | , 148033 , 18671
Все выглядит идеально - время выполнения процесса увеличивается с каждым запуском.
К моему удивлению в последней строке, время выполнения процесса уменьшается .
vruntime процесса с pid 7560 уменьшено (с 24498429471802 до 6056741110796) в последней строке - Почему?
Как это возможно vruntimeзапущенный процесс уменьшается даже тогда, когда процесс закреплен за конкретным ядром процессора (поэтому нет шансов на миграцию на другое ядро процессора)?
- Еще одно важное наблюдение, при другом запуске запуска процесса 7560для более короткого временного интервала, но в этот последний раз он получает более высокий временной интервал.Есть ли взаимосвязь между большим временным интервалом и уменьшением vruntime?
Я использую Debian 8.0 и Ubuntu 16.04, Kernel 3.16.35, и это произошло в обеих ОС.
Любые ссылки, чтобы понять причину, помогут вам.