线上502故障分析
某一天看见线上502突然陡增,然后就就开始了几天的故障发现之旅。
一、刚开始怀疑是不是负载均衡和后端的服务器之间的tcp连接超时,导致服务器断开了tcp连接。
后通过tcpdump抓包分析取消了这个怀疑。
1 tcpdump -i eth0 host 1.1.1.1 and tcp port 80 -w /tmp/4.pca
用户明确将post请求上传到服务器了,然后服务才开始tcp fin结束tcp连接,所以服务器已经执行了该请求,但是由于某种原因执行失败了。
二、打开apache的错误日志分析一下哟
1 在apache主配置文件中 2 vim ./conf/httpd.conf 3 ErrorLog "logs/error_log"
根据这个日志毛毛球都发现不了,然后我们打开apache的coredump
2.1)首先要开启核心转储
1)查看core文件是否打开: ulimit -c # 如果为 0 表示coredump开关处于关闭状态 2)打开core文件生成: ulimit -c 1024 # 1024个blocks,一般1block=512bytes ulimit -c unlimited # 取消大小限制 3)检查core文件的选项是否打开: ulimit -a # 显示当前所有limit信息 永久更改这种操作不适合老夫,所以我就不写了。
2.2)core文件的存储位置和文件名:
1、临时修改 1)core文件保存在/var/apache_dump目录下 echo "/var/apache_dump/%e.core.%s.%p.%h.%t" > /proc/sys/kernel/core_pattern 2)生成的core文件名将会变成core.pid echo 1 > /proc/sys/kernel/core_uses_pid 2、永久修改 1)在配置最后增加2行 cat /etc/sysctl.conf kernel.core_pattern = /var/apache_dump/%e.core.%s.%p.%h.%t kernel.core_uses_pid = 1 2)永久生效 sysctl -p
2.3)创建core文件存储位置并且为授权,修改apache
mkdir -p /var/apache_dump chow www.www /var/apache_dump 在apache主配置文件中,最底下一行新增 vim conf/httpd.conf CoreDumpDirectory /var/apache_dump
2.4)重启生效,切记一定要先stop,然后在start,否则不生效,具体为啥不生效,研究一下?
2.5)此时的apapche的错误日志就变成了如下(文件名跟我上面不一样不要介意,过了几天才写的博客):
三、接下来就开始分析coredump文件
这个文件也是异常的傻逼,需要安装gdb,debug-info等等,可以自己研究一下,这个httpd一定要注意,要不然都是坑。
gdb /httpd/bin/httpd httpd.core.7.12107.hostname.1583911530
看见这个时候整个人都蒙了,这他妈毛毛球都看不出来啊,然后去研究了一下gdb的用法,发现有个叫bt full的命令,详细展示。
然后往下翻,慢慢找,太多了,找了一会找到了代码相关的信息,然后线上测试一下,确认问题,问题解决,舒服了。
参考的各位大佬:
https://blog.51cto.com/7938217/1671716 https://cwiki.apache.org/confluence/display/HTTPD/CoreDump https://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html https://www.cnblogs.com/chenpingzhao/archive/2016/06/06/5563605.html https://www.cnblogs.com/Robotke1/archive/2013/04/23/3039108.html https://blog.csdn.net/lcli2009/article/details/84027059 https://httpd.apache.org/dev/debugging.html https://blog.csdn.net/f_srion/article/details/69967781 https://bugs.php.net/bug.php?id=73588&thanks=6 https://bugs.php.net/bugs-generating-backtrace.php