[Yum-devel] [HOWTO]: profiling with cProfile and kcachegrind
Terje Rosten
terje.rosten at ntnu.no
Wed Jan 3 20:03:33 UTC 2007
Quick howto to do profiling of yum with cProfile and
kcachegrind. (Might be added to Wiki?)
First install some software (kcachegrind and dot (from graphviz))
$ yum -y install /usr/bin/kcachegrind /usr/bin/dot
Then get lsprofcalltree
$ mkdir ~/py-2.5
$ cd ~/py-2.5
$ wget http://www.gnome.org/~johan/lsprofcalltree.py
We need some stuff from Python-2.5 (if not working in rawhide or
distro with fresh Python bits).
Install buildrequires:
$ yum install readline-devel libtermcap-devel ncurses-devel gdbm-devel \
expat-devel tcl-devel tk-devel tix-devel bzip2-devel \
sqlite-devel db4-devel
Download, unpack, build and install Python-2.5:
$ wget http://www.python.org/ftp/python/2.5/Python-2.5.tar.bz2
$ tar xjvf Python-2.5.tar.bz2
$ cd Python-2.5
$ ./configure --prefix=/dev/shm/py-2.5 \
--enable-ipv6 --enable-unicode=ucs4 --enable-shared
$ make && make install
Make links in our python dir:
$ cd ~/py-2.5
$ ln -s /dev/shm/py-2.5/lib/python2.5/lib-dynload/_lsprof.so
$ ln -s /dev/shm/py-2.5/lib/python2.5/cProfile.py
$ ln -s /dev/shm/py-2.5/lib/python2.5/pstats.py
$ ln -s /dev/shm/py-2.5/lib/libpython2.5.so.1.0
Now we are ready for the profiling stuff, get a yum release:
$ wget http://linux.duke.edu/yum/download/3.0/yum-3.0.2.tar.gz
$ tar xzvf yum-3.0.2.tar.gz
$ cd yum-3.0.2
Then apply the following yum profiling patch:
(Seth: apply to CVS if you want)
diff -u -r1.103 yummain.py
--- yummain.py 19 Dec 2006 03:43:31 -0000 1.103
+++ yummain.py 3 Jan 2007 18:11:20 -0000
@@ -25,6 +25,7 @@
from yum import logginglevels
import cli
+PROFILING = False
def main(args):
"""This does all the real work"""
@@ -181,14 +182,22 @@
verbose_logger.log(logginglevels.INFO_2, 'Complete!')
unlock()
- sys.exit(0)
+ if not PROFILING:
+ sys.exit(0)
if __name__ == "__main__":
- #import hotshot
- #p = hotshot.Profile(os.path.expanduser("~/yum.prof"))
- #p.run('main(sys.argv[1:])')
- #p.close()
+ if PROFILING:
+ import os
+ import cProfile
+ import lsprofcalltree
+ p = cProfile.Profile()
+ p.run('main(sys.argv[1:])')
+ k = lsprofcalltree.KCacheGrind(p)
+ data = open(os.path.expanduser('~/yum-prof.kgrind'), 'w+')
+ k.output(data)
+ data.close()
+ sys.exit(0)
try:
main(sys.argv[1:])
except KeyboardInterrupt, e:
Then set PROFILING to True in yummain.py.
To generate data, try e.g.
$ rpm -e xpdf
$ LD_LIBRARY_PATH=~/py-2.5 PYTHONPATH=~/py-2.5 python yummain.py -y install xpdf
Start kcachegrind and watch the data in it's full glory:
$ cd
$ kcachegrind yum-prof.kgrind
( Before doing a new run, move ~/yum-prof.kgrind )
- Terje
More information about the Yum-devel
mailing list