解决在 Armbian 中执行 apt search 非常慢的问题

背景

原本想购入一块 Raspberry Pi,奈何价格长期虚高,就在某天从女票票手里顺走了一块 PINE H64 Model B。往一张 TF 卡里灌入 Armbian 的镜像,就可以愉快地玩耍了。

Armbian 衍生自 Debian。对于 Debian 系,当你需要管理软件包时,通常会使用 apt 来完成。而要搜索软件包,则有 apt searchapt-cache search 两种方式,它们的搜索范围、结果详细度、输出的可读性都不尽相同,且通常后者是更快的。

自某个时候开始,在某些灌入 Armbian 的设备上,使用 apt search 搜索软件包变得无可容忍地慢,而 apt-cache search 却仍然保持着较高的速度。Armbian 论坛上的这个 topic 讨论了这个问题。

总地来说,这个问题与 apt 对软件包列表(存放于 /var/lib/apt/lists/ 中)的压缩有关,由于压缩被默认打开,且 lz4 压缩方式优先级较高,软件包列表被以 lz4 的方式压缩。在上述 topic 中,部分用户将压缩方式改为 gzip,解决了这个问题,因此 Armbian 已经合并了一个 Pull Request,提高了 gzip 的优先级,现在 Armbian 上的 apt 已经会默认使用 gzip 来压缩软件包列表。

然而,将压缩方式改为 gzip 显然不能解决所有用户的问题,上述 topic 中仍旧有不少用户反馈这个问题没有得到解决。实际经过测试,改回默认的优先级(优先使用 lz4 压缩)也不能解决问题。因此,最根本的解决方法就是,关闭压缩。

解决方法

1
2
3
sudo echo 'Acquire::GzipIndexes "false";' | sudo tee /etc/apt/apt.conf.d/99disable-compression
sudo rm /var/lib/apt/lists/*.gz # 如果你的压缩方式是 lz4,请对应更改
sudo apt update

或者,你也可以只使用 apt-cache search,它总是相当快的。

后记

上游问题?

这似乎是一个上游问题。Armbian 在 2018 年 6 月对 apt 增加了一条默认配置 Acquire::GzipIndexes "true";,使得软件包列表的压缩被默认打开,但 apt search 慢的问题似乎要到 2020 年才出现。Debian 则默认没有配置压缩,因而掩盖了这个问题。
在 Debian GNU/Linux 10 (buster) on Windows 10 x86_64 上测试,得到了这样的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
time apt search python
time apt-cache search python

# 未配置压缩(Debian 默认配置:不被压缩)
# apt search python 1.10s user 0.38s system 80% cpu 1.840 total
# apt-cache search python 0.34s user 0.14s system 99% cpu 0.481 total

# 开启压缩(默认优先级:被 lz4 压缩)
# apt search python 67.92s user 6.86s system 99% cpu 1:15.20 total
# apt-cache search python 0.38s user 0.18s system 99% cpu 0.568 total

# 开启压缩(Armbian 优先级:被 gzip 压缩)
# apt search python 678.15s user 6.50s system 99% cpu 11:25.26 total
# apt-cache search python 0.47s user 0.10s system 98% cpu 0.575 total

磁盘用量

不必担心关闭压缩后磁盘用量会大幅增长,事实上不会增加太多,磁盘空间并没有时间宝贵。关闭压缩后,Armbian 初始的软件源的软件包列表也仅仅占用 100M 左右的空间,确实不能明白默认开启压缩的用意。

关于 PINE H64 Model B

可以在这里下载适用于它的 Armbian 镜像。它的 TF 卡槽只有 HS 级别,并不支持 UHS。一张 4K 读写性能不太差的卡就能满足使用。
产品页PINE64 wiki 都写错了 WiFi 能力,它只能使用 2.4GHz 频段,不支持 11ac。
PINE H64 Model A 实际是一款流产的产品,由于它采用的 Allwinner(R) H6 SoC 在 PCIe 上的天坑,它的 mPCIe 插槽不再有很大的意义,没有 mPCIe 插槽的 Model B 就是这么诞生的。