今天早上8:30接到同事电话,说服务器内存或硬盘有问题。
简单介绍一下,这台服务器主要运行Nginx Web Upstream应用,属于DMZ非军事区,放有面向全球客人的主站切入点。我们结合第三方监控网站存活,当前未收到任何页面挂的消息可确认没有影响到网站的正常运营。
一、Zabbix运行数据
1. CPU忙碌,从北京时间凌晨4点开始,直到9点恢复正常。
2. Cached缓存低,从北京时间凌晨4点开始,直到9点恢复正常。
3. Swap用尽,从北京时间凌晨3点开始,直到9点恢复正常。
二、处理过程
当前访问情况,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点,喝早茶走起~