3 # Copyright (C) 2022 Roman Gushchin <roman.gushchin@linux.dev>
4 # Copyright (C) 2022 Meta
10 def scan_cgroups(cgroup_root
):
13 for root
, subdirs
, _
in os
.walk(cgroup_root
):
14 for cgroup
in subdirs
:
15 path
= os
.path
.join(root
, cgroup
)
16 ino
= os
.stat(path
).st_ino
23 def scan_shrinkers(shrinker_debugfs
):
26 for root
, subdirs
, _
in os
.walk(shrinker_debugfs
):
27 for shrinker
in subdirs
:
28 count_path
= os
.path
.join(root
, shrinker
, "count")
29 with
open(count_path
) as f
:
30 for line
in f
.readlines():
31 items
= line
.split(' ')
33 # (count, shrinker, memcg ino)
34 shrinkers
.append((int(items
[1]), shrinker
, ino
))
39 parser
= argparse
.ArgumentParser(description
='Display biggest shrinkers')
40 parser
.add_argument('-n', '--lines', type=int, help='Number of lines to print')
42 args
= parser
.parse_args()
44 cgroups
= scan_cgroups("/sys/fs/cgroup/")
45 shrinkers
= scan_shrinkers("/sys/kernel/debug/shrinker/")
46 shrinkers
.sort(reverse
= True, key
= lambda x
: x
[0])
50 count
, name
, ino
= (s
[0], s
[1], s
[2])
54 if ino
== 0 or ino
== 1:
60 cg
= "unknown (%d)" % ino
62 print("%-8s %-20s %s" % (count
, name
, cg
))
65 if args
.lines
and n
>= args
.lines
:
69 if __name__
== '__main__':