.. include:: ../disclaimer-zh_TW.rst :Original: Documentation/admin-guide/lockup-watchdogs.rst :Translator: Hailong Liu <liu.hailong6@zte.com.cn> .. _tw_lockup-watchdogs: ================================================= Softlockup與hardlockup檢測機制(åˆå:nmi_watchdog) ================================================= Linuxä¸å…§æ ¸å¯¦ç¾äº†ä¸€ç¨®ç”¨ä»¥æª¢æ¸¬ç³»çµ±ç™¼ç”Ÿsoftlockupå’Œhardlockup的看門狗機制。 Softlockupæ˜¯ä¸€ç¨®æœƒå¼•ç™¼ç³»çµ±åœ¨å…§æ ¸æ…‹ä¸ä¸€ç›´å¾ªç’°è¶…éŽ20秒(詳見下é¢â€œå¯¦ç¾â€å°ç¯€ï¼‰å°Žè‡´ 其他任務沒有機會得到é‹è¡Œçš„BUG。一旦檢測到'softlockup'ç™¼ç”Ÿï¼Œé»˜èªæƒ…æ³ä¸‹ç³»çµ±æœƒæ‰“ å°ç•¶å‰å †æ£§è·Ÿè¹¤ä¿¡æ¯ä¸¦é€²å…¥éŽ–å®šç‹€æ…‹ã€‚ä¹Ÿå¯é…置使其在檢測到'softlockup'後進入panic 狀態;通éŽsysctl命令è¨ç½®â€œkernel.softlockup_panicâ€ã€ä½¿ç”¨å…§æ ¸å•“å‹•åƒæ•¸ “softlockup_panicâ€ï¼ˆè©³è¦‹Documentation/admin-guide/kernel-parameters.rst)以åŠä½¿ èƒ½å…§æ ¸ç·¨è¯é¸é …“BOOTPARAM_SOFTLOCKUP_PANICâ€éƒ½å¯å¯¦ç¾é€™ç¨®é…置。 而'hardlockup'æ˜¯ä¸€ç¨®æœƒå¼•ç™¼ç³»çµ±åœ¨å…§æ ¸æ…‹ä¸€ç›´å¾ªç’°è¶…éŽ10ç§’é˜ï¼ˆè©³è¦‹"實ç¾"å°ç¯€ï¼‰å°Žè‡´å…¶ 他䏿–·æ²’有機會é‹è¡Œçš„缺陷。與'softlockup'情æ³é¡žä¼¼ï¼Œé™¤äº†ä½¿ç”¨sysctl命令è¨ç½® 'hardlockup_panic'ã€ä½¿èƒ½å…§æ ¸é¸é …“BOOTPARAM_HARDLOCKUP_PANICâ€ä»¥åŠä½¿ç”¨å…§æ ¸åƒæ•¸ "nmi_watchdog"(詳見:â€Documentation/admin-guide/kernel-parameters.rst“)外,一旦檢 測到'hardlockup'é»˜èªæƒ…æ³ä¸‹ç³»çµ±æ‰“å°ç•¶å‰å †æ£§è·Ÿè¹¤ä¿¡æ¯ï¼Œç„¶å¾Œé€²å…¥éŽ–å®šç‹€æ…‹ã€‚ 這個panicé¸é …也å¯ä»¥èˆ‡panic_timeoutçµåˆä½¿ç”¨ï¼ˆé€™å€‹panic_timeout是通éŽç¨å…·è¿·æƒ‘性的 sysctl命令"kernel.panic"來è¨ç½®ï¼‰ï¼Œä½¿ç³»çµ±åœ¨panic指定時間後自動é‡å•“。 å¯¦ç¾ ==== Softlockupå’Œhardlockup分別建立在hrtimer(高精度定時器)å’Œperf兩個å系統上而實ç¾ã€‚ 這也就æ„味ç€ç†è«–上任何架構åªè¦å¯¦ç¾äº†é€™å…©å€‹å系統就支æŒé€™å…©ç¨®æª¢æ¸¬æ©Ÿåˆ¶ã€‚ Hrtimerç”¨æ–¼é€±æœŸæ€§ç”¢ç”Ÿä¸æ–·ä¸¦å–šé†’watchdog線程;NMI perf事件則以â€watchdog_thresh“ (ç·¨è¯æ™‚默èªåˆå§‹åŒ–爲10秒,也å¯é€šéŽâ€watchdog_thresh“這個sysctl接å£ä¾†é€²è¡Œé…置修改) 爲間隔週期產生以檢測 hardlockups。如果一個CPU在這個時間段內沒有檢測到hrtimerä¸ æ–·é«®ç”Ÿï¼Œ'hardlockup 檢測器'(å³NMI perf事件處ç†å‡½æ•¸)將會視系統é…ç½®è€Œé¸æ“‡ç”¢ç”Ÿå…§æ ¸ è¦å‘Šæˆ–者直接panic。 而watchdogç·šç¨‹æœ¬è³ªä¸Šæ˜¯ä¸€å€‹é«˜å„ªå…ˆç´šå…§æ ¸ç·šç¨‹ï¼Œæ¯èª¿åº¦ä¸€æ¬¡å°±å°æ™‚間戳進行一次更新。 如果時間戳在2*watchdog_thresh(這個是softlockup的觸發門é™)這段時間都未更新,那麼 "softlocup 檢測器"(內部hrtimer定時器回調函數)æœƒå°‡ç›¸é—œçš„èª¿è©¦ä¿¡æ¯æ‰“å°åˆ°ç³»çµ±æ—¥èªŒä¸ï¼Œ 然後如果系統é…置了進入panicæµç¨‹å‰‡é€²å…¥panic,å¦å‰‡å…§æ ¸ç¹¼çºŒåŸ·è¡Œã€‚ Hrtimer定時器的週期是2*watchdog_thresh/5,也就是說在hardlockup被觸發å‰hrtimer有 2~3次機會產生時é˜ä¸æ–·ã€‚ 如上所述,å…§æ ¸ç›¸ç•¶æ–¼çˆ²ç³»çµ±ç®¡ç†å“¡æä¾›äº†ä¸€å€‹å¯èª¿ç¯€hrtimer定時器和perf事件週期長度 的調節旋鈕。如何通éŽé€™å€‹æ—‹éˆ•çˆ²ç‰¹å®šä½¿ç”¨å ´æ™¯é…置一個åˆç†çš„週期值è¦å°lockups檢測的 響應速度和lockups檢測開銷這二者之間進行權衡。 é»˜èªæƒ…æ³ä¸‹æ‰€æœ‰åœ¨ç·šcpu上都會é‹è¡Œä¸€å€‹watchdog線程。ä¸éŽåœ¨å…§æ ¸é…置了â€NO_HZ_FULL“的 情æ³ä¸‹watchdog線程默èªåªæœƒé‹è¡Œåœ¨ç®¡å®¶(housekeeping)cpu上,而â€nohz_fullâ€œå•“å‹•åƒæ•¸æŒ‡ 定的cpuä¸Šå‰‡ä¸æœƒæœ‰watchdog線程é‹è¡Œã€‚試想,如果我們å…許watchdog線程在â€nohz_full“指 定的cpu上é‹è¡Œï¼Œé€™äº›cpuä¸Šå¿…é ˆå¾—é‹è¡Œæ™‚é˜å®šæ™‚器來激發watchdog線程調度;這樣一來就會 使â€nohz_full“ä¿è·ç”¨æˆ¶ç¨‹åºå…å—å…§æ ¸å¹²æ“¾çš„åŠŸèƒ½å¤±æ•ˆã€‚ç•¶ç„¶ï¼Œå‰¯ä½œç”¨å°±æ˜¯â€nohz_full“指定 çš„cpuå³ä½¿åœ¨å…§æ ¸ç”¢ç”Ÿäº†lockupå•題我們也無法檢測到。ä¸éŽï¼Œè‡³å°‘我們å¯ä»¥å…許watchdog 線程在管家(non-tickless)æ ¸ä¸Šç¹¼çºŒé‹è¡Œä»¥ä¾¿æˆ‘們能繼續æ£å¸¸çš„監測這些cpus上的lockups 事件。 ä¸è«–哪種情æ³éƒ½å¯ä»¥é€šéŽsysctl命令kernel.watchdog_cpumask來尿²’有é‹è¡Œwatchdog線程 çš„cpu集åˆé€²è¡Œèª¿ç¯€ã€‚å°æ–¼nohz_full而言,如果nohz_full cpu上有異常掛ä½çš„æƒ…æ³ï¼Œé€šéŽ é€™ç¨®æ–¹å¼æ‰“開這些cpu上的watchdog進行調試å¯èƒ½æœƒæœ‰æ‰€ä½œç”¨ã€‚