← Documents Documentation/accounting/delay-accounting.rst GitHub 원문 ↗

Linux 6.18.37 · Accounting

Delay accounting

CPU·I/O·swap·reclaim·thrashing·compaction·write-copy·IRQ delay counter와 taskstats/getdelays/delaytop 사용법을 설명합니다.

Source pathDocumentation/accounting/delay-accounting.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

측정 범위

delay-accounting.rst:1-68

Per-pid/per-tgid cumulative delay와 exit record를 taskstats로 제공합니다.

설정과 도구

delay-accounting.rst:69-214

Kernel config와 boot/runtime enable, getdelays와 interactive delaytop workflow를 정리합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 ================
2 Delay accounting
3 ================
4
5 Tasks encounter delays in execution when they wait
6 for some kernel resource to become available e.g. a
7 runnable task may wait for a free CPU to run on.
8
9 The per-task delay accounting functionality measures
10 the delays experienced by a task while
11
12 a) waiting for a CPU (while being runnable)
13 b) completion of synchronous block I/O initiated by the task
14 c) swapping in pages
15 d) memory reclaim
16 e) thrashing
17 f) direct compact
18 g) write-protect copy
19 h) IRQ/SOFTIRQ
20
21 and makes these statistics available to userspace through
22 the taskstats interface.
23
24 Such delays provide feedback for setting a task's cpu priority,
25 io priority and rss limit values appropriately. Long delays for
26 important tasks could be a trigger for raising its corresponding priority.
27
28 The functionality, through its use of the taskstats interface, also provides
29 delay statistics aggregated for all tasks (or threads) belonging to a
30 thread group (corresponding to a traditional Unix process). This is a commonly
31 needed aggregation that is more efficiently done by the kernel.
32
33 Userspace utilities, particularly resource management applications, can also
34 aggregate delay statistics into arbitrary groups. To enable this, delay
35 statistics of a task are available both during its lifetime as well as on its
36 exit, ensuring continuous and complete monitoring can be done.
37
38
39 Interface
40 ---------
41
42 Delay accounting uses the taskstats interface which is described
43 in detail in a separate document in this directory. Taskstats returns a
44 generic data structure to userspace corresponding to per-pid and per-tgid
45 statistics. The delay accounting functionality populates specific fields of
46 this structure. See
47
48 include/uapi/linux/taskstats.h
49
50 for a description of the fields pertaining to delay accounting.
51 It will generally be in the form of counters returning the cumulative
52 delay seen for cpu, sync block I/O, swapin, memory reclaim, thrash page
53 cache, direct compact, write-protect copy, IRQ/SOFTIRQ etc.
54
55 Taking the difference of two successive readings of a given
56 counter (say cpu_delay_total) for a task will give the delay
57 experienced by the task waiting for the corresponding resource
58 in that interval.
59
60 When a task exits, records containing the per-task statistics
61 are sent to userspace without requiring a command. If it is the last exiting
62 task of a thread group, the per-tgid statistics are also sent. More details
63 are given in the taskstats interface description.
64
65 The getdelays.c userspace utility in tools/accounting directory allows simple
66 commands to be run and the corresponding delay statistics to be displayed. It
67 also serves as an example of using the taskstats interface.
68
69 Usage
70 -----
71
72 Compile the kernel with::
73
74 CONFIG_TASK_DELAY_ACCT=y
75 CONFIG_TASKSTATS=y
76
77 Delay accounting is disabled by default at boot up.
78 To enable, add::
79
80 delayacct
81
82 to the kernel boot options. The rest of the instructions below assume this has
83 been done. Alternatively, use sysctl kernel.task_delayacct to switch the state
84 at runtime. Note however that only tasks started after enabling it will have
85 delayacct information.
86
87 After the system has booted up, use a utility
88 similar to getdelays.c to access the delays
89 seen by a given task or a task group (tgid).
90 The utility also allows a given command to be
91 executed and the corresponding delays to be
92 seen.
93
94 General format of the getdelays command::
95
96 getdelays [-dilv] [-t tgid] [-p pid]
97
98 Get delays, since system boot, for pid 10::
99
100 # ./getdelays -d -p 10
101 (output similar to next case)
102
103 Get sum and peak of delays, since system boot, for all pids with tgid 242::
104
105 bash-4.4# ./getdelays -d -t 242
106 print delayacct stats ON
107 TGID 242
108
109
110 CPU count real total virtual total delay total delay average delay max delay min
111 39 156000000 156576579 2111069 0.054ms 0.212296ms 0.031307ms
112 IO count delay total delay average delay max delay min
113 0 0 0.000ms 0.000000ms 0.000000ms
114 SWAP count delay total delay average delay max delay min
115 0 0 0.000ms 0.000000ms 0.000000ms
116 RECLAIM count delay total delay average delay max delay min
117 0 0 0.000ms 0.000000ms 0.000000ms
118 THRASHING count delay total delay average delay max delay min
119 0 0 0.000ms 0.000000ms 0.000000ms
120 COMPACT count delay total delay average delay max delay min
121 0 0 0.000ms 0.000000ms 0.000000ms
122 WPCOPY count delay total delay average delay max delay min
123 156 11215873 0.072ms 0.207403ms 0.033913ms
124 IRQ count delay total delay average delay max delay min
125 0 0 0.000ms 0.000000ms 0.000000ms
126
127 Get IO accounting for pid 1, it works only with -p::
128
129 # ./getdelays -i -p 1
130 printing IO accounting
131 linuxrc: read=65536, write=0, cancelled_write=0
132
133 The above command can be used with -v to get more debug information.
134
135 After the system starts, use `delaytop` to get the system-wide delay information,
136 which includes system-wide PSI information and Top-N high-latency tasks.
137 Note: PSI support requires `CONFIG_PSI=y` and `psi=1` for full functionality.
138
139 `delaytop` is an interactive tool for monitoring system pressure and task delays.
140 It supports multiple sorting options, display modes, and real-time keyboard controls.
141
142 Basic usage with default settings (sorts by CPU delay, shows top 20 tasks, refreshes every 2 seconds)::
143
144 bash# ./delaytop
145 System Pressure Information: (avg10/avg60vg300/total)
146 CPU some: 0.0%/ 0.0%/ 0.0%/ 106137(ms)
147 CPU full: 0.0%/ 0.0%/ 0.0%/ 0(ms)
148 Memory full: 0.0%/ 0.0%/ 0.0%/ 0(ms)
149 Memory some: 0.0%/ 0.0%/ 0.0%/ 0(ms)
150 IO full: 0.0%/ 0.0%/ 0.0%/ 2240(ms)
151 IO some: 0.0%/ 0.0%/ 0.0%/ 2783(ms)
152 IRQ full: 0.0%/ 0.0%/ 0.0%/ 0(ms)
153 [o]sort [M]memverbose [q]quit
154 Top 20 processes (sorted by cpu delay):
155 PID TGID COMMAND CPU(ms) IO(ms) IRQ(ms) MEM(ms)
156 ------------------------------------------------------------------------
157 110 110 kworker/15:0H-s 27.91 0.00 0.00 0.00
158 57 57 cpuhp/7 3.18 0.00 0.00 0.00
159 99 99 cpuhp/14 2.97 0.00 0.00 0.00
160 51 51 cpuhp/6 0.90 0.00 0.00 0.00
161 44 44 kworker/4:0H-sy 0.80 0.00 0.00 0.00
162 60 60 ksoftirqd/7 0.74 0.00 0.00 0.00
163 76 76 idle_inject/10 0.31 0.00 0.00 0.00
164 100 100 idle_inject/14 0.30 0.00 0.00 0.00
165 1309 1309 systemsettings 0.29 0.00 0.00 0.00
166 45 45 cpuhp/5 0.22 0.00 0.00 0.00
167 63 63 cpuhp/8 0.20 0.00 0.00 0.00
168 87 87 cpuhp/12 0.18 0.00 0.00 0.00
169 93 93 cpuhp/13 0.17 0.00 0.00 0.00
170 1265 1265 acpid 0.17 0.00 0.00 0.00
171 1552 1552 sshd 0.17 0.00 0.00 0.00
172 2584 2584 sddm-helper 0.16 0.00 0.00 0.00
173 1284 1284 rtkit-daemon 0.15 0.00 0.00 0.00
174 1326 1326 nde-netfilter 0.14 0.00 0.00 0.00
175 27 27 cpuhp/2 0.13 0.00 0.00 0.00
176 631 631 kworker/11:2-rc 0.11 0.00 0.00 0.00
177
178 Interactive keyboard controls during runtime::
179
180 o - Select sort field (CPU, IO, IRQ, Memory, etc.)
181 M - Toggle display mode (Default/Memory Verbose)
182 q - Quit
183
184 Available sort fields(use -s/--sort or interactive command)::
185
186 cpu(c) - CPU delay
187 blkio(i) - I/O delay
188 irq(q) - IRQ delay
189 mem(m) - Total memory delay
190 swapin(s) - Swapin delay (memory verbose mode only)
191 freepages(r) - Freepages reclaim delay (memory verbose mode only)
192 thrashing(t) - Thrashing delay (memory verbose mode only)
193 compact(p) - Compaction delay (memory verbose mode only)
194 wpcopy(w) - Write page copy delay (memory verbose mode only)
195
196 Advanced usage examples::
197
198 # ./delaytop -s blkio
199 Sorted by IO delay
200
201 # ./delaytop -s mem -M
202 Sorted by memory delay in memory verbose mode
203
204 # ./delaytop -p pid
205 Print delayacct stats
206
207 # ./delaytop -P num
208 Display the top N tasks
209
210 # ./delaytop -n num
211 Set delaytop refresh frequency (num times)
212
213 # ./delaytop -d secs
214 Specify refresh interval as secs
215

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

