~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/accounting/taskstats.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. include:: ../disclaimer-zh_CN.rst
  2 
  3 :Original: Documentation/accounting/taskstats.rst
  4 
  5 :Translator: Yang Yang <yang.yang29@zte.com.cn>
  6 
  7 ================
  8 每任务的统计接口
  9 ================
 10 
 11 Taskstats是一个基于netlink的接口,用于从内核向用户空间发送每任务及每进程的
 12 统计信息。
 13 
 14 Taskstats设计目的:
 15 
 16 - 在任务生命周期内和退出时高效的提供统计信息
 17 - 统一不同计数子系统的接口
 18 - 支持未来计数系统的扩展
 19 
 20 术语
 21 ----
 22 
 23 “pid”、“tid”、“任务”互换使用,用于描述由struct task_struct定义的标准
 24 Linux任务。“每pid的统计数据”等价于“每任务的统计数据”。
 25 
 26 “tgid”、“进程”、“线程组”互换使用,用于描述共享mm_struct的任务集,
 27 也就是传统的Unix进程。尽管使用了tgid这个词,即使一个任务是线程组组长,
 28 对它的处理也没有什么不同。只要一个进程还有任何归属它的任务,它就被认为
 29 活着。
 30 
 31 用法
 32 ----
 33 
 34 为了在任务生命周期内获得统计信息,用户空间需打开一个单播的netlink套接字
 35 (NETLINK_GENERIC族)然后发送指定pid或tgid的命令。响应消息中包含单个
 36 任务的统计信息(若指定了pid)或进程所有任务汇总的统计信息(若指定了tgid)。
 37 
 38 为了在任务退出时获取统计信息,用户空间的监听者发送一个指定cpu掩码的注册命令。
 39 cpu掩码内的cpu上有任务退出时,每pid的统计信息将发送给注册成功的监听者。使用
 40 cpu掩码可以限制一个监听者收到的数据,并有助于对netlink接口进行流量控制,后文
 41 将进行更详细的解释。
 42 
 43 如果正在退出的任务是线程组中最后一个退出的线程,额外一条包含每tgid统计信息的
 44 记录也将发送给用户空间。后者包含线程组中所有线程(包括过去和现在)的每pid统计
 45 信息总和。
 46 
 47 getdelays.c是一个简单的示例,用以演示如何使用taskstats接口获取延迟统计信息。
 48 用户可注册cpu掩码、发送命令和处理响应、监听每tid/tgid退出数据、将收到的数据
 49 写入文件、通过增大接收缓冲区进行基本的流量控制。
 50 
 51 接口
 52 ----
 53 
 54 内核用户接口封装在include/linux/taskstats.h。
 55 
 56 为避免本文档随着接口的演进而过期,本文仅给出当前版本的概要。当本文与taskstats.h
 57 不一致时,以taskstats.h为准。
 58 
 59 struct taskstats是每pid和每tgid数据共用的计数结构体。它是版本化的,可在内核新增
 60 计数子系统时进行扩展。taskstats.h中定义了各字段及语义。
 61 
 62 用户、内核空间的数据交换是属于NETLINK_GENERIC族的netlink消息,使用netlink属性
 63 接口。消息格式如下::
 64 
 65     +----------+- - -+-------------+-------------------+
 66     | nlmsghdr | Pad |  genlmsghdr | taskstats payload |
 67     +----------+- - -+-------------+-------------------+
 68 
 69 Taskstats载荷有三种类型:
 70 
 71 1. 命令:由用户发送给内核。获取指定pid/tgid数据的命令包含一个类型为
 72 TASKSTATS_CMD_ATTR_PID/TGID的属性,该属性包含u32的pid或tgid载荷。
 73 pid/tgid指示用户空间要统计的任务/进程。
 74 
 75 注册/注销获取指定cpu集上退出数据的命令包含一个类型为
 76 TASKSTATS_CMD_ATTR_REGISTER/DEREGISTER_CPUMASK的属性,该属性包含cpu掩码载荷。
 77 cpu掩码是以ascii码表示,用逗号分隔的cpu范围。例如若需监听1,2,3,5,7,8号cpu的
 78 退出数据,cpu掩码表示为"1-3,5,7-8"。若用户空间在关闭监听套接字前忘了注销监听
 79 的cpu集,随着时间的推移,内核会清理此监听集。但是,出于提效的目的,建议明确
 80 执行注销。
 81 
 82 2. 命令的应答:内核发出应答用户空间的命令。载荷有三类属性:
 83 
 84 a) TASKSTATS_TYPE_AGGR_PID/TGID: 本属性不包含载荷,用以指示其后为被统计对象
 85 的pig/tgid。
 86 
 87 b) TASKSTATS_TYPE_PID/TGID:本属性的载荷为pig/tgid,其统计信息将被返回。
 88 
 89 c) TASKSTATS_TYPE_STATS:本属性的载荷为一个struct taskstats实例。每pid和
 90 每tgid统计信息共用该结构体。
 91 
 92 3. 内核会在任务退出时发送新消息。其载荷包含一系列以下类型的属性:
 93 
 94 a) TASKSTATS_TYPE_AGGR_PID:指示其后两个属性为pid+stats。
 95 b) TASKSTATS_TYPE_PID:包含退出任务的pid。
 96 c) TASKSTATS_TYPE_STATS:包含退出任务的每pid统计信息
 97 d) TASKSTATS_TYPE_AGGR_TGID:指示其后两个属性为tgid+stats。
 98 e) TASKSTATS_TYPE_TGID:包含任务所属进程的tgid
 99 f) TASKSTATS_TYPE_STATS:包含退出任务所属进程的每tgid统计信息
