如何在 GCP e2-micro 上运行 DNF 而不出现 OOM

如何在 GCP e2-micro 上运行 DNF 而不出现 OOM

我正在尝试在 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 的交换空间不够,别费心了。

相关内容