lkml.org 
[lkml]   [2022]   [May]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 5/6] tools: add memcg_shrinker.py
    Date
    Add a simple tool which prints a sorted list of shrinker lists
    in the following format: (number of objects, shrinker name, cgroup).

    Example:
    $ ./memcg_shrinker.py -n 10
    2090 sb-sysfs-26 /sys/fs/cgroup/system.slice
    1809 sb-sysfs-26 /sys/fs/cgroup/system.slice/systemd-udevd.service
    1044 sb-btrfs:vda2-24 /sys/fs/cgroup/system.slice/system-dbus\x2d:1.3\...
    861 sb-btrfs:vda2-24 /sys/fs/cgroup/system.slice/system-dbus\x2d:1.3\...
    804 sb-btrfs:vda2-24 /sys/fs/cgroup/system.slice
    643 sb-btrfs:vda2-24 /sys/fs/cgroup/system.slice/firewalld.service
    616 sb-cgroup2-30 /sys/fs/cgroup/init.scope
    275 sb-sysfs-26 /
    238 sb-proc-25 /sys/fs/cgroup/system.slice/systemd-journald.service
    225 sb-proc-25 /sys/fs/cgroup/system.slice/abrtd.service

    Signed-off-by: Roman Gushchin <roman.gushchin@linux.dev>
    ---
    tools/cgroup/memcg_shrinker.py | 71 ++++++++++++++++++++++++++++++++++
    1 file changed, 71 insertions(+)
    create mode 100755 tools/cgroup/memcg_shrinker.py

    diff --git a/tools/cgroup/memcg_shrinker.py b/tools/cgroup/memcg_shrinker.py
    new file mode 100755
    index 000000000000..706ab27666a4
    --- /dev/null
    +++ b/tools/cgroup/memcg_shrinker.py
    @@ -0,0 +1,71 @@
    +#!/usr/bin/env python3
    +#
    +# Copyright (C) 2022 Roman Gushchin <roman.gushchin@linux.dev>
    +# Copyright (C) 2022 Meta
    +
    +import os
    +import argparse
    +import sys
    +
    +
    +def scan_cgroups(cgroup_root):
    + cgroups = {}
    +
    + for root, subdirs, _ in os.walk(cgroup_root):
    + for cgroup in subdirs:
    + path = os.path.join(root, cgroup)
    + ino = os.stat(path).st_ino
    + cgroups[ino] = path
    +
    + # (memcg ino, path)
    + return cgroups
    +
    +
    +def scan_shrinkers(shrinker_debugfs):
    + shrinkers = []
    +
    + for root, subdirs, _ in os.walk(shrinker_debugfs):
    + for shrinker in subdirs:
    + count_path = os.path.join(root, shrinker, "count")
    + with open(count_path) as f:
    + for line in f.readlines():
    + items = line.split(' ')
    + ino = int(items[0])
    + # (count, shrinker, memcg ino)
    + shrinkers.append((int(items[1]), shrinker, ino))
    + return shrinkers
    +
    +
    +def main():
    + parser = argparse.ArgumentParser(description='Display biggest shrinkers')
    + parser.add_argument('-n', '--lines', type=int, help='Number of lines to print')
    +
    + args = parser.parse_args()
    +
    + cgroups = scan_cgroups("/sys/fs/cgroup/")
    + shrinkers = scan_shrinkers("/sys/kernel/debug/shrinker/")
    + shrinkers = sorted(shrinkers, reverse = True, key = lambda x: x[0])
    +
    + n = 0
    + for s in shrinkers:
    + count, name, ino = (s[0], s[1], s[2])
    + if count == 0:
    + break
    +
    + if ino == 0 or ino == 1:
    + cg = "/"
    + else:
    + try:
    + cg = cgroups[ino]
    + except KeyError:
    + cg = "unknown (%d)" % ino
    +
    + print("%-8s %-20s %s" % (count, name, cg))
    +
    + n += 1
    + if args.lines and n >= args.lines:
    + break
    +
    +
    +if __name__ == '__main__':
    + main()
    --
    2.35.3
    \
     
     \ /
      Last update: 2022-06-01 05:24    [W:5.351 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site