我在 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 但对于日志,我想配置文件在 /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
我遇到了 ClamAV 和内存问题,添加 4GB 交换驱动器解决了这个问题。
等/fstab
然后重启。
对我来说,内核无法分配内存,因为没有交换。您的 swapiness 是 60,因此当使用 60% 的 RAM 时内核可能会使用 swap。由于没有swap,所以分配失败。您应该使用 将 swappiness 设置为 0
echo 0 > /proc/sys/vm/swappiness
,或/并添加一些交换空间。还可以将fail2ban 更改为另一个更轻的端口阻止程序。我在我的文档中看到了 Pyruse,但从未测试过它