Add reading from alternate directory and tarball and example capture script
This commit is contained in:
parent
a7aa17b484
commit
000c1e0689
2 changed files with 50 additions and 9 deletions
12
capture
Executable file
12
capture
Executable file
|
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# example of capturing target data for smem
|
||||||
|
|
||||||
|
# capture a memory data snapshot with realtime priority
|
||||||
|
mkdir -p $1
|
||||||
|
chrt --fifo 99 \
|
||||||
|
cp -a --parents /proc/[0-9]*/{smaps,cmdline,stat} /proc/meminfo $1
|
||||||
|
|
||||||
|
# build a compressed tarball of snapshot
|
||||||
|
cd $1/proc
|
||||||
|
tar czf ../../$1.tgz *
|
||||||
|
|
||||||
47
smem
47
smem
|
|
@ -1,18 +1,25 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
import re, os, sys, pwd, grp, optparse, errno
|
import re, os, sys, pwd, grp, optparse, errno, tarfile
|
||||||
|
|
||||||
_ucache = {}
|
_ucache = {}
|
||||||
_gcache = {}
|
_gcache = {}
|
||||||
|
|
||||||
class procdata(object):
|
class procdata(object):
|
||||||
def pids(self):
|
def __init__(self, source):
|
||||||
'''get a list of processes'''
|
self.source = source and source or ""
|
||||||
return [int(e) for e in os.listdir("/proc")
|
def _list(self):
|
||||||
if e.isdigit() and not iskernel(e)]
|
return os.listdir(self.source + "/proc")
|
||||||
def _read(self, f):
|
def _read(self, f):
|
||||||
return file('/proc/' + f).read()
|
return file(self.source + '/proc/' + f).read()
|
||||||
def _readlines(self, f):
|
def _readlines(self, f):
|
||||||
return self._read(f).splitlines(True)
|
return self._read(f).splitlines(True)
|
||||||
|
def _stat(self, f):
|
||||||
|
return os.stat(self.source + "/proc/" + f)
|
||||||
|
|
||||||
|
def pids(self):
|
||||||
|
'''get a list of processes'''
|
||||||
|
return [int(e) for e in self._list()
|
||||||
|
if e.isdigit() and not iskernel(e)]
|
||||||
def mapdata(self, pid):
|
def mapdata(self, pid):
|
||||||
return self._readlines('%s/smaps' % pid)
|
return self._readlines('%s/smaps' % pid)
|
||||||
def memdata(self):
|
def memdata(self):
|
||||||
|
|
@ -24,9 +31,9 @@ class procdata(object):
|
||||||
c = self._read('%s/cmdline' % pid)[:-1]
|
c = self._read('%s/cmdline' % pid)[:-1]
|
||||||
return c.replace('\0', ' ')
|
return c.replace('\0', ' ')
|
||||||
def piduser(self, pid):
|
def piduser(self, pid):
|
||||||
return os.stat('/proc/%d/cmdline' % pid).st_uid
|
return self._stat('%d/cmdline' % pid).st_uid
|
||||||
def pidgroup(self, pid):
|
def pidgroup(self, pid):
|
||||||
return os.stat('/proc/%d/cmdline' % pid).st_gid
|
return self._stat('%d/cmdline' % pid).st_gid
|
||||||
def username(self, uid):
|
def username(self, uid):
|
||||||
if uid not in _ucache:
|
if uid not in _ucache:
|
||||||
_ucache[uid] = pwd.getpwuid(uid)[0]
|
_ucache[uid] = pwd.getpwuid(uid)[0]
|
||||||
|
|
@ -36,6 +43,23 @@ class procdata(object):
|
||||||
_gcache[gid] = pwd.getgrgid(gid)[0]
|
_gcache[gid] = pwd.getgrgid(gid)[0]
|
||||||
return _gcache[gid]
|
return _gcache[gid]
|
||||||
|
|
||||||
|
class tardata(procdata):
|
||||||
|
def __init__(self, source):
|
||||||
|
self.source = source
|
||||||
|
self.tar = tarfile.open(source)
|
||||||
|
def _list(self):
|
||||||
|
for ti in self.tar:
|
||||||
|
if ti.name.endswith('/'):
|
||||||
|
yield ti.name[:-1]
|
||||||
|
def _read(self, f):
|
||||||
|
return self.tar.extractfile(f).read()
|
||||||
|
def _readlines(self, f):
|
||||||
|
return self.tar.extractfile(f).readlines()
|
||||||
|
def piduser(self, p):
|
||||||
|
return self.tar.getmember("%s/cmdline" % p).uid
|
||||||
|
def pidgroup(self, p):
|
||||||
|
return self.tar.getmember("%s/cmdline" % p).gid
|
||||||
|
|
||||||
_totalmem = 0
|
_totalmem = 0
|
||||||
def totalmem():
|
def totalmem():
|
||||||
global _totalmem
|
global _totalmem
|
||||||
|
|
@ -417,12 +441,17 @@ parser.add_option("", "--pie", type='str',
|
||||||
parser.add_option("", "--bar", type='str',
|
parser.add_option("", "--bar", type='str',
|
||||||
help="show bar graph")
|
help="show bar graph")
|
||||||
|
|
||||||
|
parser.add_option("-S", "--source", type="str",
|
||||||
|
help="/proc data source")
|
||||||
|
|
||||||
defaults = {}
|
defaults = {}
|
||||||
parser.set_defaults(**defaults)
|
parser.set_defaults(**defaults)
|
||||||
(options, args) = parser.parse_args()
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
src = procdata()
|
try:
|
||||||
|
src = tardata(options.source)
|
||||||
|
except:
|
||||||
|
src = procdata(options.source)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if options.mappings:
|
if options.mappings:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue