.. include:: ../disclaimer-zh_CN.rst :Original: Documentation/accounting/delay-accounting.rst :Translator: Yang Yang <yang.yang29@zte.com.cn> ======== 延时计数 ======== 任务在ç‰å¾…æŸäº›å†…æ ¸èµ„æºå¯ç”¨æ—¶ï¼Œä¼šé€ æˆå»¶æ—¶ã€‚例如一个å¯è¿è¡Œçš„任务å¯èƒ½ä¼šç‰å¾… 一个空闲CPUæ¥è¿è¡Œã€‚ 基于æ¯ä»»åŠ¡çš„å»¶æ—¶è®¡æ•°åŠŸèƒ½åº¦é‡ç”±ä»¥ä¸‹æƒ…å†µé€ æˆçš„任务延时: a) ç‰å¾…一个CPU(任务为å¯è¿è¡Œï¼‰ b) 完æˆç”±è¯¥ä»»åŠ¡å‘èµ·çš„å—I/OåŒæ¥è¯·æ±‚ c) 页é¢äº¤æ¢ d) 内å˜å›žæ”¶ e) 抖动 f) 直接规整 g) å†™ä¿æŠ¤å¤åˆ¶ 并将这些统计信æ¯é€šè¿‡taskstatsæŽ¥å£æä¾›ç»™ç”¨æˆ·ç©ºé—´ã€‚ 这些延时信æ¯ä¸ºé€‚当的调整任务CPU优先级ã€io优先级ã€rssé™åˆ¶æä¾›å馈。é‡è¦ä»»åŠ¡ 长期延时,表示å¯èƒ½éœ€è¦æé«˜å…¶ç›¸å…³ä¼˜å…ˆçº§ã€‚ 通过使用taskstats接å£ï¼Œæœ¬åŠŸèƒ½è¿˜å¯æä¾›ä¸€ä¸ªçº¿ç¨‹ç»„ï¼ˆå¯¹åº”ä¼ ç»ŸUnix进程)所有任务 (或线程)的总延时统计信æ¯ã€‚æ¤ç±»æ±‡æ€»å¾€å¾€æ˜¯éœ€è¦çš„ï¼Œç”±å†…æ ¸æ¥å®Œæˆæ›´åŠ é«˜æ•ˆã€‚ 用户空间的实体,特别是资æºç®¡ç†ç¨‹åºï¼Œå¯å°†å»¶æ—¶ç»Ÿè®¡ä¿¡æ¯æ±‡æ€»åˆ°ä»»æ„组ä¸ã€‚为实现 这一点,任务的延时统计信æ¯åœ¨å…¶ç”Ÿå‘½å‘¨æœŸå†…和退出时皆å¯èŽ·å–,从而确ä¿å¯è¿›è¡Œ 连ç»ã€å®Œæ•´çš„监控。 æŽ¥å£ ---- 延时计数使用taskstats接å£ï¼Œè¯¥æŽ¥å£ç”±æœ¬ç›®å½•å¦ä¸€ä¸ªå•独的文档详细æè¿°ã€‚Taskstats å‘用户æ€è¿”回一个通用数æ®ç»“构,对应æ¯pid或æ¯tgid的统计信æ¯ã€‚延时计数功能填写 该数æ®ç»“æž„çš„ç‰¹å®šå—æ®µã€‚è§ include/uapi/linux/taskstats.h å…¶æè¿°äº†å»¶æ—¶è®¡æ•°ç›¸å…³å—段。系统通常以计数器形å¼è¿”回 CPUã€åŒæ¥å— I/Oã€äº¤æ¢ã€å†…å˜ å›žæ”¶ã€é¡µç¼“å˜æŠ–åŠ¨ã€ç›´æŽ¥è§„æ•´ã€å†™ä¿æŠ¤å¤åˆ¶ç‰çš„累积延时。 å–任务æŸè®¡æ•°å™¨ä¸¤ä¸ªè¿žç»è¯»æ•°çš„差值,将得到任务在该时间间隔内ç‰å¾…对应资æºçš„æ€»å»¶æ—¶ã€‚ å½“ä»»åŠ¡é€€å‡ºæ—¶ï¼Œå†…æ ¸ä¼šå°†åŒ…å«æ¯ä»»åŠ¡çš„ç»Ÿè®¡ä¿¡æ¯å‘é€ç»™ç”¨æˆ·ç©ºé—´ï¼Œè€Œæ— 需é¢å¤–的命令。 若其为线程组最åŽä¸€ä¸ªé€€å‡ºçš„ä»»åŠ¡ï¼Œå†…æ ¸è¿˜ä¼šå‘逿¯tgid的统计信æ¯ã€‚更多详细信æ¯è§ taskstats接å£çš„æè¿°ã€‚ tools/accounting目录ä¸çš„用户空间程åºgetdelays.cæä¾›äº†ä¸€äº›ç®€å•的命令,用以显示 延时统计信æ¯ã€‚其也是使用taskstats接å£çš„示例。 用法 ---- 使用以下é…ç½®ç¼–è¯‘å†…æ ¸:: CONFIG_TASK_DELAY_ACCT=y CONFIG_TASKSTATS=y 延时计数在å¯åŠ¨æ—¶é»˜è®¤å…³é—。 若需开å¯ï¼Œåœ¨å¯åЍ傿•°ä¸å¢žåŠ :: delayacct 本文åŽç»çš„说明基于延时计数已开å¯ã€‚也å¯åœ¨ç³»ç»Ÿè¿è¡Œæ—¶ï¼Œä½¿ç”¨sysctlçš„ kernel.task_delayacct进行开关。注æ„ï¼Œåªæœ‰åœ¨å¯ç”¨å»¶æ—¶è®¡æ•°åŽå¯åŠ¨çš„ 任务æ‰ä¼šæœ‰ç›¸å…³ä¿¡æ¯ã€‚ 系统å¯åЍåŽï¼Œä½¿ç”¨ç±»ä¼¼getdelays.c的工具获å–任务或线程组(tgid)的延时信æ¯ã€‚ getdelayså‘½ä»¤çš„ä¸€èˆ¬æ ¼å¼:: getdelays [-dilv] [-t tgid] [-p pid] 获å–pid为10的任务从系统å¯åЍåŽçš„å»¶æ—¶ä¿¡æ¯:: # ./getdelays -d -p 10 (输出信æ¯å’Œä¸‹ä¾‹ç›¸ä¼¼ï¼‰ èŽ·å–æ‰€æœ‰tgid为5的任务从系统å¯åЍåŽçš„æ€»å»¶æ—¶ä¿¡æ¯:: # ./getdelays -d -t 5 print delayacct stats ON TGID 5 CPU count real total virtual total delay total delay average 8 7000000 6872122 3382277 0.423ms IO count delay total delay average 0 0 0.000ms SWAP count delay total delay average 0 0 0.000ms RECLAIM count delay total delay average 0 0 0.000ms THRASHING count delay total delay average 0 0 0.000ms COMPACT count delay total delay average 0 0 0.000ms WPCOPY count delay total delay average 0 0 0ms 获å–pid为1çš„IO计数,它åªå’Œ-p一起使用:: # ./getdelays -i -p 1 printing IO accounting linuxrc: read=65536, write=0, cancelled_write=0 上é¢çš„命令与-v一起使用,å¯ä»¥èŽ·å–æ›´å¤šè°ƒè¯•ä¿¡æ¯ã€‚