100 
101 每tgid的统计
102 ------------
103 
104 除了每任务的统计信息,taskstats还提供每进程的统计信息,因为资源管理通常以进程
105 粒度完成,并且仅在用户空间聚合任务统计信息效率低下且可能不准确(缺乏原子性)。
106 
107 然而,除了每任务统计信息,在内核中维护每进程统计信息存在额外的时间和空间开销。
108 为解决此问题,taskstats代码将退出任务的统计信息累积到进程范围的数据结构中。
109 当进程最后一个任务退出时,累积的进程级数据也会发送到用户空间(与每任务数据一起)。
110 
111 当用户查询每tgid数据时,内核将指定线程组中所有活动线程的统计信息相加,并添加到
112 该线程组的累积总数(含之前退出的线程)。
113 
114 扩展taskstats
115 -------------
116 
117 有两种方法可在未来修改内核扩展taskstats接口,以导出更多的每任务/进程统计信息:
118 
119 1. 在现有struct taskstats末尾增加字段。该结构体中的版本号确保了向后兼容性。
120 用户空间将仅使用与其版本对应的结构体字段。
121 
122 2. 定义单独的统计结构体并使用netlink属性接口返回对应的数据。由于用户空间独立
123 处理每个netlink属性,所以总是可以忽略其不理解类型的属性(因为使用了旧版本接口)。
124 
125 在1.和2.之间进行选择,属于权衡灵活性和开销的问题。若仅需增加少数字段,那么1.是
126 首选方法,因为内核和用户空间无需承担处理新netlink属性的开销。但若新字段过多的
127 扩展现有结构体,导致不同的用户空间计数程序不必要的接收大型结构体,而对结构体
128 字段并不感兴趣,那么2.是值得的。
129 
130 Taskstats的流量控制
131 -------------------
132 
133 当退出任务数速率变大,监听者可能跟不上内核发送每tid/tgid退出数据的速率,而导致
134 数据丢失。taskstats结构体变大、cpu数量上升,都会导致这种可能性增加。
135 
136 为避免统计信息丢失,用户空间应执行以下操作中至少一项:
137 
138 - 增大监听者用于接收退出数据的netlink套接字接收缓存区。
139 
140 - 创建更多的监听者,减少每个监听者监听的cpu数量。极端情况下可为每个cpu创建
141   一个监听者。用户还可考虑将监听者的cpu亲和性设置为监听cpu的子集,特别是当他们
142   仅监听一个cpu。
143 
144 尽管采取了这些措施,若用户空间仍收到指示接收缓存区溢出的ENOBUFS错误消息,
145 则应采取其他措施处理数据丢失。

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php