측정하는 task delay

1-38

Task는 runnable이지만 free CPU를 기다리는 것처럼 kernel resource가 available해질 때까지 기다리며 execution delay를 겪습니다. Per-task delay accounting은 CPU 대기, task가 시작한 synchronous block I/O 완료, page swap-in, memory reclaim, thrashing, direct compact, write-protect copy, IRQ/SOFTIRQ에서 경험한 delay를 측정하고 taskstats interface로 userspace에 제공합니다.

Delay accounting categories
CategoryMeasured delay
CPURunnable task waiting for a CPU
Synchronous block I/OCompletion of task-initiated I/O
Swap-inPages swapped into memory
Memory reclaimReclaim path
ThrashingPage-cache thrashing
Direct compactDirect memory compaction
Write-protect copyWrite-protect page copy
IRQ/SOFTIRQInterrupt processing

Taskstats가 누적하는 resource wait 유형입니다.

이 delay는 task의 CPU priority, I/O priority와 RSS limit을 적절히 설정하는 feedback으로 쓸 수 있습니다. 중요한 task의 긴 delay는 priority를 높이는 trigger가 될 수 있습니다.

Taskstats를 이용하므로 전통적인 Unix process에 해당하는 thread group의 모든 task/thread에 대한 aggregate delay도 제공합니다. 흔히 필요한 aggregation을 kernel이 더 효율적으로 수행합니다. Resource management application은 arbitrary group으로도 aggregate할 수 있습니다. Task lifetime 중과 exit 시점 모두 statistic을 제공해 연속적이고 완전한 monitoring을 보장합니다.

