01/18
2016

阿里云 ECS Ubuntu 14.04 无法访问之磁盘 IO 跑满问题排查

专属福利:购买阿里云服务器(及其他阿里云产品)可以用我的阿里云大使专属推荐链接八折优惠

 

前天晚上 10 点多收到 DNSPOD 的监控报警,服务器挂了。这已经是迁移到阿里云(附阿里云大使专属八折推广链接)后的第二次了。

 

1. 现象

服务器 ip 能 ping 通,但部署的两个网站都无法访问,ssh 也连接不上,打开阿里云手机监控看了下,磁盘读 IOPS 达到了 1000 次/秒,并持续了近半个小时,IO 跑满导致无法处理其他任何请求,只能将服务器重启。
PS:DigitalOcean 全固定硬盘,比起来阿里云的普通硬盘速度实在是渣到爆。

 

2. 排查

查看 syslog,看系统之前的运行情况

 sudo more /var/log/syslog

发现:

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 分别占据内存占用排行榜前二。

  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 查看内存使用情况:

             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,可运行会报错,没办法加内存吧。

 

专属福利:购买阿里云服务器(及其他阿里云产品)可以用我的阿里云大使专属推荐链接八折优惠

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

6 thoughts on “阿里云 ECS Ubuntu 14.04 无法访问之磁盘 IO 跑满问题排查