知りたいです。
rpm
(簡単な)データベースを使用して、パケット名などを保存します。このデータベースを照会するために使用するのは非常にrpm -qa
遅いです。
たとえば、ディスクが「シャッフル」している間、このコマンドを完了するのに約1分かかりました。
# rpm -qa rtl8812au-kmp\*
rtl8812au-kmp-preempt-5.9.3.2+git20210427.6ef5d8f_k5.3.18_57-lp153.1.1.x86_64
rtl8812au-kmp-default-5.9.3.2+git20210427.6ef5d8f_k5.3.18_57-lp153.1.1.x86_64
もちろん、2回目の呼び出しはすべてのデータがディスクキャッシュにあったのではるかに高速でした。しかし、「クイック」はスペルが異なります。
# grep MHz /proc/cpuinfo
cpu MHz : 3998.528
...
# LANG= time dd if=/var/lib/rpm/Packages of=/dev/null
748816+0 records in
748816+0 records out
383393792 bytes (383 MB, 366 MiB) copied, 0.606612 s, 632 MB/s
0.30user 0.29system 0:00.60elapsed 99%CPU (0avgtext+0avgdata 1876maxresident)k
0inputs+0outputs (0major+81minor)pagefaults 0swaps
# LANG= time rpm -qa rtl8812au-kmp\*
rtl8812au-kmp-preempt-5.9.3.2+git20210427.6ef5d8f_k5.3.18_57-lp153.1.1.x86_64
rtl8812au-kmp-default-5.9.3.2+git20210427.6ef5d8f_k5.3.18_57-lp153.1.1.x86_64
2.17user 0.06system 0:02.24elapsed 99%CPU (0avgtext+0avgdata 32472maxresident)k
0inputs+0outputs (0major+6302minor)pagefaults 0swaps
したがって、特定の名前を検索するよりも、パッケージ全体(名前)データベースを完全に読み取る方が高速です!
/var
(ルート)ファイルシステムはext3
LVに配置され、VGのPVはRAID1(imsm)パーティションから作成されたLUKS暗号化ボリュームです。
# hdparm -t /dev/mapper/system-root
/dev/mapper/system-root:
Timing buffered disk reads: 242 MB in 3.02 seconds = 80.19 MB/sec
# hdparm -t /dev/mapper/cr_md-uuid-fe1588c4:a2140388:5b4117ba:4e4339b9-part5
/dev/mapper/cr_md-uuid-fe1588c4:a2140388:5b4117ba:4e4339b9-part5:
Timing buffered disk reads: 240 MB in 3.03 seconds = 79.33 MB/sec
# hdparm -t /dev/disk/by-id/md-uuid-fe1588c4:a2140388:5b4117ba:4e4339b9-part5
/dev/disk/by-id/md-uuid-fe1588c4:a2140388:5b4117ba:4e4339b9-part5:
Timing buffered disk reads: 290 MB in 3.01 seconds = 96.32 MB/sec
# hdparm -t /dev/md126
/dev/md126:
Timing buffered disk reads: 408 MB in 3.01 seconds = 135.63 MB/sec
# hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 394 MB in 3.01 seconds = 130.92 MB/sec
# hdparm -t /dev/sdb
/dev/sdb:
Timing buffered disk reads: 444 MB in 3.03 seconds = 146.61 MB/sec
タイミング例
遅く追加して申し訳ありません。起動後、RPMデータベースファイルがキャッシュに入る前にタイミングテストを実行することを忘れないでください。
~> time rpm -qa libavd\*
libavdevice58_13-4.4-pm153.2.8.x86_64
libavdevice57-3.4.9-pm153.1.2.x86_64
real 1m15,788s
user 0m2,727s
sys 0m0,613s
~> time rpm -qa libavd\*
libavdevice58_13-4.4-pm153.2.8.x86_64
libavdevice57-3.4.9-pm153.1.2.x86_64
real 0m2,300s
user 0m2,220s
sys 0m0,080s
したがって、このコマンドには、RAMキャッシュ内のすべてのファイルに対して2.2秒のユーザーCPUが必要です。
データベース再構築の効果
(申し訳ありません。ロケールはですde_DE
。)
# ll /var/lib/rpm/
insgesamt 447440
-rw-r--r-- 1 root root 20901888 28. Jan 20:35 Basenames
-rw-r--r-- 1 root root 28672 28. Jan 20:35 Conflictname
-rw-r--r-- 1 root root 12189696 28. Jan 20:35 Dirnames
-rw-r--r-- 1 root root 8192 27. Jan 21:40 Enhancename
-rw-r--r-- 1 root root 8192 22. Jan 22:51 Filetriggername
-rw-r--r-- 1 root root 77824 28. Jan 20:35 Group
-rw-r--r-- 1 root root 184320 28. Jan 20:35 Installtid
-rw-r--r-- 1 root root 319488 28. Jan 20:35 Name
-rw-r--r-- 1 root root 94208 28. Jan 20:35 Obsoletename
-rw-r--r-- 1 root root 409018368 28. Jan 20:35 Packages
-rw-r--r-- 1 root root 11694080 28. Jan 20:35 Providename
-rw-r--r-- 1 root root 114688 28. Jan 20:35 Recommendname
-rw-r--r-- 1 root root 1339392 28. Jan 20:35 Requirename
-rw-r--r-- 1 root root 0 26. Okt 2014 .rpm.lock
-rw-r--r-- 1 root root 634880 28. Jan 20:35 Sha1header
-rw-r--r-- 1 root root 360448 28. Jan 20:35 Sigmd5
-rw-r--r-- 1 root root 20480 27. Jan 21:40 Suggestname
-rw-r--r-- 1 root root 667648 28. Jan 20:34 Supplementname
-rw-r--r-- 1 root root 8192 20. Nov 2018 Transfiletriggername
-rw-r--r-- 1 root root 8192 31. Dez 02:06 Triggername
# rpm --rebuilddb
# ll /var/lib/rpm/
insgesamt 373392
-rw-r--r-- 1 root root 16920576 3. Feb 21:26 Basenames
-rw-r--r-- 1 root root 24576 3. Feb 21:26 Conflictname
-rw-r--r-- 1 root root 7684096 3. Feb 21:26 Dirnames
-rw-r--r-- 1 root root 8192 3. Feb 21:26 Enhancename
-rw-r--r-- 1 root root 8192 3. Feb 21:26 Filetriggername
-rw-r--r-- 1 root root 77824 3. Feb 21:26 Group
-rw-r--r-- 1 root root 139264 3. Feb 21:26 Installtid
-rw-r--r-- 1 root root 311296 3. Feb 21:26 Name
-rw-r--r-- 1 root root 77824 3. Feb 21:26 Obsoletename
-rw-r--r-- 1 root root 343470080 3. Feb 21:26 Packages
-rw-r--r-- 1 root root 10416128 3. Feb 21:26 Providename
-rw-r--r-- 1 root root 114688 3. Feb 21:26 Recommendname
-rw-r--r-- 1 root root 1204224 3. Feb 21:26 Requirename
-rw-r--r-- 1 root root 503808 3. Feb 21:26 Sha1header
-rw-r--r-- 1 root root 311296 3. Feb 21:26 Sigmd5
-rw-r--r-- 1 root root 16384 3. Feb 21:26 Suggestname
-rw-r--r-- 1 root root 647168 3. Feb 21:26 Supplementname
-rw-r--r-- 1 root root 8192 3. Feb 21:26 Transfiletriggername
-rw-r--r-- 1 root root 8192 3. Feb 21:26 Triggername
#
OpenSUSE Leap 15.5(カーネル5.14.21-150500.55.12-default、rpm-4.14.3-150300.55.1.x86_64)にアップグレードした後も、問題はまだ存在します。
> # directly after boot and login, so most likely no data cached
> time rpm -qa >/tmp/rpmlist-poweroff
real 0m58,971s
user 0m3,016s
sys 0m0,472s
> time rpm -qa 'base*'
real 0m2,644s
user 0m2,603s
sys 0m0,040s
> # when the data is in cache, it's mostly CPU-bound
だから問題はあまりにも多く(役に立たない?)I/Oのようです。
答え1
rpm -qa -vvv
私は最近、私が使用しているオペレーティングシステム(RHEL 8)のrpmがすべてのパッケージを照会するときに署名とダイジェストチェックを実行することをrpmのverboseフラグを使用して発見しました。追加して--nodigest
フラグ--nosignature
を指定すると、時間が大幅に短縮されました。
rpm -qa --nodigest --nosignature base*
私のシステムのタイミング例:
$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free
$ time rpm -qa > /dev/null
real: 0m2.944s
user: 0m1.689s
sys: 0m0.163s
$ time rpm -qa > /dev/null
real: 0m1.740s
user: 0m1.644s
sys: 0m0.079s
$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free
$ time rpm -qa --nodigest --nosignature > /dev/null
real: 0m1.319s
user: 0m0.259s
sys: 0m0.147s
$ time rpm -qa --nodigest --nosignature > /dev/null
real: 0m0.366s
user: 0m0.235s
sys: 0m0.099s
これで、システムを安全に設定(おそらくマクロを編集または上書き)してください-qa
。