~ [ 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 ] ~

Diff markup

Differences between /Documentation/translations/zh_CN/accounting/taskstats.rst (Version linux-6.12-rc7) and /Documentation/translations/zh_CN/accounting/taskstats.rst (Version linux-5.19.17)


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