我在 Debian 9 上使用 VestaCP。
昨天我收到了 3 封与 cron 相关的电子邮件警报。所有三封都包含相同的错误消息:/bin/sh: execle: Cannot allocate memory
。
因此,我从以下free --mega
命令开始:
total used free shared buff/cache available
Mem: 5969 5078 366 210 525 452
Swap: 0 0 0
显然存在 RAM 问题,因为我的可用内存只有 366 Mb。
为了了解更多信息,我使用以下命令ps -A --sort -rss -o comm,pmem,rss | head -n 20
列出使用 RAM 的进程:
fail2ban-server 35.2 2101952
systemd-journal 22.9 1370060
clamd 16.9 1014312
mysqld 2.8 169508
spamd child 1.5 95288
spamd 1.3 83448
spamd child 1.3 83048
apache2 0.6 41752
apache2 0.6 41444
apache2 0.6 40308
apache2 0.6 40276
apache2 0.6 40156
apache2 0.6 39860
apache2 0.6 39624
apache2 0.6 38696
apache2 0.6 37840
apache2 0.5 32160
apache2 0.3 17912
named 0.2 16016
所以我理解正确,似乎前 3 个进程使用了 75% 的 RAM!
我想听听你对如何优化这一点的意见:
1)这些结果正常吗?
2) 有办法解决此问题吗?也许通过清除缓存?
3)我听说过 ulimit 命令,但是它真的有效吗?如果我为 fail2ban 和 clamav 配置 ulimit 256,这是否会导致这些进程失效?
我做了很多研究,但要么与我的问题无关,要么主题是 2010 年至 2012 年的,因此在 2020 年可能不正确。
编辑1:我不知道要检查 fail2ban 和 clamav 什么,但对于 journal,我想象配置文件位于 /etc/systemd/journald.conf。这是我的:
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
是否应该对此进行一些改变以限制 RAM 的使用?
编辑2:结果如下cat /proc/sys/vm/swappiness
:60
答案1
对我来说,内核无法分配内存,因为没有交换。您的交换量为 60,因此当 RAM 的使用率为 60% 时,内核可能会使用交换。由于没有交换,因此无法分配。您应该使用 将您的交换量设置为 0 echo 0 > /proc/sys/vm/swappiness
,或/并添加一些交换空间。
还可以考虑将 fail2ban 更改为另一个更轻量的端口阻止程序。我在我的文档中看到过 Pyruse,但从未测试过它
答案2
我遇到了 ClamAV 和内存问题,添加 4GB 交换驱动器解决了这个问题。
dd if=/dev/zero of=/media/swap.img bs=1024 count=4M
mkswap /media/swap.img
等/fstab
/media/swap.img none swap sw 0 0
然后重新启动。