Taskstats interface와 counter 차분

39-68

Delay accounting은 같은 directory의 별도 문서에 설명된 taskstats interface를 사용합니다. Taskstats는 per-pid와 per-tgid statistic을 담는 generic data structure를 userspace에 반환하고 delay accounting은 그 structure의 특정 field를 채웁니다. Field 설명은 `include/uapi/linux/taskstats.h`에 있습니다.

일반적으로 CPU, synchronous block I/O, swap-in, memory reclaim, page-cache thrashing, direct compact, write-protect copy, IRQ/SOFTIRQ 등의 cumulative delay counter입니다. 예를 들어 task의 `cpu_delay_total`을 연속해서 두 번 읽은 값의 차이는 그 interval 동안 해당 resource를 기다린 delay입니다.

Task가 exit하면 command 없이 per-task statistic record를 userspace로 보냅니다. Thread group의 마지막 task라면 per-tgid statistic도 보냅니다. `tools/accounting/getdelays.c` utility는 간단한 command를 실행해 해당 delay statistic을 보여 주며 taskstats interface 사용 예이기도 합니다.

Interval delay 계산
Read cpu_delay_total at t1Read cpu_delay_total at t2Subtract t2 - t1Delay experienced during interval
Task exitsKernel sends per-task recordLast thread in group also emits per-tgid record

