1. 现象
服务器 ip 能 ping 通,但部署的两个网站都无法访问,ssh 也连接不上,打开阿里云手机监控看了下,磁盘读 IOPS 达到了 1000 次/秒,并持续了近半个小时,IO 跑满导致无法处理其他任何请求,只能将服务器重启。
PS:DigitalOcean 全固定硬盘,比起来阿里云的普通硬盘速度实在是渣到爆。
2. 排查
查看 syslog,看系统之前的运行情况
Java
1 |
sudo more /var/log/syslog |
发现:
Java
1 2 3 |
Jan 15 22:32:30 codekk kernel: [792223.870307] Out of memory: Kill process 15506 (java) score 328 or sacrifice child Jan 15 22:32:30 codekk kernel: [792223.871278] Killed process 15506 (java) total-vm:2006712kB, anon-rss:332960kB, file-rss:0kB Jan 15 22:32:48 codekk kernel: [792242.290535] AliYunDun invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0 |
发现在 22:32 分时,系统内存不足,触发了 Linux 内核 Out Of Memory killer 的机制,根据计算选择一个得分最高的进程将其 kill,从上面可以看到,被 kill 的进程号为 15506,这个是 ElasticSearch 的进程(被 kill 时内存占用达到了 50%)。想到之前 ElasticSearch 总是莫名其妙崩溃,算是找到了原因。
至于内存不足为什么最终导致 IO 繁忙的原因尚未找到,初步估计跟 ElasticSearch 被 kill 后,其他几个占内存较大程序相继被 kill,如 nodejs、mysqld、memcached、mongodb,内存缓存、数据库相继失效等有关。
3. 更多排查
运行 top,M 之后,ElasticSearch 和 node 分别占据内存占用排行榜前二。
Java
1 2 3 4 5 6 7 8 9 10 11 |
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9421 codekk 20 0 2000416 270664 5768 S 0.0 26.6 0:48.53 java 1524 codekk 20 0 1138920 164076 3480 S 0.0 16.1 2:49.59 nodejs 849 mysql 20 0 760472 82652 1100 S 0.3 8.1 3:09.70 mysqld 13367 codekk 20 0 1014872 68496 0 S 0.0 6.7 0:00.94 nodejs 973 memcache 20 0 389816 65756 0 S 0.0 6.5 0:45.35 memcached 788 mongodb 20 0 593720 58284 4636 S 0.0 5.7 6:27.31 mongod 8021 trinea 20 0 261200 54720 27444 S 3.7 5.4 1:21.41 php5-fpm 9086 trinea 20 0 238700 41664 26500 S 0.0 4.1 1:08.17 php5-fpm 9085 trinea 20 0 239860 39672 25080 S 0.0 3.9 1:09.73 php5-fpm 872 root 20 0 237760 9528 5568 S 0.0 0.9 0:06.10 php5-fpm |
使用 free -h 查看内存使用情况:
Java
1 2 3 4 |
total used free shared buffers cached Mem: 992M 907M 84M 32M 4.7M 93M -/+ buffers/cache: 809M 182M Swap: 0B 0B 0B |
可以发现程序实际使用内存 809M,可用内存 182M,而 IO Cache 为 (907-809)M。
从阿里云手机监控(内存使用率监控图)也可看出,内存使用率基本一直在 80% 左右,白天访问量较多,基本三四个小时就会有一次(ElasticSearch 进程)Full GC 造成的抖动。
ElasticSearch 负责 codeKK 后台搜索,启动参数为 -Xms256m -Xmx1g,可通过添加环境变量 ES_HEAP_SIZE=”128m”,将最低内存设置为 128m,可运行会报错,没办法加内存吧。