5 __author__ =
"Sebastien Binet <binet@cern.ch>"
6 __doc__ =
"get the inclusive and exclusive vmem sizes of a library"
14 from PyUtils.Decorators
import forking
as forking
15 from PerfMonComps.PyMonUtils
import loaded_libs, pymon
22 return ctypes.cdll.LoadLibrary(libname)
29 libs = [l
for l
in loaded_libs()
30 if not os.path.basename(l)
in _veto_libs
and
31 os.access(l, os.R_OK)]
32 return (vmem0, vmem1, libs)
36 """retrieve the list of dependencies of a given library
37 both direct and indirect dependencies
39 bkg_libs = [os.path.basename(l)
for l
in loaded_libs()]
40 bkg_libs = [l
for l
in bkg_libs
if l
not in _veto_libs]
43 libs = [os.path.basename(l)
for l
in libs]
44 return [l
for l
in libs
if l
not in bkg_libs
and l!=libname]
48 bkg_libs = loaded_libs()
50 vmem0,vmem1,libs = load_lib (libname)
51 dVmemOffset = vmem1-vmem0
53 linked_libs = [os.path.basename(lib)
55 if (
not (lib
in bkg_libs)
and
56 os.path.basename(lib) != os.path.basename(libname)
57 and os.access(lib, os.R_OK))]
61 def load_linked_in_libs(linked_libs):
67 except Exception
as err:
68 print (
"** problem loading [%s]\n%s" % (l,err))
74 for _
in range(NRETRY):
75 ok = load_linked_in_libs(linked_libs)
79 print (
"** err: could not reliably load all libs (after %s retries)"%NRETRY)
83 vmem0,vmem1,libs = load_lib (libname)
85 dVmemLib = vmem1-vmem0
86 return (dVmemLib, dVmemOffset, len(linked_libs), len(bkg_libs))
91 _print = display.append
93 for libname
in libnames:
95 bname = os.path.basename(libname)
96 _print(
":: inspecting library: %s" % bname)
97 stats = analyze (libname)
98 _print(
":: nbr linked: %s" % stats[2])
99 _print(
":: dVmem-self: %8.3f Mb" % stats[0])
100 _print(
":: dVmem-all : %8.3f Mb" % stats[1])
102 lib_stats[bname] = dict(
105 nbr_linked= stats[2],
108 import operator
as _op
110 dep_stats = dict((d,
analyze(d)[:2])
for d
in deps)
111 dep_vmem = dep_stats.items()
112 dep_vmem.sort(key=_op.itemgetter(1), reverse=
True)
113 _print(
":: deps: lib-self | lib-all:")
115 _print(
":: --> [%8.3f |%8.3f Mb] (%s)" % (v[0], v[1], k))
117 return display,lib_stats
121 fname =
"vmem-stats-sz.csv"
122 print (
":: saving vmem statistics in [%s]..."%fname)
124 if os.path.exists (fname):
126 o = csv.writer (
open(fname,
"w"), delimiter=
';')
127 o.writerow ([
'nbr libraries', len(lib_stats)])
128 o.writerow ([
'lib name',
'dvmem-self (Mb)',
'dvmem-all (Mb)',
'nbr linked-libs'])
129 for k,v
in lib_stats.items():
130 o.writerow ([os.path.basename(k), v[
'vmem_self'], v[
'vmem_all'], v[
'nbr_linked']])
132 print (
":: saving vmem statistics in [%s]... [done]"%fname)
136 parser = argparse.ArgumentParser(
137 description=
'get the inclusive and exclusive vmem sizes of a library'
139 _add = parser.add_argument
143 help=
'list of library names to be inspected')
147 help=
'enable detailed output')
148 args = parser.parse_args()
150 libnames = args.libnames
151 doDetailed = args.detailed
153 print (
":: inspecting libraries: %s" % libnames)
154 display,lib_stats = analyze_libraries (libnames, doDetailed)
158 save_stats (lib_stats)
162 if __name__ ==
'__main__':