My homepage

Recent movies

Random photo

Recent tracks

Top «Prev(2005-09-04) Latest Next(2005-09-20)» Edit
2004|06|07|08|09|11|
2005|01|02|05|06|07|08|09|10|11|12|
2006|01|02|03|06|08|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|

pterjan's diary


2005-09-14

  How can rpm -qa be so slow ?

rpm -qa is about 20 times slower than the same search in ruby, even if I enforce the search on name.
When I search a particular rpm using its name, the time is the same with rpm -q and ruby version. In fact, I didn't find any case when the C version is faster than the ruby one !
I really can't understand how the binding code can be faster than the official C rpm software...
[root@plop tmp]# time ruby -rrpm -e 'RPM::DB.new.each{ |p| puts "#{p.name}-#{p.version}"}' > ra
0.27user 0.08system 0:00.44elapsed 82%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+7219minor)pagefaults 0swaps
[root@plop tmp] # time rpm -qa > rb 7.14user 0.07system 0:07.48elapsed 96%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+4543minor)pagefaults 0swaps
[root@plop tmp] # time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::TAG_NAME,nil){ |p| puts "#{p.name}-#{p.version}"}' > rc 0.29user 0.06system 0:00.44elapsed 81%CPU (0avgtext+0avgdata 0maxresident)k
[root@plop tmp]# diff ra rb [root@plop tmp]# diff ra rc [root@plop tmp]#
[root@plop tmp]# time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::TAG_NAME,"rpm"){ |p| puts "#{p.name}-#{p.version}"}'
rpm-4.4.1-10mdk
0.03user 0.00system 0:00.10elapsed 34%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1319minor)pagefaults 0swaps
[root@plop tmp] # time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::DBI_LABEL,"rpm"){ |p| puts "#{p.name}-#{p.version}"}' rpm-4.4.1-10mdk 0.03user 0.00system 0:00.10elapsed 34%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+1321minor)pagefaults 0swaps
[root@plop tmp] # time rpm -q rpm rpm-4.4.1-10mdk 0.03user 0.00system 0:00.10elapsed 36%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+1630minor)pagefaults 0swaps
[root@plop tmp]# time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::TAG_BASENAMES, "/bin/sh"){ |p| puts "#{p.name}-#{p.version}"}'
bash-3.0-6mdk
0.04user 0.00system 0:00.11elapsed 42%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+2029minor)pagefaults 0swaps
[root@plop tmp] # time rpm -qf /bin/sh bash-3.0-6mdk 0.04user 0.00system 0:00.12elapsed 42%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+2311minor)pagefaults 0swaps
[root@plop tmp]# time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::TAG_NAME,"rpm"){ |p| puts p.sprintf("[%{RequireName} %{RequireFlags:depflags} %{RequireVersion}\n]")}' > ra
0.03user 0.00system 0:00.10elapsed 34%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1288minor)pagefaults 0swaps
[root@plop tmp] # time rpm -q --requires rpm > rb 0.03user 0.00system 0:00.11elapsed 36%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+1610minor)pagefaults 0swaps
[root@plop tmp] # diff ra rb [root@plop tmp]#
[root@plop tmp]# time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::TAG_REQUIRENAME,"rpm"){ |p| puts "#{p.name}-#{p.version}"}'
basesystem-10.1-1mdk
menu-2.1.23-1mdk
cups-common-1.1.23-11mdk
rpm-python-4.4.1-10mdk
rpm-build-4.4.1-10mdk
perl-URPM-1.24-1mdk
rpmtools-5.0.21-1mdk
0.03user 0.00system 0:00.11elapsed 33%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1431minor)pagefaults 0swaps
[root@plop tmp] # time rpm -q --whatrequires rpm basesystem-10.1-1mdk menu-2.1.23-1mdk cups-common-1.1.23-11mdk rpm-python-4.4.1-10mdk rpm-build-4.4.1-10mdk perl-URPM-1.24-1mdk rpmtools-5.0.21-1mdk 0.07user 0.00system 0:00.16elapsed 48%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+1673minor)pagefaults 0swaps
Today's TSUKKOMI(Total: 3) [Add a TSUKKOMI]
  Joseph Cheek (2005-09-15 16:11)

I have noticed that rpm -qa is very slow on 2006 Cooker. It wasn't the case on Desktop/LX, but that is a lot of different software. But yes, rpm -qa is abnormally slow.

  Per Øyvind Karlsen (2007-02-04 03:45)

Laaaaaaaaaate reply, but I believe here's why:<br>[hawkeye@terror ~]$ time rpm -qa --nosignature --nodigest > tmp/rpm.rpm<br>0.75user 0.27system 0:01.09elapsed 93%CPU (0avgtext+0avgdata 0maxresident)k<br>0inputs+0outputs (0major+2845minor)pagefaults 0swaps<br>[hawkeye@terror ~]$ time ruby -rrpm -e 'RPM::DB.new.each{ |p| puts "#{p.name}-#{p.version}"}' > tmp/ruby.rpm<br>0.80user 0.30system 0:01.18elapsed 93%CPU (0avgtext+0avgdata 0maxresident)k<br>0inputs+0outputs (0major+5090minor)pagefaults 0swaps<br><br>I believe ruby doesn't verify digest nor signature by default?

  pterjan (2007-02-04 10:39)

Yes, it only queries the database as you can see in the simple code :) See http://fasmz.org/~pterjan/blog/?date=20051208