.. include:: ../disclaimer-zh_CN.rst :Original: Documentation/admin-guide/lockup-watchdogs.rst :Translator: Hailong Liu <liu.hailong6@zte.com.cn> .. _cn_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进行调试å¯èƒ½ä¼šæœ‰æ‰€ä½œç”¨ã€‚