今天早上8:30接到同事电话,说服务器内存或硬盘有问题。


简单介绍一下,这台服务器主要运行Nginx Web Upstream应用,属于DMZ非军事区,放有面向全球客人的主站切入点。我们结合第三方监控网站存活,当前未收到任何页面挂的消息可确认没有影响到网站的正常运营。


一、Zabbix运行数据

1. CPU忙碌,从北京时间凌晨4点开始,直到9点恢复正常。

Nginx Cannot allocate memory_Nginx Cannot allocat


2. Cached缓存低,从北京时间凌晨4点开始,直到9点恢复正常。

Nginx Cannot allocate memory_Nginx Cannot allocat_02


3. Swap用尽,从北京时间凌晨3点开始,直到9点恢复正常。

Nginx Cannot allocate memory_Nginx Cannot allocat_03


二、处理过程

当前访问情况,41条500状态码。但有1148条Nginx定义的499状态码,对应的是"client has closed connection",意思是服务端处理时间过长,客户端会由于请求时间过长而放弃该请求。

[root@gw4 ~]$ tail -100000 pwww.com.log |awk '{print $9}'|sort |uniq -c |sort -nr
  84035 200
   6288 304
   5466 "-"
   2140 301
   1148 499
    457 302
    376 404
     41 500
     24 206
     14 408
      8 403
      3 400

当前连接情况,现处于白天低峰期,连接数不高。

[root@gw4 ~]$ netstat -ntal |awk '{print $6}'|sort |uniq -c |sort -nr
   8806 ESTABLISHED
   2291 TIME_WAIT
    272 FIN_WAIT2
     78 CLOSE_WAIT
     75 FIN_WAIT1
     67 LAST_ACK
     45 SYN_RECV
     36 LISTEN
      9 CLOSING
      5 SYN_SENT
      1 Foreign
      1 established)

当前CPU使用情况,b表示阻塞,当前被动等待某个事件。

[root@gw4 ~]# vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 8 15 1052248  25544   4160  27336    0    0    22   212    0    0 11  2 83  4  0
 0 15 1052248  28092   4564  30036    0    0  1546   876 6975 4823 10  2  4 84  0
 1 15 1052248  27480   4840  31440    0    0   806   604 5838 4515  9  1  0 90  0
 0 16 1052248  24288   5196  33944   16    0  1030   874 6876 4969  9  1  0 89  0
 1 20 1052248  22480   5380  35084    0    0  1256   726 5633 4358  5  5  1 89  0

当前内存使用情况,free+buffers+cached内存几乎用尽,内存不够把Swap用尽,又或者内存泄漏。

[root@gw4 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          3940       3918         22          0          5         39
-/+ buffers/cache:       3873         66
Swap:         1027       1027          0

我们来分析下,哪个进程占用了大量内存,且做了哪些操作。

[root@gw4 ~]$ ps -aux|sort -k5nr|awk 'BEGIN{print "PID VSZ"}{print $2,$5}'|awk 'NR<3'
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
PID VSZ
1377 7463216
[root@gw4 ~]# strace -p 1377
Process 1377 attached - interrupt to quit
epoll_wait(60, {}, 512, 393)            = 0
unlink("/data/cache/pwww/8/e3/d83fba0c22484996cf2d8c5ce8208e38") = 0
unlink("/data/cache/pwww/e/5c/d13aac1c739783c893d0e7dd0b78e5ce") = 0
unlink("/data/cache/pwww/f/5f/a22f8805790c5a58b803a140a35e75ff") = 0
unlink("/data/cache/pwww/7/1c/a9b465270959ba83b0b63756340d31c7") = 0
epoll_wait(60, {}, 512, 1000)           = 0
epoll_wait(60, {}, 512, 1)              = 0
unlink("/data/cache/pwww/4/e6/3524f7b795011be8f02e2ace26879e64") = 0
unlink("/data/cache/pwww/3/89/9e86f67cd29b1afb4e80a7f68903f893") = 0
epoll_wait(60, {}, 512, 1000)           = 0

当前Nginx开启了8个工作进程,其中1377 Nginx进程异常强抢了3G内存,导致Nginx检测出现Cannot allocate memory。

[root@gw4 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: [alert] mmap(MAP_ANON|MAP_SHARED, 268435456) failed (12: Cannot allocate memory)
nginx: configuration file /etc/nginx/nginx.conf test failed

如何解决,将Nginx异常进程kill掉,执行检测。

[root@gw4 ~]# kill -9 1377
[root@gw4 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

当前内存使用恢复正常。

[root@gw4 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          3940        991       2948          0         22        219
-/+ buffers/cache:        749       3190
Swap:         1027        247        780


接着给同事回个电话,Nginx一个进程导致内存用尽,异常问题暂时解决,待会分析具体原因。

当前时间正好9点,喝早茶走起~