CentOS 7 在“yum install”操作期间无法分配内存

CentOS 7 在“yum install”操作期间无法分配内存

尝试一下yum install php56w-mcrypt,系统却给了我这个错误

libmcrypt-2.5.8-13.el7.x86_64: [Errno 5] [Errno 12] Cannot allocate memory
php56w-mcrypt-5.6.5-1.w7.x86_64: [Errno 5] [Errno 12] Cannot allocate memory

我检查了一下free -m

             total       used       free     shared    buffers     cached
Mem:           490        421         68          8          3         42
-/+ buffers/cache:        376        113
Swap:            0          0          0

top

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 9756 mysql     20   0  727588  81556      0 S  0.3 16.2   1:04.61 mysqld
11089 root      20   0       0      0      0 S  0.3  0.0   0:16.25 kworker/0:2
    1 root      20   0  129396   2020    576 S  0.0  0.4   0:05.88 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0       0      0      0 S  0.0  0.0   0:00.16 ksoftirqd/0
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
    7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
    8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/0
   10 root      20   0       0      0      0 S  0.0  0.0   0:01.82 rcu_sched
   11 root      20   0       0      0      0 R  0.0  0.0   0:02.10 rcuos/0
   12 root      rt   0       0      0      0 S  0.0  0.0   0:00.91 watchdog/0
   13 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 khelper
   14 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs
   15 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns
   16 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 writeback
   17 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kintegrityd

不确定还要检查哪里。

我正在使用DigitalOceanRAM 为 512MB 的 VPS,每月 5 美元的套餐。

答案1

问题是服务器似乎只有 490MB 的 RAM,而您使用了 421MB。只剩下 68MB 可用;对于任何系统来说,这都不是很多内存。

查看输出top表明 MySQL(又名mysqld:)是罪魁祸首。

如果这只是暂时的情况,那么最好的办法就是停止 MySQL,如下所示:

sudo service mysqld stop

然后,在 MySQL 停止后,您就可以yum install按预期运行。

但另一种解决方案是使用类似脚本“MySQL 调优入门”帮助评估服务器上的 MySQL 使用情况和配置并进行相应调整。原因是开箱即用的普通 MySQL 会占用大量内存。但“MySQL Tuning Primer”将帮助评估您的安装并让您知道可以调整哪些内容。包括降低内存要求,以便设置可以满足您有限的资源。唯一的问题是 MySQL 需要连续运行至少 48 小时,才能使“MySQL Tuning Primer”结果具有价值。除此之外,使用此脚本对 MySQL 进行性能调整是微调 LAMP 设置的好方法。

此外,由于您正在运行 Apache,因此您可能可以降低 Apache(又名httpd)的 RAM 要求,从而释放更多 RAM。这是针对 Apache 基本开发环境的一组相当通用的调整,但应该对您有所帮助。首先通过您最喜欢的命令行编辑器打开您的 Apache 配置,如下所示;我更喜欢nano但任何文本编辑器都可以:

sudo nano /etc/httpd/conf/httpd.conf 

现在找到 a 所说的行Timeout并将其更改为“120”;两分钟是一个合理的超时窗口:

Timeout 120

同样地,找到MaxKeepAliveRequests并将其更改为“24”;“保持活动”连接很好,但不要让它们压垮你的设置:

MaxKeepAliveRequests 24

找到KeepAliveTimeout并将其设置为“2”;这应该与您网站上一个页面的加载速度相关,2 秒是一个很好的平均值:

KeepAliveTimeout 2

现在查找 XML 配置指令设置为<IfModule mpm_prefork_module>

<IfModule mpm_prefork_module>
  StartServers           8
  MinSpareServers       16
  MaxSpareServers       32
  ServerLimit           40
  MaxClients            40
  MaxRequestsPerChild 2000
</IfModule>

关键在于 和ServerLimitMaxClients默认情况下,Apache 的设置相当高;MaxClients我相信是 255。但实际情况是,即使是高流量网站每秒也只能获得 70-80 个连接……然后就死掉了……这意味着 Apache 连接是无状态的,因此基准是每秒连接数。因此,对于开发或小规模服务器,“40”是一个不错的数字。

现在完成了这些关键的调整,请像这样重新启动 Apache:

sudo service httpd restart

通过调整 MySQL 和 Apache 以获得比默认/预定值更合理的设置可以释放服务器上的资源并使一切运行得更顺畅。

答案2

您可以创建交换文件:

fallocate -l 512M /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

这将创建交换文件,您将能够安装应用程序。要删除交换文件:

swapoff -a
rm -f /swapfile

Arch 维基了解详情。

答案3

在 CentOS7 上运行 yum 更新时遇到了类似的问题,重新启动服务器即可解决问题。我猜想它清除了内存以安装补丁/新软件包。

答案4

如果您的服务器已经运行了很长时间,系统重启通常会释放您的内存。

reboot

话虽如此,这可能只是一个临时解决方案!执行此操作后,您应该找出内存问题的实际原因,以防止再次发生。您可以使用此解决方案作为快速临时修复,让您的服务器再次运行,同时进一步调查内存问题。

第一个好的起点就是检查您的日志。

sudo grep -i -r 'out of memory' /var/log/

相关内容