알고 싶습니다.
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.2초밖에 걸리지 않았습니다. 그러나 "quick"은 철자가 다릅니다.
# 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
.