Вибір процесора
Відео: Який процесор купити? Аналіз ринку, вересень 2016
При вставці таймера потрібно прийняти одне важливе рішення, що стосується вибору відповідної таблиці, - іншими словами, потрібно вибрати найбільш оптимальний процесор.
Якщо у таймера немає пов`язаного з ним DPC-виклику, ядро сканує все не запарковані процесори в поточній групі процесорів. Якщо поточний процесор запаркований, вибирається наступний процесор групи, в іншому випадку використовується поточний процесор. З іншого боку, якщо з таймером пов`язаний якийсь DPC-виклик, код вставки просто зупиняє вибір на цільовому процесорі, який пов`язаний з DPC, і вибирає таблицю таймера цього процесора.
У тому випадку, якщо розробник драйвера не вказав цільової процесор для DPC, ядро має зробити свій вибір. Оскільки розробники драйверів зазвичай очікують, що DPC-виклик буде виконаний на тому ж самому процесорі, на якому в момент вставки був запущений код драйвера, ядро зазвичай вибирає центральний процесор 0. Саме він є процесором, що стежить за часом, який завжди буде активний для обробки переривань від годин. Але на серверних системах ядро вибирає процесор так, як ніби DPC-виклику не існує, використовуючи тільки що розглянуті принципи вибору.
Відео: Як вибрати процесор | Що потрібно знати при виборі процесора і збірці PC
Така поведінка націлене на те, щоб підвищити продуктивність і масштабованість серверних систем, що використовують Hyper-V, хоча вона може підвищити продуктивність на будь-який сильно завантаженої системі.
У міру накопичення системних таймерів, через те, що більшість драйверів не створюють родинних зв`язків між своїми DPC-викликами, центральний процесор 0 стає все більш і більш завантаженим виконанням коду закінчення часу таймера.
Це підвищує час відгуку і може навіть стати причиною тривалих затримок виконання DPC-викликів або їх втрати. Крім того, закінчення часу таймера може почати конкурувати з DPC-таймером, зазвичай пов`язаних з обробкою переривання, ініційованого драйвером, наприклад кодом мережевого пакету, що призводить до уповільнення роботи всієї системи. Цей процес посилюється в сценарії Hyper-V, де центральний процесор 0 повинен обробляти таймери і DPC-виклики, пов`язані з потенційним безліччю віртуальних машин, у кожній з яких є свої таймери і пов`язані з ними пристрої.
Шляхом розподілу таймерів між процесорами, як показано на малюнку, завантаження кожного процесора, пов`язана із закінченням часу таймера, повністю розподіляється між незапаркованнимі логічними процесорами.
На 32-розрядних системах об`єкт таймера зберігає номер пов`язаного з ним процесора в заголовку диспетчера, а на 64-разряднийх системах цей номер зберігається в самому об`єкті.
ПРИМІТКА. Це поведінка управляється змінної ядра KiDistributeTimers, яка ініціалізується на основі параметра реєстру, має різне значення для установки сервера і клієнта. Це поведінка може бути налаштоване по-різному шляхом зміни або створення значення DistributeTimers, відмінного від його вихідного, заснованого на SKU значення в параметрі HKLM SYSTEM CurrentControlSet Control SessionManager kernel.
Виведення списку системних таймерів
Щоб вивести дамп всіх, на даний момент зареєстрованих в системі таймерів, і отримати інформацію про DPC-викликах, пов`язаних з кожним таймером (якщо такі є), можна скористатися отладчиком ядра.
Відео: Який процесор купити? Аналіз ринку, жовтень 2016
Як приклад подивіться на наступний висновок.
[Lkd>! Timer
Dump system timers
Interrupt time: 61876995 000003df [4 / 5/2010 18: 58: 09.189]
List Timer Interrupt Low / High Fire Time DPC / thread
PROCESSOR 0 (nt! _KTIMER_TABLE fffff80001bfd080)
5 fffffa8003099810 627684ac 000003df [4 / 5/2010 18: 58: 10.756]
NDIS! NdisMTimerObjectDpc (DPC @ fffffa8003099850)
13 fffffa8003027278 272dde78 000004cf [4 / 6/2010 23: 34: 30.510] NDIS! NdisMWakeUpDpcX
(DPC @ fffffa80030272b8)
fffffa8003029278 272e0588 000004cf [4 / 6/2010 23: 34: 30.511] NDIS! ndisMWakeUpDpcX
(DPC @ fffffa80030292b8)
fffffa8003025278 272e0588 000004cf [4 / 6/2010 23: 34: 30.511] NDIS! ndisMWakeUpDpcX
(DPC @ fffffa80030252b8)
fffffa8003023278 272e2c99 000004cf [4 / 6/2010 23: 34: 30.512] NDIS! ndisMWakeUpDpcX
(DPC @ fffffa80030232b8)
16 fffffa8006096c20 6c1613a6 000003df [4 / 5/2010 18: 58: 26.901] thread
fffffa8006096b60
19 fffff80001c85c40 64f9aeb5 000003df [4 / 5/2010 18: 58: 14.971]
nt! CmpLazyFlushDpcRoutine (DPC @ fffff80001c85c00)
31 fffffa8002c43660 P dc527b9b 000003e8 [4 / 5/2010 20: 06: 00.673]
intelppm! LongCapTraceDpc (DPC @ fffffa8002c436a0)
40 fffff80001c86f60 62ca1080 000003df [4 / 5/2010 18: 58: 11.304] nt! CcScanDpc (DPC
@ Fffff80001c86f20)
fffff88004039710 62ca1080 000003df [4 / 5/2010 18: 58: 11.304]
luafv! ScavengerTimerRoutine (DPC @ fffff88004039750)
...
252 fffffa800458ed50 62619a91 000003df [4 / 5/2010 18: 58: 10.619] netbt! TimerExpiry
(DPC @ fffffa800458ed10)
fffffa8004599b60 fe2fc6ce 000003e0 [4 / 5/2010 19: 09: 41.514] netbt! TimerExpiry
(DPC @ fffffa8004599b20)
PROCESSOR 1 (nt! _KTIMER_TABLE fffff880009ba380)
0 fffffa8004ec9700 626be121 000003df [4 / 5/2010 18: 58: 10.686] thread
fffffa80027f3060
fffff80001c84dd0 P 70b3f446 000003df [4 / 5/2010 18: 58: 34.647]
nt! IopIrpStackProfilerTimer (DPC @ fffff80001c84e10)
11 fffffa8005c26cd0 62859842 000003df [4 / 5/2010 18: 58: 10.855] afd! AfdTimeoutPoll
(DPC @ fffffa8005c26c90)
fffffa8002ce8160 6e6c45f4 000003df [4 / 5/2010 18: 58: 30.822] thread
fffffa80053c2b60
fffffa8004fdb3d0 77f0c2cb 000003df [4 / 5/2010 18: 58: 46.789] thread
fffffa8004f4bb60
13 fffffa8005051c20 60713a93 800003df [NEVER] thread
fffffa8005051b60
15 fffffa8005ede120 77f9fb8c 000003df [4 / 5/2010 18: 58: 46.850] thread
fffffa8005ede060
20 fffffa8004f40ef0 629a3748 000003df [4 / 5/2010 18: 58: 10.990] thread
fffffa8004f4bb60
22 fffffa8005195120 6500ec7a 000003df [4 / 5/2010 18: 58: 15.019] thread
fffffa8005195060
28 fffffa8004760e20 62ad4e07 000003df [4 / 5/2010 18: 58: 11.115] btaudio (DPC
@ Fffffa8004760e60) + 12d10
31 fffffa8002c40660 P dc527b9b 000003e8 [4 / 5/2010 20: 06: 00.673]
intelppm! LongCapTraceDpc (DPC @ fffffa8002c406a0)
...
232 fffff80001c85040 P 62317a00 000003df [4 / 5/2010 18: 58: 10.304] nt! IopTimerDispatch
(DPC @ fffff80001c85080)
fffff80001c26fc0 P 6493d400 000003df [4 / 5/2010 18: 58: 14.304]
nt! EtwpAdjustBuffersDpcRoutine (DPC @ fffff80001c26f80)
235 fffffa80047471a8 6238ba5c 000003df [4 / 5/2010 18: 58: 10.351] stwrt64 (DPC
@ Fffffa80047471e8) + 67d4
242 fffff880023ae480 11228580 000003e1 [4 / 5/2010 19: 10: 13.304]
dfsc! DfscTimerDispatch
(DPC @ fffff880023ae4c0)
245 fffff800020156b8 P 72fb2569 000003df [4 / 5/2010 18: 58: 38.469]
hal! HalpCmcDeferredRoutine (DPC @ fffff800020156f8)
248 fffffa80029ee460 P 62578455 000003df [4 / 5/2010 18: 58: 10.553]
ataport! IdePortTickHandler (DPC @ fffffa80029ee4a0)
fffffa8002776460 P 62578455 000003df [4 / 5/2010 18: 58: 10.553]
ataport! IdePortTickHandler (DPC @ fffffa80027764a0)
fffff88001678500 fe2f836f 000003e0 [4 / 5/2010 19: 09: 41.512]
cng! seedFileDpcRoutine
(DPC @ fffff880016784c0)
fffff80001c25b80 885e52b3 0064a048 [12/31/2099 23: 00: 00.008]
nt! ExpCenturyDpcRoutine (DPC @ fffff80001c25bc0)
Total Timers: 254, Maximum List: 8
В даному прикладі є кілька драйверних таймерів з коротким терміном закінчення часу, які пов`язані з драйверами Ndis.sys і Afd.sys (обидва цих драйвера мають відношення до мережі), а також з драйверами аудіосистеми, Bluetooth, і ATA / IDE. Є також фонові, допоміжні таймери з закінченням часу, наприклад, пов`язані з управлінням електроживленням, ETW, скиданням на диск системного реєстру і з виртуализацией управління обліковими записами користувачів (Users Account Control, UAC).
Крім цього існує близько десятка таймерів, які не мають пов`язаних з ними DPC-викликів - найчастіше це свідчить про те, що ці таймери призначеного для користувача режиму або режиму ядра використовуються для диспетчеризації очікувань. Щоб перевірити це, можна скористатися командою! Thread щодо покажчиків потоків.
Відео: ТОП 5 кращих процесорів для ігор
І нарешті, є три цікавих таймера, які завжди присутні на системі Windows, це таймер, який перевіряє зміна часового поясу при переході на літній час, таймер, який перевіряє наступ нового року, і таймер, який перевіряє входження в наступне століття. Їх можна легко розпізнати по досить тривалого терміну закінчення часу, якщо тільки не виконувати цей експеримент напередодні одного з цих подій.