我正在尝试消除似乎正在影响mysqld
服务的内存不足问题。该服务完全随机终止 - 有时每周一次,有时每两天一次。
我的 VPS 有 6GB 的 RAM 并且没有交换文件(我的提供商不允许/支持交换)。我的应用程序是PHP
基于 - 的(Symfony
框架)并在Apache 2.2
.
今天晚上,我观察到 RAM 使用量激增。遗憾的是,我无法捕获 的准确输出free -m
,但我记得-/+ buffers/cache
for columnfree
大约为 1G。RAM 使用量从 4.8G 上升到 5.2G。
在维护窗口期间,我关闭了httpd
和mysqld
,mongod
之后我得到了以下free -m
输出:
[root@XXXYYYZZZ ~]# free -m
total used free shared buffers cached
Mem: 6144 4916 1227 0 0 1207
-/+ buffers/cache: 3709 2434
Swap: 0 0 0
3709M
我的问题是那些用过的内存是怎么回事?该top
命令没有透露太多:
top - 19:54:58 up 3 days, 6:35, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 21 total, 1 running, 20 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 6291456k total, 5034692k used, 1256764k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 1236060k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19236 1180 932 S 0.0 0.0 0:00.02 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd/23992
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper/23992
140 root 16 -4 10644 520 248 S 0.0 0.0 0:00.00 udevd
482 root 20 0 179m 1252 828 S 0.0 0.0 0:00.04 rsyslogd
493 dbus 20 0 21408 616 376 S 0.0 0.0 0:00.00 dbus-daemon
510 root 20 0 66632 1232 520 S 0.0 0.0 0:00.00 sshd
517 root 20 0 22184 904 668 S 0.0 0.0 0:00.00 xinetd
870 root 20 0 66828 924 276 S 0.0 0.0 0:00.00 saslauthd
871 root 20 0 66828 680 32 S 0.0 0.0 0:00.00 saslauthd
886 root 20 0 83080 2664 840 S 0.0 0.0 0:04.99 sendmail
894 smmsp 20 0 78668 2108 648 S 0.0 0.0 0:00.03 sendmail
944 root 20 0 114m 1232 628 S 0.0 0.0 0:00.81 crond
955 root 20 0 88304 21m 1784 S 0.0 0.3 0:05.25 miniserv.pl
22840 root 20 0 96276 4448 3460 S 0.0 0.1 0:00.09 sshd
22842 root 20 0 105m 1988 1524 S 0.0 0.0 0:00.03 bash
22985 root 20 0 96300 4168 3164 S 0.0 0.1 0:00.03 sshd
22987 root 20 0 57848 2340 1624 S 0.0 0.0 0:00.04 sftp-server
23313 root 20 0 96276 4472 3460 S 0.0 0.1 0:00.68 sshd
23315 root 19 -1 105m 2024 1544 S 0.0 0.0 0:00.16 bash
25080 root 19 -1 14900 1220 992 R 0.0 0.0 0:00.00 top
我知道 Linux 在 RAM 中进行缓存,但我会说这是非常不规则的。我可能错了,事实上,我希望我错了。
在仔细阅读了drop_cache
我可以执行的调用之后,好吧,删除缓存,我决定尝试使用它,只是为了得到这个:
[root@XXXYYYZZZ ~]# sync; echo 3 > /proc/sys/vm/drop_caches
-bash: /proc/sys/vm/drop_caches: Permission denied
因此,我无法删除缓存,无法创建交换文件,并且由于 RAM 消耗而飞得离太阳非常近(并且由于mysqld
崩溃而受到了一些烧伤)。
有谁知道如何更好地调查这个?
如果我要推翻我最近非常恼火的 VPS 提供商,我需要确凿的证据证明我没有误解性能数据,或者更糟糕的是,合法进程实际上正在消耗那么多 RAM。
非常感谢!
更新
我跑了virt-what
,得到了openvz
更新 2:消息中的 OOM 条目:
/var/log/messages-20161009:Oct 2 16:43:43 XXXYYYZZZ kernel: [56050139.271683] Out of memory in UB 23992: OOM killed process 22029 (mysqld) score 0 vm:5044284kB, rss:656944kB, swap:8280kB
/var/log/messages-20161009:Oct 2 16:43:55 XXXYYYZZZ kernel: [56050150.552528] Out of memory in UB 23992: OOM killed process 30486 (mysqld) score 0 vm:310088kB, rss:214456kB, swap:0kB
/var/log/messages-20161009:Oct 5 12:56:17 XXXYYYZZZ kernel: [56295842.893210] Out of memory in UB 23992: OOM killed process 13284 (mysqld) score 0 vm:5066092kB, rss:694760kB, swap:40kB
/var/log/messages-20161023:Oct 22 17:54:09 XXXYYYZZZ kernel: [1219419.032263] Out of memory in UB 23992: OOM killed process 789 (mysqld) score 0 vm:5057832kB, rss:698980kB, swap:0kB
/var/log/messages-20161023:Oct 22 17:54:20 XXXYYYZZZ kernel: [1219428.340161] Out of memory in UB 23992: OOM killed process 21700 (mysqld) score 0 vm:310088kB, rss:271892kB, swap:0kB
/var/log/messages-20161030:Oct 29 12:14:47 XXXYYYZZZ kernel: [1804212.497098] Out of memory in UB 23992: OOM killed process 25691 (mysqld) score 0 vm:5057548kB, rss:690164kB, swap:0kB
/var/log/messages-20161030:Oct 29 12:15:06 XXXYYYZZZ kernel: [1804222.381820] Out of memory in UB 23992: OOM killed process 23659 (mysqld) score 0 vm:310088kB, rss:248376kB, swap:0kB
首先,除非您正在做一些测试,否则您永远不需要删除缓存。Linux 内核使用“空闲”内存进行缓存。如果某些东西请求内存并且它在其他地方不可用,则将从缓存内存中满足该请求。
要开始解决您的问题,您应该查看您的日志。它们应该包含来自 OOM 系统的信息,说明它为什么来玩以及它做了什么。
正如其他人所建议的那样,您似乎正在使用容器 VPS(openvz 等)。如果是这种情况,他们可能唯一真正的解决方案是迁移到使用不同虚拟化技术(例如 KVM 等)的不同 VPS。
你得到的错误
是否启用了 noclobber 的结果(man bash 并搜索 >| )。像这样试试
顺便说一句-您可以尝试从这里开始
您还可以查看slabtop 命令的输出,以了解您的内存在吃什么。并不是说它会有多大帮助,但你至少会知道它是否来自一些平板缓存。
同时安装 sysstat 包并启用 1 分钟分辨率的 sar,这样您就可以历史分析您的系统性能,而不是实时在线监控。