Back to home page

OSCL-LXR

 
 

    


0001 #!/usr/bin/env python3
0002 #
0003 # Copyright (C) 2022 Roman Gushchin <roman.gushchin@linux.dev>
0004 # Copyright (C) 2022 Meta
0005 
0006 import os
0007 import argparse
0008 import sys
0009 
0010 
0011 def scan_cgroups(cgroup_root):
0012     cgroups = {}
0013 
0014     for root, subdirs, _ in os.walk(cgroup_root):
0015         for cgroup in subdirs:
0016             path = os.path.join(root, cgroup)
0017             ino = os.stat(path).st_ino
0018             cgroups[ino] = path
0019 
0020     # (memcg ino, path)
0021     return cgroups
0022 
0023 
0024 def scan_shrinkers(shrinker_debugfs):
0025     shrinkers = []
0026 
0027     for root, subdirs, _ in os.walk(shrinker_debugfs):
0028         for shrinker in subdirs:
0029             count_path = os.path.join(root, shrinker, "count")
0030             with open(count_path) as f:
0031                 for line in f.readlines():
0032                     items = line.split(' ')
0033                     ino = int(items[0])
0034                     # (count, shrinker, memcg ino)
0035                     shrinkers.append((int(items[1]), shrinker, ino))
0036     return shrinkers
0037 
0038 
0039 def main():
0040     parser = argparse.ArgumentParser(description='Display biggest shrinkers')
0041     parser.add_argument('-n', '--lines', type=int, help='Number of lines to print')
0042 
0043     args = parser.parse_args()
0044 
0045     cgroups = scan_cgroups("/sys/fs/cgroup/")
0046     shrinkers = scan_shrinkers("/sys/kernel/debug/shrinker/")
0047     shrinkers = sorted(shrinkers, reverse = True, key = lambda x: x[0])
0048 
0049     n = 0
0050     for s in shrinkers:
0051         count, name, ino = (s[0], s[1], s[2])
0052         if count == 0:
0053             break
0054 
0055         if ino == 0 or ino == 1:
0056             cg = "/"
0057         else:
0058             try:
0059                 cg = cgroups[ino]
0060             except KeyError:
0061                 cg = "unknown (%d)" % ino
0062 
0063         print("%-8s %-20s %s" % (count, name, cg))
0064 
0065         n += 1
0066         if args.lines and n >= args.lines:
0067             break
0068 
0069 
0070 if __name__ == '__main__':
0071     main()