为什么“apt-get .update”会显著增加内存使用量?

为什么“apt-get .update”会显著增加内存使用量?

我的理解是 apt-get更新仅更新软件包列表,并不安装新的软件版本。

但是如果我运行 apt-get update,它会比以前多吃近 200 MB 的内存。可用内存从 1.1G 下降到 930M。

运行“apt-get update”的终端输出如下

Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]Ign http://httpredir.debian.org jessie InRelease                                      
Get:2 http://httpredir.debian.org jessie-updates InRelease [145 kB]
Get:3 http://security.debian.org jessie/updates/main Sources [207 kB]         

Get:4 http://httpredir.debian.org jessie Release.gpg [2373 B]                          

Get:5 http://httpredir.debian.org jessie Release [148 kB]                                   

Get:6 http://security.debian.org jessie/updates/main armhf Packages [424 kB]                       
Get:7 http://httpredir.debian.org jessie-updates/main Sources [17.2 kB]                                     
Get:8 http://security.debian.org jessie/updates/main Translation-en [232 kB]                                                 
Get:9 http://httpredir.debian.org jessie-updates/main Translation-en [14.9 kB]           
Get:10 http://httpredir.debian.org jessie/main Sources [7054 kB]                                                            

Get:11 http://httpredir.debian.org jessie/main armhf Packages [6645 kB]         
Get:12 http://httpredir.debian.org jessie/main Translation-en [4582 kB]                                                      
Get:13 http://httpredir.debian.org jessie-updates/main armhf Packages [20.1 kB]                                              
Fetched 19.6 MB in 48s (403 kB/s)                                                                                            

Reading package lists... Done

答案1

apt 的内存使用情况什么它正在做,并且如何它正在做这项工作。

(在较旧的系统apt updateapt-get update) 下载的不仅仅是可用软件包的列表,而是软件包、版本、描述和各种信息的完整数据库。它从每个存储库下载此数据库。

您可以使用以下命令查看每个文件的大小ls -lh /var/lib/apt/lists

以下是 17.04 中的一个例子。在更新中下载并加载的文件,以及每次运行 apt 时重新加载的文件接近 10 MB:

-rw-r--r-- 1 root root  88K Oct 24 06:41 security.ubuntu.com_ubuntu_dists_zesty-security_InRelease
-rw-r--r-- 1 root root  15K Oct 24 04:56 security.ubuntu.com_ubuntu_dists_zesty-security_main_dep11_Components-amd64.yml.gz
-rw-r--r-- 1 root root  18K Oct 24 04:56 security.ubuntu.com_ubuntu_dists_zesty-security_main_dep11_icons-64x64.tar.gz
-rw-r--r-- 1 root root  156 Oct 24 05:02 security.ubuntu.com_ubuntu_dists_zesty-security_multiverse_dep11_Components-amd64.yml.gz
-rw-r--r-- 1 root root  27K Oct 24 04:59 security.ubuntu.com_ubuntu_dists_zesty-security_universe_dep11_Components-amd64.yml.gz
-rw-r--r-- 1 root root  41K Oct 24 04:59 security.ubuntu.com_ubuntu_dists_zesty-security_universe_dep11_icons-64x64.tar.gz
-rw-r--r-- 1 root root  88K Oct 24 06:37 us.archive.ubuntu.com_ubuntu_dists_zesty-backports_InRelease
-rw-r--r-- 1 root root 4.8K Oct 24 04:42 us.archive.ubuntu.com_ubuntu_dists_zesty-backports_universe_dep11_Components-amd64.yml.gz
-rw-r--r-- 1 root root  88K Oct 24 06:37 us.archive.ubuntu.com_ubuntu_dists_zesty-updates_InRelease
-rw-r--r-- 1 root root 1.4M Oct 24 01:55 us.archive.ubuntu.com_ubuntu_dists_zesty-updates_main_binary-amd64_Packages
-rw-r--r-- 1 root root 1.3M Oct 24 01:55 us.archive.ubuntu.com_ubuntu_dists_zesty-updates_main_binary-i386_Packages
-rw-r--r-- 1 root root  63K Oct 24 05:06 us.archive.ubuntu.com_ubuntu_dists_zesty-updates_main_dep11_Components-amd64.yml.gz
-rw-r--r-- 1 root root  32K Oct 24 05:06 us.archive.ubuntu.com_ubuntu_dists_zesty-updates_main_dep11_icons-64x64.tar.gz
-rw-r--r-- 1 root root 6.2K Oct 24 05:12 us.archive.ubuntu.com_ubuntu_dists_zesty-updates_multiverse_dep11_Components-amd64.yml.gz
-rw-r--r-- 1 root root 879K Oct 24 01:55 us.archive.ubuntu.com_ubuntu_dists_zesty-updates_universe_binary-amd64_Packages
-rw-r--r-- 1 root root 877K Oct 24 01:55 us.archive.ubuntu.com_ubuntu_dists_zesty-updates_universe_binary-i386_Packages
-rw-r--r-- 1 root root 221K Oct 24 05:09 us.archive.ubuntu.com_ubuntu_dists_zesty-updates_universe_dep11_Components-amd64.yml.gz
-rw-r--r-- 1 root root 242K Oct 24 05:09 us.archive.ubuntu.com_ubuntu_dists_zesty-updates_universe_dep11_icons-64x64.tar.gz

apt 占用 200 MB 而不是 10 MB 的原因是 apt 必须将所有这些数据库合并为一个,然后对这个庞大的数据库进行排序和过滤,才能真正计算出软件包操作。每个操作都会占用越来越多的内存。

大多数 apt 函数都是用 Python3 编写的,这使得它们易于维护,但依赖于 Python3 的垃圾收集和内存管理。Python 绝不是内存占用大户,但在合并数据库等情况下,它也节省内存。试一试:编写一组数据库,看看 Python3 合并它们需要多少内存。如果这让您感到困扰,那么请随意为 Python3 贡献更好的算法。

最后,apt(和 Python3)在完成后释放其使用的内存。如果您发现 apt 中存在内存泄漏,请提交错误报告!

相关内容