Cumulative counter의 연속 snapshot 차이를 구합니다.

Kernel 설정과 getdelays

69-133

Kernel은 `CONFIG_TASK_DELAY_ACCT=y`와 `CONFIG_TASKSTATS=y`로 compile해야 합니다. Delay accounting은 boot 때 default로 disable되어 있으므로 kernel boot option에 `delayacct`를 추가합니다. 또는 runtime에 `sysctl kernel.task_delayacct`로 바꿀 수 있지만 enable한 뒤 시작된 task에만 delayacct 정보가 생깁니다.

CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASKSTATS=y

delayacct

sysctl kernel.task_delayacct

Boot 후 `getdelays.c`와 비슷한 utility로 task 또는 task group(tgid)의 delay를 읽고 command를 실행해 그 delay를 볼 수 있습니다. General syntax는 `getdelays [-dilv] [-t tgid] [-p pid]`입니다. `-d -p 10`은 PID 10, `-d -t 242`는 TGID 242에 속한 모든 PID의 boot 이후 delay sum과 peak를 출력합니다.

General format of the getdelays command::

	getdelays [-dilv] [-t tgid] [-p pid]

Get delays, since system boot, for pid 10::

	# ./getdelays -d -p 10
	(output similar to next case)

Get sum and peak of delays, since system boot, for all pids with tgid 242::

	bash-4.4# ./getdelays -d -t 242
	print delayacct stats ON
	TGID    242


	CPU         count     real total  virtual total    delay total  delay average      delay max      delay min
	               39      156000000      156576579        2111069          0.054ms     0.212296ms     0.031307ms
	IO          count    delay total  delay average      delay max      delay min
	                0              0          0.000ms     0.000000ms     0.000000ms
	SWAP        count    delay total  delay average      delay max      delay min
	                0              0          0.000ms     0.000000ms     0.000000ms
	RECLAIM     count    delay total  delay average      delay max      delay min
	                0              0          0.000ms     0.000000ms     0.000000ms
	THRASHING   count    delay total  delay average      delay max      delay min
	                0              0          0.000ms     0.000000ms     0.000000ms
	COMPACT     count    delay total  delay average      delay max      delay min
	                0              0          0.000ms     0.000000ms     0.000000ms
	WPCOPY      count    delay total  delay average      delay max      delay min
	              156       11215873          0.072ms     0.207403ms     0.033913ms
	IRQ         count    delay total  delay average      delay max      delay min
	                0              0          0.000ms     0.000000ms     0.000000ms

출력은 CPU의 count·real total·virtual total·delay total/average/max/min과 IO, SWAP, RECLAIM, THRASHING, COMPACT, WPCOPY, IRQ의 delay statistic을 보여 줍니다. PID 1의 I/O accounting은 `-p`에서만 동작하며 `-i -p 1`로 read, write, cancelled_write를 확인합니다. `-v`를 더하면 debug information을 자세히 표시합니다.

Get IO accounting for pid 1, it works only with -p::

	# ./getdelays -i -p 1
	printing IO accounting
	linuxrc: read=65536, write=0, cancelled_write=0

delaytop system-wide monitoring

134-214

System이 시작된 뒤 `delaytop`으로 system-wide delay information을 봅니다. System-wide PSI와 high-latency Top-N task를 포함합니다. PSI 전체 기능에는 `CONFIG_PSI=y`와 `psi=1`이 필요합니다.

