Blame src/python/rlMemPeak.py

Packit bbb0ff
#!/usr/bin/python
Packit bbb0ff
Packit bbb0ff
# Authors:  Petr Muller     <pmuller@redhat.com> 
Packit bbb0ff
#
Packit bbb0ff
# Description: Prints a memory consumption peak of an executed program
Packit bbb0ff
#
Packit bbb0ff
# Copyright (c) 2008 Red Hat, Inc. All rights reserved. This copyrighted
Packit bbb0ff
# material is made available to anyone wishing to use, modify, copy, or
Packit bbb0ff
# redistribute it subject to the terms and conditions of the GNU General
Packit bbb0ff
# Public License v.2.
Packit bbb0ff
#
Packit bbb0ff
# This program is distributed in the hope that it will be useful, but WITHOUT
Packit bbb0ff
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit bbb0ff
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
Packit bbb0ff
# for more details.
Packit bbb0ff
#
Packit bbb0ff
# You should have received a copy of the GNU General Public License
Packit bbb0ff
# along with this program; if not, write to the Free Software
Packit bbb0ff
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit bbb0ff
Packit bbb0ff
import sys, time, re
Packit bbb0ff
Packit bbb0ff
use_sub   = False
Packit bbb0ff
use_popen = False
Packit bbb0ff
Packit bbb0ff
try:
Packit bbb0ff
  import subprocess
Packit bbb0ff
  use_sub = True
Packit bbb0ff
except ImportError:
Packit bbb0ff
  import popen2
Packit bbb0ff
  use_popen = True
Packit bbb0ff
Packit bbb0ff
if len(sys.argv) < 2:
Packit bbb0ff
  print 'syntax: rlMemPeak <command>'
Packit bbb0ff
  sys.exit(1)
Packit bbb0ff
Packit bbb0ff
proglist = sys.argv[1:]
Packit bbb0ff
Packit bbb0ff
if use_sub:
Packit bbb0ff
  task = subprocess.Popen(proglist)
Packit bbb0ff
elif use_popen:
Packit bbb0ff
  task = popen2.Popen3(" ".join(proglist))
Packit bbb0ff
Packit bbb0ff
maxmem = 0
Packit bbb0ff
fn = '/proc/%d/status' % task.pid
Packit bbb0ff
mre = re.compile(r'VmRSS:[ \t]+(?P<mem>\d+)')
Packit bbb0ff
Packit bbb0ff
while True:
Packit bbb0ff
  for line in open(fn, 'r').readlines():
Packit bbb0ff
    m = mre.search(line)
Packit bbb0ff
    if m:
Packit bbb0ff
      mem = int(m.group('mem'))
Packit bbb0ff
      maxmem = max(mem, maxmem)
Packit bbb0ff
      break
Packit bbb0ff
  time.sleep(0.1)
Packit bbb0ff
  finish = task.poll()
Packit bbb0ff
  if (use_sub and finish != None) or (use_popen and finish != -1):
Packit bbb0ff
    break
Packit bbb0ff
Packit bbb0ff
print "%d" % (maxmem)