0001
0002
0003
0004
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
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
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()