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


11

尝试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

不知道在哪里检查。

我正在使用DigitalOcean具有512MB RAM的VPS,月费为5美元。

Answers:


8

此问题是服务器在计算机上似乎只有490MB的RAM,而您使用的是421MB。仅剩68MB可用空间;没有足够的内存供任何系统使用。

查看来自的输出,top表明MySQL(aka:)mysqld是罪魁祸首。

如果这是暂时的情况,那么您可以做的最好的事情就是像这样简单地停止MySQL:

sudo service mysqld stop

然后在MySQL停止的情况下,可以yum install按预期运行。

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

另外,由于您正在运行Apache,因此您可以降低Apache(aka 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以使其具有比默认值/罐头值更合理的设置,可以释放服务器上的资源,并使所有内容运行起来更加流畅。


17

您可以创建交换文件:

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

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

swapoff -a
rm -f /swapfile

有关详细信息,请参见Arch Wiki


1
好主意。除了丢失一些磁盘空间外,还有什么理由要关闭交换?
raider33

取决于交换设置,系统可以在大约50%的内存负载上开始使用它。假设您的系统有512MB,但大多数情况下使用的是〜400MB,则无需交换就可以正常工作,但是,这样做会减慢来回交换150MB的速度。但是我可能错了。
pbogut

不要忘记使用sudo命令
Raptor

1
fallocate可能会作弊并且无法使用...使用sudo dd if=/dev/zero of=/swapfile count=512 bs=1MiB
Ray Foss
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.