$ sudo yum update
を実行したところ [Errno 5] [Errno 12] メモリを確保できません
のエラーメッセージが表示されてアップロードできない現象の解消方法を説明します。
なお英語表示の場合は
[Errno 5] [Errno 12] Cannot allocate memory
となります。内容は同じで、とにかくメモリを確保しようとしたところ領域不足などの理由で確保できなかったという意味です。
エラーメッセージの一例を示します。一部抜粋。
Error downloading packages:
php-xml-8.1.20-1.el7.remi.x86_64: [Errno 5] [Errno 12] メモリを確保できません
1:nginx-1.20.1-10.el7.x86_64: [Errno 5] [Errno 12] メモリを確保できません
sudo-1.8.23-10.el7_9.3.x86_64: [Errno 5] [Errno 12] メモリを確保できません
kernel-tools-libs-3.10.0-1160.90.1.el7.x86_64: [Errno 5] [Errno 12] メモリを確保できません
kpartx-0.4.9-136.el7_9.x86_64: [Errno 5] [Errno 12] メモリを確保できません
php-mysqlnd-8.1.20-1.el7.remi.x86_64: [Errno 5] [Errno 12] メモリを確保できません
MariaDB-devel-10.6.14-1.el7.centos.x86_64: [Errno 5] [Errno 12] メモリを確保できません
1:grub2-pc-modules-2.02-0.87.0.2.el7.centos.11.noarch: [Errno 5] [Errno 12] メモリを確保できません
nss-softokn-3.79.0-4.el7_9.x86_64: [Errno 5] [Errno 12] メモリを確保できません
このような感じでメモリが確保できないので、更新対象すべてのパッケージがことごとくアップデートエラーとなります。
現状把握(調査)
では、メモリ状態の概況からチェックしてみましょう。
free コマンドを実行します。
$ sudo free -mh
total used free shared buff/cache available
Mem: 481M 251M 90M 33M 138M 183M
Swap: 0B 0B 0B
このサーバは 481MB のメモリを積んでいて、そのうち 251MB が使用中、残容量は 90MB ということがわかりました。これは貧弱!厳しい環境です。
次にプロセス単位に使用中サイズを確認します。
$ sudo top
を実行し、メモリ順にソートするために shift+m のキーを押します
すると下のように、上からメモリ消費が大きい順で実行中プロセスが表示されました。
top - 02:15:10 up 488 days, 14:27, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 97 total, 3 running, 94 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 492788 total, 92164 free, 257900 used, 142724 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 187268 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
885 root 20 0 197352 97104 636 S 0.0 19.7 14:47.54 dhclient
983 mysql 20 0 1146732 63960 44 S 0.0 13.0 107:52.39 mariadbd
956 root 20 0 574280 11812 524 S 0.0 2.4 67:56.99 tuned
19951 root 20 0 344752 6232 296 R 0.0 1.3 33:37.39 php-fpm
19953 nginx 20 0 344752 6112 176 S 0.0 1.2 0:00.00 php-fpm
19954 nginx 20 0 344752 6112 176 S 0.0 1.2 0:00.00 php-fpm
19955 nginx 20 0 344752 6112 176 S 0.0 1.2 0:00.00 php-fpm
19956 nginx 20 0 344752 6112 176 S 0.0 1.2 0:00.00 php-fpm
19957 nginx 20 0 344752 6112 176 S 0.0 1.2 0:00.00 php-fpm
15595 nginx 20 0 50604 4804 2808 S 0.3 1.0 3:30.31 nginx
25502 root 20 0 241464 4700 3540 S 0.0 1.0 0:00.00 sudo
25416 postfix 20 0 90548 4192 3104 S 0.0 0.9 0:00.00 pickup
537 polkitd 20 0 612356 4132 568 S 0.0 0.8 3:04.35 polkitd
1 root 20 0 191020 2844 1416 S 0.0 0.6 19:08.58 systemd
1157 root 20 0 240976 2784 1156 S 0.0 0.6 36:14.01 rsyslogd
809 root 20 0 102988 2608 544 S 0.0 0.5 0:21.30 dhclient
25503 root 20 0 162100 2272 1564 R 0.3 0.5 0:00.01 top
24880 centos 20 0 156844 1724 364 S 0.0 0.3 0:00.01 sshd
24878 root 20 0 156844 1588 244 S 0.0 0.3 0:00.01 sshd
389 root 20 0 34964 1520 1212 S 0.0 0.3 10:00.53 systemd-journal
1123 postfix 20 0 90724 1448 272 S 0.0 0.3 2:01.33 qmgr
24881 centos 20 0 115820 1432 920 S 0.0 0.3 0:00.02 bash
28813 root 20 0 13012 1364 84 S 0.0 0.3 0:11.31 config
1116 root 20 0 90444 1308 184 S 0.0 0.3 1:30.99 master
1164 root 20 0 112984 1276 244 S 0.0 0.3 0:00.07 sshd
15593 root 20 0 50396 1224 0 S 0.0 0.2 0:00.00 nginx
541 dbus 20 0 58088 1168 640 S 0.0 0.2 16:23.49 dbus-daemon
534 root 20 0 26468 1124 788 S 0.0 0.2 5:12.42 systemd-logind
1173 root 20 0 126388 968 340 S 0.0 0.2 0:44.92 crond
430 root 20 0 45608 960 208 S 0.0 0.2 0:00.05 systemd-udevd
対処
調査の結果、このサーバの場合、上位3位までを見ると
dhclient, mariadbd, php-fpm
で多くの消費をしている事が判明したので、yum update をするために一時停止しましょう。更新を終えたら再起動すれば良いです。
$ sudo systemctl stop mariadb.service
$ sudo systemctl stop php-fpm
dhclient の停止は面倒なので、とりあえず mariadbd, php-fpm を停止したところ下のように 121MB を確保できました。
$ sudo free -mh
total used free shared buff/cache available
Mem: 481M 178M 121M 33M 180M 255M
Swap: 0B 0B 0B
解決
それでは再度、アップグレードを試みます。
$ sudo yum update
無事、完了しました。
以上です。