`delaytop`은 system pressure와 task delay를 interactive하게 monitor하며 여러 sort option, display mode와 realtime keyboard control을 제공합니다. Default는 CPU delay로 sort하고 상위 task 20개를 2초마다 refresh합니다.

	bash# ./delaytop
	System Pressure Information: (avg10/avg60vg300/total)
	CPU some:       0.0%/   0.0%/   0.0%/  106137(ms)
	CPU full:       0.0%/   0.0%/   0.0%/       0(ms)
	Memory full:    0.0%/   0.0%/   0.0%/       0(ms)
	Memory some:    0.0%/   0.0%/   0.0%/       0(ms)
	IO full:        0.0%/   0.0%/   0.0%/    2240(ms)
	IO some:        0.0%/   0.0%/   0.0%/    2783(ms)
	IRQ full:       0.0%/   0.0%/   0.0%/       0(ms)
	[o]sort [M]memverbose [q]quit
	Top 20 processes (sorted by cpu delay):
		PID      TGID  COMMAND           CPU(ms)   IO(ms)  IRQ(ms)  MEM(ms)
	------------------------------------------------------------------------
		110       110  kworker/15:0H-s   27.91     0.00     0.00     0.00
		57        57  cpuhp/7            3.18     0.00     0.00     0.00
		99        99  cpuhp/14           2.97     0.00     0.00     0.00
		51        51  cpuhp/6            0.90     0.00     0.00     0.00
		44        44  kworker/4:0H-sy    0.80     0.00     0.00     0.00
		60        60  ksoftirqd/7        0.74     0.00     0.00     0.00
		76        76  idle_inject/10     0.31     0.00     0.00     0.00
		100       100  idle_inject/14     0.30     0.00     0.00     0.00
		1309      1309  systemsettings     0.29     0.00     0.00     0.00
		45        45  cpuhp/5            0.22     0.00     0.00     0.00
		63        63  cpuhp/8            0.20     0.00     0.00     0.00
		87        87  cpuhp/12           0.18     0.00     0.00     0.00
		93        93  cpuhp/13           0.17     0.00     0.00     0.00
		1265      1265  acpid              0.17     0.00     0.00     0.00
		1552      1552  sshd               0.17     0.00     0.00     0.00
		2584      2584  sddm-helper        0.16     0.00     0.00     0.00
		1284      1284  rtkit-daemon       0.15     0.00     0.00     0.00
		1326      1326  nde-netfilter      0.14     0.00     0.00     0.00
		27        27  cpuhp/2            0.13     0.00     0.00     0.00
		631       631  kworker/11:2-rc    0.11     0.00     0.00     0.00

Runtime key `o`는 CPU·IO·IRQ·Memory 등 sort field를 선택하고 `M`은 Default/Memory Verbose display mode를 전환하며 `q`는 종료합니다.

delaytop sort fields
FieldShortcutMeaning
cpucCPU delay
blkioiI/O delay
irqqIRQ delay
memmTotal memory delay
swapinsSwap-in delay; memory verbose only
freepagesrFreepages reclaim; memory verbose only
thrashingtThrashing; memory verbose only
compactpCompaction; memory verbose only
wpcopywWrite page copy; memory verbose only

`-s`/`--sort` 또는 interactive command에서 선택할 수 있습니다.

Interactive keyboard controls during runtime::

	o - Select sort field (CPU, IO, IRQ, Memory, etc.)
	M - Toggle display mode (Default/Memory Verbose)
	q - Quit

Available sort fields(use -s/--sort or interactive command)::

	cpu(c)       - CPU delay
	blkio(i)     - I/O delay
	irq(q)       - IRQ delay
	mem(m)       - Total memory delay
	swapin(s)    - Swapin delay (memory verbose mode only)
	freepages(r) - Freepages reclaim delay (memory verbose mode only)
	thrashing(t) - Thrashing delay (memory verbose mode only)
	compact(p)   - Compaction delay (memory verbose mode only)
	wpcopy(w)    - Write page copy delay (memory verbose mode only)

Advanced usage examples::

	# ./delaytop -s blkio
	Sorted by IO delay

	# ./delaytop -s mem -M
	Sorted by memory delay in memory verbose mode

	# ./delaytop -p pid
	Print delayacct stats

	# ./delaytop -P num
	Display the top N tasks

	# ./delaytop -n num
	Set delaytop refresh frequency (num times)

	# ./delaytop -d secs
	Specify refresh interval as secs

Advanced example에서 `-s blkio`는 I/O delay로 sort하고 `-s mem -M`은 memory verbose mode에서 memory delay로 sort합니다. `-p pid`는 delayacct statistic을 출력하고 `-P num`은 Top-N task 수, `-n num`은 refresh 횟수, `-d secs`는 refresh interval을 지정합니다.