.. include:: ../disclaimer-zh_CN.rst :Original: Documentation/accounting/taskstats.rst :Translator: Yang Yang <yang.yang29@zte.com.cn> ================ æ¯ä»»åŠ¡çš„ç»Ÿè®¡æŽ¥å£ ================ Taskstats是一个基于netlink的接å£ï¼Œç”¨äºŽä»Žå†…æ ¸å‘用户空间å‘é€æ¯ä»»åŠ¡åŠæ¯è¿›ç¨‹çš„ 统计信æ¯ã€‚ Taskstats设计目的: - 在任务生命周期内和退出时高效的æä¾›ç»Ÿè®¡ä¿¡æ¯ - 统一ä¸åŒè®¡æ•°åç³»ç»Ÿçš„æŽ¥å£ - 支æŒæœªæ¥è®¡æ•°ç³»ç»Ÿçš„扩展 æœ¯è¯ ---- “pidâ€ã€â€œtidâ€ã€â€œä»»åŠ¡â€äº’æ¢ä½¿ç”¨ï¼Œç”¨äºŽæè¿°ç”±struct task_structå®šä¹‰çš„æ ‡å‡† Linux任务。“æ¯pid的统计数æ®â€ç‰ä»·äºŽâ€œæ¯ä»»åŠ¡çš„统计数æ®â€ã€‚ “tgidâ€ã€â€œè¿›ç¨‹â€ã€â€œçº¿ç¨‹ç»„â€äº’æ¢ä½¿ç”¨ï¼Œç”¨äºŽæ述共享mm_struct的任务集, ä¹Ÿå°±æ˜¯ä¼ ç»Ÿçš„Unix进程。尽管使用了tgid这个è¯ï¼Œå³ä½¿ä¸€ä¸ªä»»åŠ¡æ˜¯çº¿ç¨‹ç»„组长, 对它的处ç†ä¹Ÿæ²¡æœ‰ä»€ä¹ˆä¸åŒã€‚åªè¦ä¸€ä¸ªè¿›ç¨‹è¿˜æœ‰ä»»ä½•å½’属它的任务,它就被认为 æ´»ç€ã€‚ 用法 ---- 为了在任务生命周期内获得统计信æ¯ï¼Œç”¨æˆ·ç©ºé—´éœ€æ‰“开一个å•æ’çš„netlinkå¥—æŽ¥å— ï¼ˆNETLINK_GENERICæ—)然åŽå‘é€æŒ‡å®špid或tgid的命令。å“应消æ¯ä¸åŒ…å«å•ä¸ª 任务的统计信æ¯ï¼ˆè‹¥æŒ‡å®šäº†pid)或进程所有任务汇总的统计信æ¯ï¼ˆè‹¥æŒ‡å®šäº†tgid)。 为了在任务退出时获å–统计信æ¯ï¼Œç”¨æˆ·ç©ºé—´çš„监å¬è€…å‘é€ä¸€ä¸ªæŒ‡å®šcpu掩ç 的注册命令。 cpu掩ç 内的cpu上有任务退出时,æ¯pid的统计信æ¯å°†å‘é€ç»™æ³¨å†ŒæˆåŠŸçš„监å¬è€…。使用 cpu掩ç å¯ä»¥é™åˆ¶ä¸€ä¸ªç›‘å¬è€…收到的数æ®ï¼Œå¹¶æœ‰åŠ©äºŽå¯¹netlink接å£è¿›è¡Œæµé‡æŽ§åˆ¶ï¼ŒåŽæ–‡ 将进行更详细的解释。 如果æ£åœ¨é€€å‡ºçš„任务是线程组ä¸æœ€åŽä¸€ä¸ªé€€å‡ºçš„线程,é¢å¤–一æ¡åŒ…å«æ¯tgid统计信æ¯çš„ 记录也将å‘é€ç»™ç”¨æˆ·ç©ºé—´ã€‚åŽè€…包å«çº¿ç¨‹ç»„ä¸æ‰€æœ‰çº¿ç¨‹ï¼ˆåŒ…括过去和现在)的æ¯pid统计 ä¿¡æ¯æ€»å’Œã€‚ getdelays.c是一个简å•çš„示例,用以演示如何使用taskstats接å£èŽ·å–延迟统计信æ¯ã€‚ 用户å¯æ³¨å†Œcpu掩ç ã€å‘é€å‘½ä»¤å’Œå¤„ç†å“应ã€ç›‘å¬æ¯tid/tgid退出数æ®ã€å°†æ”¶åˆ°çš„æ•°æ® å†™å…¥æ–‡ä»¶ã€é€šè¿‡å¢žå¤§æŽ¥æ”¶ç¼“冲区进行基本的æµé‡æŽ§åˆ¶ã€‚ æŽ¥å£ ---- å†…æ ¸ç”¨æˆ·æŽ¥å£å°è£…在include/linux/taskstats.h。 为é¿å…本文档éšç€æŽ¥å£çš„演进而过期,本文仅给出当å‰ç‰ˆæœ¬çš„概è¦ã€‚当本文与taskstats.h ä¸ä¸€è‡´æ—¶ï¼Œä»¥taskstats.h为准。 struct taskstats是æ¯pidå’Œæ¯tgidæ•°æ®å…±ç”¨çš„计数结构体。它是版本化的,å¯åœ¨å†…æ ¸æ–°å¢ž 计数å系统时进行扩展。taskstats.hä¸å®šä¹‰äº†å„å—段åŠè¯ä¹‰ã€‚ 用户ã€å†…æ ¸ç©ºé—´çš„æ•°æ®äº¤æ¢æ˜¯å±žäºŽNETLINK_GENERICæ—çš„netlink消æ¯ï¼Œä½¿ç”¨netlink属性 接å£ã€‚消æ¯æ ¼å¼å¦‚下:: +----------+- - -+-------------+-------------------+ | nlmsghdr | Pad | genlmsghdr | taskstats payload | +----------+- - -+-------------+-------------------+ Taskstatsè½½è·æœ‰ä¸‰ç§ç±»åž‹ï¼š 1. 命令:由用户å‘é€ç»™å†…æ ¸ã€‚èŽ·å–指定pid/tgidæ•°æ®çš„命令包å«ä¸€ä¸ªç±»åž‹ä¸º TASKSTATS_CMD_ATTR_PID/TGID的属性,该属性包å«u32çš„pid或tgidè½½è·ã€‚ pid/tgid指示用户空间è¦ç»Ÿè®¡çš„任务/进程。 注册/注销获å–指定cpu集上退出数æ®çš„命令包å«ä¸€ä¸ªç±»åž‹ä¸º TASKSTATS_CMD_ATTR_REGISTER/DEREGISTER_CPUMASK的属性,该属性包å«cpu掩ç è½½è·ã€‚ cpu掩ç 是以asciiç 表示,用逗å·åˆ†éš”çš„cpu范围。例如若需监å¬1,2,3,5,7,8å·cpuçš„ 退出数æ®ï¼Œcpu掩ç 表示为"1-3,5,7-8"。若用户空间在关é—监å¬å¥—接å—å‰å¿˜äº†æ³¨é”€ç›‘å¬ çš„cpu集,éšç€æ—¶é—´çš„æŽ¨ç§»ï¼Œå†…æ ¸ä¼šæ¸…ç†æ¤ç›‘å¬é›†ã€‚但是,出于æ效的目的,建议明确 执行注销。 2. 命令的应ç”ï¼šå†…æ ¸å‘出应ç”用户空间的命令。载è·æœ‰ä¸‰ç±»å±žæ€§ï¼š a) TASKSTATS_TYPE_AGGR_PID/TGID: 本属性ä¸åŒ…å«è½½è·ï¼Œç”¨ä»¥æŒ‡ç¤ºå…¶åŽä¸ºè¢«ç»Ÿè®¡å¯¹è±¡ çš„pig/tgid。 b) TASKSTATS_TYPE_PID/TGID:本属性的载è·ä¸ºpig/tgid,其统计信æ¯å°†è¢«è¿”回。 c) TASKSTATS_TYPE_STATS:本属性的载è·ä¸ºä¸€ä¸ªstruct taskstats实例。æ¯pidå’Œ æ¯tgid统计信æ¯å…±ç”¨è¯¥ç»“构体。 3. å†…æ ¸ä¼šåœ¨ä»»åŠ¡é€€å‡ºæ—¶å‘é€æ–°æ¶ˆæ¯ã€‚其载è·åŒ…å«ä¸€ç³»åˆ—以下类型的属性: a) TASKSTATS_TYPE_AGGR_PID:指示其åŽä¸¤ä¸ªå±žæ€§ä¸ºpid+stats。 b) TASKSTATS_TYPE_PID:包å«é€€å‡ºä»»åŠ¡çš„pid。 c) TASKSTATS_TYPE_STATS:包å«é€€å‡ºä»»åŠ¡çš„æ¯pidç»Ÿè®¡ä¿¡æ¯ d) TASKSTATS_TYPE_AGGR_TGID:指示其åŽä¸¤ä¸ªå±žæ€§ä¸ºtgid+stats。 e) TASKSTATS_TYPE_TGID:包å«ä»»åŠ¡æ‰€å±žè¿›ç¨‹çš„tgid f) TASKSTATS_TYPE_STATS:包å«é€€å‡ºä»»åŠ¡æ‰€å±žè¿›ç¨‹çš„æ¯tgidç»Ÿè®¡ä¿¡æ¯ æ¯tgid的统计 ------------ 除了æ¯ä»»åŠ¡çš„统计信æ¯ï¼Œtaskstats还æä¾›æ¯è¿›ç¨‹çš„统计信æ¯ï¼Œå› 为资æºç®¡ç†é€šå¸¸ä»¥è¿›ç¨‹ 粒度完æˆï¼Œå¹¶ä¸”仅在用户空间èšåˆä»»åŠ¡ç»Ÿè®¡ä¿¡æ¯æ•ˆçŽ‡ä½Žä¸‹ä¸”å¯èƒ½ä¸å‡†ç¡®ï¼ˆç¼ºä¹åŽŸå性)。 然而,除了æ¯ä»»åŠ¡ç»Ÿè®¡ä¿¡æ¯ï¼Œåœ¨å†…æ ¸ä¸ç»´æŠ¤æ¯è¿›ç¨‹ç»Ÿè®¡ä¿¡æ¯å˜åœ¨é¢å¤–的时间和空间开销。 为解决æ¤é—®é¢˜ï¼Œtaskstats代ç 将退出任务的统计信æ¯ç´¯ç§¯åˆ°è¿›ç¨‹èŒƒå›´çš„æ•°æ®ç»“æž„ä¸ã€‚ 当进程最åŽä¸€ä¸ªä»»åŠ¡é€€å‡ºæ—¶ï¼Œç´¯ç§¯çš„进程级数æ®ä¹Ÿä¼šå‘é€åˆ°ç”¨æˆ·ç©ºé—´ï¼ˆä¸Žæ¯ä»»åŠ¡æ•°æ®ä¸€èµ·ï¼‰ã€‚ 当用户查询æ¯tgidæ•°æ®æ—¶ï¼Œå†…æ ¸å°†æŒ‡å®šçº¿ç¨‹ç»„ä¸æ‰€æœ‰æ´»åŠ¨çº¿ç¨‹çš„统计信æ¯ç›¸åŠ ï¼Œå¹¶æ·»åŠ åˆ° 该线程组的累积总数(å«ä¹‹å‰é€€å‡ºçš„线程)。 扩展taskstats ------------- 有两ç§æ–¹æ³•å¯åœ¨æœªæ¥ä¿®æ”¹å†…æ ¸æ‰©å±•taskstats接å£ï¼Œä»¥å¯¼å‡ºæ›´å¤šçš„æ¯ä»»åŠ¡/进程统计信æ¯ï¼š 1. 在现有struct taskstatsæœ«å°¾å¢žåŠ å—段。该结构体ä¸çš„版本å·ç¡®ä¿äº†å‘åŽå…¼å®¹æ€§ã€‚ 用户空间将仅使用与其版本对应的结构体å—段。 2. 定义å•ç‹¬çš„统计结构体并使用netlink属性接å£è¿”回对应的数æ®ã€‚由于用户空间独立 处ç†æ¯ä¸ªnetlink属性,所以总是å¯ä»¥å¿½ç•¥å…¶ä¸ç†è§£ç±»åž‹çš„å±žæ€§ï¼ˆå› ä¸ºä½¿ç”¨äº†æ—§ç‰ˆæœ¬æŽ¥å£ï¼‰ã€‚ 在1.å’Œ2.之间进行选择,属于æƒè¡¡çµæ´»æ€§å’Œå¼€é”€çš„é—®é¢˜ã€‚è‹¥ä»…éœ€å¢žåŠ å°‘æ•°å—段,那么1.是 é¦–é€‰æ–¹æ³•ï¼Œå› ä¸ºå†…æ ¸å’Œç”¨æˆ·ç©ºé—´æ— éœ€æ‰¿æ‹…å¤„ç†æ–°netlink属性的开销。但若新å—段过多的 扩展现有结构体,导致ä¸åŒçš„用户空间计数程åºä¸å¿…è¦çš„接收大型结构体,而对结构体 å—段并ä¸æ„Ÿå…´è¶£ï¼Œé‚£ä¹ˆ2.是值得的。 Taskstatsçš„æµé‡æŽ§åˆ¶ ------------------- 当退出任务数速率å˜å¤§ï¼Œç›‘å¬è€…å¯èƒ½è·Ÿä¸ä¸Šå†…æ ¸å‘é€æ¯tid/tgid退出数æ®çš„速率,而导致 æ•°æ®ä¸¢å¤±ã€‚taskstats结构体å˜å¤§ã€cpuæ•°é‡ä¸Šå‡ï¼Œéƒ½ä¼šå¯¼è‡´è¿™ç§å¯èƒ½æ€§å¢žåŠ 。 为é¿å…统计信æ¯ä¸¢å¤±ï¼Œç”¨æˆ·ç©ºé—´åº”执行以下æ“作ä¸è‡³å°‘一项: - 增大监å¬è€…用于接收退出数æ®çš„netlink套接å—接收缓å˜åŒºã€‚ - 创建更多的监å¬è€…,å‡å°‘æ¯ä¸ªç›‘å¬è€…监å¬çš„cpuæ•°é‡ã€‚æžç«¯æƒ…况下å¯ä¸ºæ¯ä¸ªcpu创建 一个监å¬è€…。用户还å¯è€ƒè™‘将监å¬è€…çš„cpu亲和性设置为监å¬cpuçš„å集,特别是当他们 仅监å¬ä¸€ä¸ªcpu。 尽管采å–了这些措施,若用户空间ä»æ”¶åˆ°æŒ‡ç¤ºæŽ¥æ”¶ç¼“å˜åŒºæº¢å‡ºçš„ENOBUFS错误消æ¯ï¼Œ 则应采å–其他措施处ç†æ•°æ®ä¸¢å¤±ã€‚