清除OOM和连续的mysqld崩溃

我试图摆脱内存不足的问题,似乎是打mysqld服务。 该服务完全随机死亡 – 有时每周一次,有时每两天死一次。

我的VPS有6GB的RAM,没有交换文件(我的提供商不允许/支持交换)。 我的应用程序是基于PHP的( Symfony框架),并在Apache 2.2上运行。

今天晚上,我观察到内存使用率高峰。 令人遗憾的是,我无法捕获一个free -m的确切输出,但我记得-/+ buffers/cache free列的-/+ buffers/cache大约1G。 内存使用量从4.8G上升到了5.2G。

在维护窗口期间,我closures了httpdmysqldmongod ,之后我有了下面的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中执行caching,但是我认为这很不规律。 我可能是错的,事实上,我希望我是。

仔细阅读我可以执行的drop_cache调用,然后放下caching,我决定尝试去做,只是为了得到这个:

 [root@XXXYYYZZZ ~]# sync; echo 3 > /proc/sys/vm/drop_caches -bash: /proc/sys/vm/drop_caches: Permission denied 

所以,我无法删除caching,也无法创build交换文件,而且我正在使用内存消耗非常接近太阳(由于mysqld崩溃,我已经获得了一些灼伤)。

有谁知道如何更好地调查这个?

如果我打算推倒我的VPS供应商,最近我对此感到非常恼火,我需要坚实的证据certificate我不会误解性能数据,或者更糟的是,合法的stream程实际上消耗了大量的RAM。

非常感谢!

更新

我运行了virt-what并得到了openvz

Update2:来自消息的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 

首先,除非你正在做一些testing,否则不应该放弃caching。 Linux内核为caching使用“空闲”内存。 如果有东西请求内存,并且在别处不可用,则请求将从高速caching内存中满足。

要开始解决你的问题,你应该看看你的日志。 他们应该包含来自OOM系统的信息,说明为什么它不能玩,以及它做了什么。

正如其他人所说,似乎你可能正在使用容器VPS(openvz等)。 如果是这样的话,那么你唯一真正的解决scheme就是转向使用不同虚拟化技术的不同VPS,例如KVM等。

错误,你有

 [root@XXXYYYZZZ ~]# sync; echo 3 > /proc/sys/vm/drop_caches -bash: /proc/sys/vm/drop_caches: Permission denied 

是启用noclobber的结果(man bash和search> |)。 像这样尝试

 sync; echo 3 >| /proc/sys/vm/drop_caches 

顺便说一句 – 你可以尝试从这个开始

 sync; echo 2 >| /proc/sys/vm/drop_caches 

你也可以看到slabtop命令的输出,看看你的内存在吃什么。 不是说它会有很大的帮助,但是你至less会知道它是否来自某个板块caching。
同时安装sysstat软件包并以1分钟的分辨率启用sar,这样您就可以历史地分析您的系统性能,而不是实时在线监控。