![如何在 GCP e2-micro 上运行 DNF 而不出现 OOM](https://linux22.com/image/783272/%E5%A6%82%E4%BD%95%E5%9C%A8%20GCP%20e2-micro%20%E4%B8%8A%E8%BF%90%E8%A1%8C%20DNF%20%E8%80%8C%E4%B8%8D%E5%87%BA%E7%8E%B0%20OOM.png)
我正在尝试在 Google Cloud Platform (GCP) 美国中部地区的 e2-micro 上运行 Fedora Cloud Base 36。我已经几个月没有升级软件包了,所以今天我尝试这样做。当我运行:
$ sudo dnf upgrade
操作系统内存不足,终止了我的命令,并终止了我的 SSH 会话。来自 journalctl 日志:
sudo[917]: jrefior : TTY=pts/0 ; PWD=/home/jrefior ; USER=root ; COMMAND=/usr/bin/dnf upgrade
sudo[917]: pam_unix(sudo:session): session opened for user root(uid=0) by jrefior(uid=1000)
systemd-oomd[613]: Killed /user.slice/user-1000.slice/session-3.scope due to memory used (955539456) / total (1007927296) and swap used (945311744) / total (1007>
systemd-oomd[613]: Killed /user.slice/user-1000.slice/session-3.scope due to memory used (956289024) / total (1007927296) and swap used (981708800) / total (1007>
systemd[1]: session-3.scope: systemd-oomd killed 6 process(es) in this unit.
systemd-logind[798]: Session 3 logged out. Waiting for processes to exit.
systemd[1]: session-3.scope: Deactivated successfully.
systemd[1]: session-3.scope: Consumed 10.737s CPU time.
systemd-logind[798]: Removed session 3.
e2-micro 具有 1 GB 内存,并且实例也是使用 1 GB 交换空间创建的:
$ free -m
total used free shared buff/cache available
Mem: 961 146 558 0 256 680
Swap: 960 27 933
Fedora Cloud Base 可以在 2 GB 内存(包括交换)上进行管理吗?GCP e2-micro 规格如下这里有没有办法升级内核和软件包而不使用那么多内存?
到时候升级 Fedora Cloud Base 我也会遇到问题吗?
答案1
不,1 GB 的 RAM 不足以管理基于 Fedora 的系统的软件包。在我看来,这包括 RHEL 和重建,但问题的严重程度取决于所涉及的存储库的大小。是的,发行版主要版本升级交易是最大的交易之一,也可能存在问题。
在包事务期间调出页面是一种糟糕的体验。速度很慢。即使交换也可能在危险的地方发生 oom 终止。我称交换空间为 1 GB 是不公平的,但内存系统的行为与 2 GB DRAM 不同。
有关此事件的最新报告,请参阅邮件列表主题dnf makecache 内存使用量增加和 Bugzilla “dnf update” 在 RAM 为 1G 或更少的无交换机器上会耗尽内存。请注意,整个 dnf 元数据正在转换为内存中的某个 libsolv 数据库,除此之外,它还会解析这些依赖项。
如果您将实例移至基于映像的更新,则可以在更大的盒子上一次性完成。升级主副本,从中创建磁盘映像,然后从更新的实例启动新实例。这可能是您更新方式的重大变化。另请参阅:rpm-ostree。
评论者指出,文件列表会扩大元数据的大小。尤其是考虑到 Fedora 中的软件包数量、更新频率以及仍具有旧文件依赖关系的软件包数量。请考虑维护您使用的软件包子集的自定义存储库。
microdnf是没有 Python 的包管理器。虽然切换可能会节省一些内存,但它的作者还没有详细说明它的局限性。可能要等一下,Fedora 不可避免地会再次更改包管理器反正。
答案2
您可以创建一个交换文件并在运行 dnf 更新时使用它。
$ sudo dd if=/dev/zero of=/swapfile count=1024 bs=1MiB
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo dnf update
更新完成后,您可以通过运行以下命令关闭交换:
$ sudo swapoff
长期使用交换文件时,会出现虚假的实例稳定性问题,但这些问题主要通过使用 zram 来解决。不幸的是,即使启用了 384MB 的 zram,更新也会因 oom 而终止,否则系统是稳定的,并且已经运行了 LAMP 堆栈一年多。
答案3
使用 zram 代替的替代方法/swapfile
$ sudo modprobe zram
$ sudo zramctl --find --size 1G
/dev/zram0
$ sudo mkswap /dev/zram0
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=74398e08-23fc-4485-a48b-c555ba926b5a
$ sudo swapon /dev/zram0
$ swapon -s
Filename Type Size Used Priority
/dev/zram0 partition 1048572 0 -2
答案4
给出具体数字:使用 768MB RAM 中的 400MB 和 1.5GB 交换空间,dnf 几个月都没有问题。它会很慢,但可以考虑使用 dnf-automatic 进行自动升级。
1GB 的交换空间不够,别费心了。