1d261ea23SRoman Gushchin#!/usr/bin/env python3 2d261ea23SRoman Gushchin# 3d261ea23SRoman Gushchin# Copyright (C) 2022 Roman Gushchin <roman.gushchin@linux.dev> 4d261ea23SRoman Gushchin# Copyright (C) 2022 Meta 5d261ea23SRoman Gushchin 6d261ea23SRoman Gushchinimport os 7d261ea23SRoman Gushchinimport argparse 8d261ea23SRoman Gushchin 9d261ea23SRoman Gushchin 10d261ea23SRoman Gushchindef scan_cgroups(cgroup_root): 11d261ea23SRoman Gushchin cgroups = {} 12d261ea23SRoman Gushchin 13d261ea23SRoman Gushchin for root, subdirs, _ in os.walk(cgroup_root): 14d261ea23SRoman Gushchin for cgroup in subdirs: 15d261ea23SRoman Gushchin path = os.path.join(root, cgroup) 16d261ea23SRoman Gushchin ino = os.stat(path).st_ino 17d261ea23SRoman Gushchin cgroups[ino] = path 18d261ea23SRoman Gushchin 19d261ea23SRoman Gushchin # (memcg ino, path) 20d261ea23SRoman Gushchin return cgroups 21d261ea23SRoman Gushchin 22d261ea23SRoman Gushchin 23d261ea23SRoman Gushchindef scan_shrinkers(shrinker_debugfs): 24d261ea23SRoman Gushchin shrinkers = [] 25d261ea23SRoman Gushchin 26d261ea23SRoman Gushchin for root, subdirs, _ in os.walk(shrinker_debugfs): 27d261ea23SRoman Gushchin for shrinker in subdirs: 28d261ea23SRoman Gushchin count_path = os.path.join(root, shrinker, "count") 29d261ea23SRoman Gushchin with open(count_path) as f: 30d261ea23SRoman Gushchin for line in f.readlines(): 31d261ea23SRoman Gushchin items = line.split(' ') 32d261ea23SRoman Gushchin ino = int(items[0]) 33d261ea23SRoman Gushchin # (count, shrinker, memcg ino) 34d261ea23SRoman Gushchin shrinkers.append((int(items[1]), shrinker, ino)) 35d261ea23SRoman Gushchin return shrinkers 36d261ea23SRoman Gushchin 37d261ea23SRoman Gushchin 38d261ea23SRoman Gushchindef main(): 39d261ea23SRoman Gushchin parser = argparse.ArgumentParser(description='Display biggest shrinkers') 40d261ea23SRoman Gushchin parser.add_argument('-n', '--lines', type=int, help='Number of lines to print') 41d261ea23SRoman Gushchin 42d261ea23SRoman Gushchin args = parser.parse_args() 43d261ea23SRoman Gushchin 44d261ea23SRoman Gushchin cgroups = scan_cgroups("/sys/fs/cgroup/") 45d261ea23SRoman Gushchin shrinkers = scan_shrinkers("/sys/kernel/debug/shrinker/") 46*d526643fSAlexander Pantyukhin shrinkers.sort(reverse = True, key = lambda x: x[0]) 47d261ea23SRoman Gushchin 48d261ea23SRoman Gushchin n = 0 49d261ea23SRoman Gushchin for s in shrinkers: 50d261ea23SRoman Gushchin count, name, ino = (s[0], s[1], s[2]) 51d261ea23SRoman Gushchin if count == 0: 52d261ea23SRoman Gushchin break 53d261ea23SRoman Gushchin 54d261ea23SRoman Gushchin if ino == 0 or ino == 1: 55d261ea23SRoman Gushchin cg = "/" 56d261ea23SRoman Gushchin else: 57d261ea23SRoman Gushchin try: 58d261ea23SRoman Gushchin cg = cgroups[ino] 59d261ea23SRoman Gushchin except KeyError: 60d261ea23SRoman Gushchin cg = "unknown (%d)" % ino 61d261ea23SRoman Gushchin 62d261ea23SRoman Gushchin print("%-8s %-20s %s" % (count, name, cg)) 63d261ea23SRoman Gushchin 64d261ea23SRoman Gushchin n += 1 65d261ea23SRoman Gushchin if args.lines and n >= args.lines: 66d261ea23SRoman Gushchin break 67d261ea23SRoman Gushchin 68d261ea23SRoman Gushchin 69d261ea23SRoman Gushchinif __name__ == '__main__': 70d261ea23SRoman Gushchin main() 71