← Documents Documentation/admin-guide/mm/shrinker_debugfs.rst GitHub 원문 ↗

Linux 6.18.37 · Administration / Memory Management

Shrinker Debugfs Interface

Registered memory shrinker의 memcg·NUMA별 object count와 수동 scan 방법을 설명합니다.

Source pathDocumentation/admin-guide/mm/shrinker_debugfs.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

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

1. 요약·해설

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

운영 핵심

shrinker_debugfs.rst:1-133

Shrinker debugfs는 reclaim 대상 object를 shrinker·memory cgroup·NUMA node 단위로 관찰하고 callback을 직접 실행하는 진단 interface입니다. 운영 환경에서는 count의 생략·0 fallback 규칙과 scan 요청량이 실제 reclaim 수를 보장하지 않는다는 점을 함께 해석해야 합니다.

관점핵심
Discovery`<debugfs>/shrinker/<name>-<id>/`에서 registered shrinker 확인
Countmemcg inode와 NUMA node별 reclaimable object count 조회
Scan`<cgroup inode id> <numa id> <objects>`를 `scan`에 write
Fallbackmemcg 또는 NUMA awareness가 없으면 0으로 표현

2. 영어 원문 전체

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

원문 전체 펼치기
1 ==========================
2 Shrinker Debugfs Interface
3 ==========================
4
5 Shrinker debugfs interface provides a visibility into the kernel memory
6 shrinkers subsystem and allows to get information about individual shrinkers
7 and interact with them.
8
9 For each shrinker registered in the system a directory in **<debugfs>/shrinker/**
10 is created. The directory's name is composed from the shrinker's name and an
11 unique id: e.g. *kfree_rcu-0* or *sb-xfs:vda1-36*.
12
13 Each shrinker directory contains **count** and **scan** files, which allow to
14 trigger *count_objects()* and *scan_objects()* callbacks for each memcg and
15 numa node (if applicable).
16
17 Usage:
18 ------
19
20 1. *List registered shrinkers*
21
22 ::
23
24 $ cd /sys/kernel/debug/shrinker/
25 $ ls
26 dquota-cache-16 sb-devpts-28 sb-proc-47 sb-tmpfs-42
27 mm-shadow-18 sb-devtmpfs-5 sb-proc-48 sb-tmpfs-43
28 mm-zspool:zram0-34 sb-hugetlbfs-17 sb-pstore-31 sb-tmpfs-44
29 rcu-kfree-0 sb-hugetlbfs-33 sb-rootfs-2 sb-tmpfs-49
30 sb-aio-20 sb-iomem-12 sb-securityfs-6 sb-tracefs-13
31 sb-anon_inodefs-15 sb-mqueue-21 sb-selinuxfs-22 sb-xfs:vda1-36
32 sb-bdev-3 sb-nsfs-4 sb-sockfs-8 sb-zsmalloc-19
33 sb-bpf-32 sb-pipefs-14 sb-sysfs-26 thp-deferred_split-10
34 sb-btrfs:vda2-24 sb-proc-25 sb-tmpfs-1 thp-zero-9
35 sb-cgroup2-30 sb-proc-39 sb-tmpfs-27 xfs-buf:vda1-37
36 sb-configfs-23 sb-proc-41 sb-tmpfs-29 xfs-inodegc:vda1-38
37 sb-dax-11 sb-proc-45 sb-tmpfs-35
38 sb-debugfs-7 sb-proc-46 sb-tmpfs-40
39
40 2. *Get information about a specific shrinker*
41
42 ::
43
44 $ cd sb-btrfs\:vda2-24/
45 $ ls
46 count scan
47
48 3. *Count objects*
49
50 Each line in the output has the following format::
51
52 <cgroup inode id> <nr of objects on node 0> <nr of objects on node 1> ...
53 <cgroup inode id> <nr of objects on node 0> <nr of objects on node 1> ...
54 ...
55
56 If there are no objects on all numa nodes, a line is omitted. If there
57 are no objects at all, the output might be empty.
58
59 If the shrinker is not memcg-aware or CONFIG_MEMCG is off, 0 is printed
60 as cgroup inode id. If the shrinker is not numa-aware, 0's are printed
61 for all nodes except the first one.
62 ::
63
64 $ cat count
65 1 224 2
66 21 98 0
67 55 818 10
68 2367 2 0
69 2401 30 0
70 225 13 0
71 599 35 0
72 939 124 0
73 1041 3 0
74 1075 1 0
75 1109 1 0
76 1279 60 0
77 1313 7 0
78 1347 39 0
79 1381 3 0
80 1449 14 0
81 1483 63 0
82 1517 53 0
83 1551 6 0
84 1585 1 0
85 1619 6 0
86 1653 40 0
87 1687 11 0
88 1721 8 0
89 1755 4 0
90 1789 52 0
91 1823 888 0
92 1857 1 0
93 1925 2 0
94 1959 32 0
95 2027 22 0
96 2061 9 0
97 2469 799 0
98 2537 861 0
99 2639 1 0
100 2707 70 0
101 2775 4 0
102 2877 84 0
103 293 1 0
104 735 8 0
105
106 4. *Scan objects*
107
108 The expected input format::
109
110 <cgroup inode id> <numa id> <number of objects to scan>
111
112 For a non-memcg-aware shrinker or on a system with no memory
113 cgrups **0** should be passed as cgroup id.
114 ::
115
116 $ cd /sys/kernel/debug/shrinker/
117 $ cd sb-btrfs\:vda2-24/
118
119 $ cat count | head -n 5
120 1 212 0
121 21 97 0
122 55 802 5
123 2367 2 0
124 225 13 0
125
126 $ echo "55 0 200" > scan
127
128 $ cat count | head -n 5
129 1 212 0
130 21 96 0
131 55 752 5
132 2367 2 0
133 225 13 0
134

3. 한국어 전문 번역

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

Shrinker debugfs interface

1-16

Shrinker debugfs interface는 kernel memory shrinker subsystem을 관찰하고 개별 shrinker와 상호작용할 수 있게 합니다.

System에 등록된 shrinker마다 `<debugfs>/shrinker/` 아래에 directory가 만들어집니다. Directory 이름은 shrinker name과 unique id를 결합하며 `kfree_rcu-0`, `sb-xfs:vda1-36` 같은 형식입니다.

File동작Callback과 범위
countreadmemcg와 NUMA node별 `count_objects()` callback 실행 결과
scanwrite선택한 memcg·NUMA node에 `scan_objects()` callback 실행

각 shrinker directory의 `count`와 `scan` file은 적용 가능한 경우 memcg와 NUMA node마다 각각 `count_objects()`와 `scan_objects()` callback을 호출합니다.

Shrinker debugfs directory 계약
<debugfs>/shrinker/<shrinker-name>-<unique-id>/count → count_objects()
<debugfs>/shrinker/<shrinker-name>-<unique-id>/scan → scan_objects()

Registered shrinker 하나마다 name-id directory와 두 callback file이 생깁니다.

Registered shrinker 목록

17-39

먼저 debugfs의 shrinker directory로 이동해 등록된 shrinker를 나열합니다.

$ cd /sys/kernel/debug/shrinker/
$ ls
dquota-cache-16     sb-devpts-28     sb-proc-47       sb-tmpfs-42
mm-shadow-18        sb-devtmpfs-5    sb-proc-48       sb-tmpfs-43
mm-zspool:zram0-34  sb-hugetlbfs-17  sb-pstore-31     sb-tmpfs-44
rcu-kfree-0         sb-hugetlbfs-33  sb-rootfs-2      sb-tmpfs-49
sb-aio-20           sb-iomem-12      sb-securityfs-6  sb-tracefs-13
sb-anon_inodefs-15  sb-mqueue-21     sb-selinuxfs-22  sb-xfs:vda1-36
sb-bdev-3           sb-nsfs-4        sb-sockfs-8      sb-zsmalloc-19
sb-bpf-32           sb-pipefs-14     sb-sysfs-26      thp-deferred_split-10
sb-btrfs:vda2-24    sb-proc-25       sb-tmpfs-1       thp-zero-9
sb-cgroup2-30       sb-proc-39       sb-tmpfs-27      xfs-buf:vda1-37
sb-configfs-23      sb-proc-41       sb-tmpfs-29      xfs-inodegc:vda1-38
sb-dax-11           sb-proc-45       sb-tmpfs-35
sb-debugfs-7        sb-proc-46       sb-tmpfs-40
예제 이름해석
kfree_rcu-0shrinker name `kfree_rcu`, unique id `0`
sb-xfs:vda1-36XFS superblock shrinker, device `vda1`, id `36`
sb-btrfs:vda2-24예제에서 사용하는 Btrfs superblock shrinker

목록에는 filesystem superblock, dquota, zram zspool, RCU free, THP, XFS buffer·inode GC 등 서로 다른 subsystem의 shrinker가 함께 나타납니다. 끝의 숫자는 동일한 name을 구별하는 unique id입니다.

개별 shrinker file

40-47

특정 shrinker directory로 이동하면 `count`와 `scan` 두 file을 확인할 수 있습니다.

$ cd sb-btrfs\:vda2-24/
$ ls
count            scan

Object count 형식

48-61

`count` output의 각 line은 cgroup inode id 뒤에 node 0, node 1 순으로 object count를 기록합니다.

<cgroup inode id> <nr of objects on node 0> <nr of objects on node 1> ...
<cgroup inode id> <nr of objects on node 0> <nr of objects on node 1> ...
...
항목위치규칙
cgroup inode id첫 fieldmemory cgroup 식별자
node별 object 수두 번째 이후 fieldnode 0, node 1, ... 순서의 reclaimable object count
생략 조건line 전체모든 NUMA node count가 0이면 line 생략; object가 전혀 없으면 output이 비어 있을 수 있음

Shrinker가 memcg-aware가 아니거나 `CONFIG_MEMCG`가 꺼져 있으면 cgroup inode id로 0을 출력합니다. NUMA-aware가 아니면 첫 node를 제외한 모든 node field에 0을 출력합니다.

Object count 예제

62-105

다음 `cat count` 예제는 여러 memory cgroup에서 node 0과 node 1에 존재하는 reclaimable object 수를 보여 줍니다.

$ cat count
1 224 2
21 98 0
55 818 10
2367 2 0
2401 30 0
225 13 0
599 35 0
939 124 0
1041 3 0
1075 1 0
1109 1 0
1279 60 0
1313 7 0
1347 39 0
1381 3 0
1449 14 0
1483 63 0
1517 53 0
1551 6 0
1585 1 0
1619 6 0
1653 40 0
1687 11 0
1721 8 0
1755 4 0
1789 52 0
1823 888 0
1857 1 0
1925 2 0
1959 32 0
2027 22 0
2061 9 0
2469 799 0
2537 861 0
2639 1 0
2707 70 0
2775 4 0
2877 84 0
293 1 0
735 8 0

모든 NUMA node에서 object 수가 0인 cgroup line은 생략되므로 이 목록이 system의 모든 cgroup을 열거하는 것은 아닙니다.

Object scan 실행

106-133

`scan` file에는 cgroup inode id, NUMA id, scan할 object 수를 공백으로 구분해 씁니다.

<cgroup inode id> <numa id> <number of objects to scan>
Field의미
cgroup inode id대상 memory cgroup; non-memcg-aware이면 0
numa idscan할 NUMA node id
number of objects to scan`scan_objects()`에 요청할 object 수

Non-memcg-aware shrinker 또는 memory cgroup이 없는 system에서는 cgroup id로 `0`을 전달해야 합니다.

$ cd /sys/kernel/debug/shrinker/
$ cd sb-btrfs\:vda2-24/

$ cat count | head -n 5
1 212 0
21 97 0
55 802 5
2367 2 0
225 13 0

$ echo "55 0 200" > scan

$ cat count | head -n 5
1 212 0
21 96 0
55 752 5
2367 2 0
225 13 0
cgroup 55, node 0 scan 전후
대상scan 전scan 후변화
cgroup 55, node 0802752-50
cgroup 55, node 1550
undefinedundefined

`55 0 200`을 `scan`에 write한 뒤 예제 count가 어떻게 변했는지 비교합니다.

예제에서는 `echo "55 0 200" > scan`으로 cgroup inode 55의 NUMA node 0에서 최대 200 object scan을 요청합니다. 다음 count에서 cgroup 55의 node 0 값은 802에서 752로 줄고 node 1 값은 5로 유지됩니다. 다른 cgroup count도 callback 실행이나 system activity에 따라 달라질 수 있습니다.

`scan`은 object 수를 정확히 그만큼 제거하라는 보장이 아니라 shrinker callback에 scan 작업량을 요청하는 interface입니다.