tcpdump 和 wireshark组合拳,揪出有问题的机器-阿里云开发者社区

开发者社区> exinnet> 正文

tcpdump 和 wireshark组合拳,揪出有问题的机器

简介:
+关注继续查看
现象

mysqlnd的超时时间设置为2s后,出现了一个诡异的现象。在php的error log中出现了一些错误信息。如下:


[20-Dec-2014 21:20:17] WARNING: [pool www] child 31401 said into stderr: "NOTICE: PHP message: PHP Warning: PDO::__construct(): MySQL server has gone away in ./abstract.class.php on line 26" 

第26行代码如下:


<?php
$this->resource = new PDO(
                $this->type.':'.implode(';', $dsn).';charset=gbk',
                $this->dbconf['username'],
                $this->dbconf['password'],
                $this->dbconf['driver_options']
                );  
            $this->resource->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>

猜测

看来是因为创建pdo对象时出错的。创建pdo对象时会建立数据库连接,估计在建立数据库连接时超时导致报gone away错误。

验证

tcpdump抓包

首先,还原现场。把线上的一台机器重新把mysqlnd的超时设置为2s。然后,通过tcpdump命令抓包。命令行如下:


#tcpdump -i eth0 -s 3000 port 3306 -w ~/sql.pcap

同时,通过tail -f 命令实时查看php error log 的信息。一旦发现上面的gone away的错误信息,就可以停止tcpdump抓包了。记录下错误日志中出错时的时间点。例如出错的时间点为 2014-12-20 13:21:24。

wireshark分析包

简单的包分析使用tcpdump还行,但是复杂的数据包分析还是wireshark专业。

首先,根据过滤条件,找到所有创建数据库连接的数据包。

用wireshark打开sql.pcap文件后,使用显示过滤器过滤数据包。过滤条件为 “tcp contains password”。如图:
wireshark_mysql_connect1

&lt;img src="http://www.bo56.com/wp-content/uploads/2015/01/wireshark_mysql_connect1.jpg" alt="wireshark_mysql_connect1" width="865" height="133" class="alignnone size-full wp-image-699" /&gt;&lt;/a&gt;&lt;/p&gt;

为什么要以 password去过滤数据包呢?因为创建数据库连接的时候,会向服务器端发送一个数据包,数据包中包含password关键字。有兴趣的话,大家可以使用tcpdump看下创建数据库连接时数据包内容。


其次,根据错误时间缩小范围

根据过滤条件过滤后,你会发现创建数据库连接的数据包很多。这个时候,我们可以根据出现错误的时间大概定位需要排查的数据包的范围。我们记录了出错的时间为2014-12-20 13:21:24,mysqlnd的超时时间设置的为2s,那么有问题的数据包可能就再 2014-12-20 13:21:22。这一秒的数据包就少很多了。

最后,使用wireshark的Follow TCP Stream验证创建连接的数据包。

在需要分析的数据行上点击右键,然后选择 “Follow TCP Stream”。wireshark Follow TCP Stream 功能介绍。然后你会看到如下弹窗。
wireshark_tcp_follow_mysql

上图中的数据包是有问题的。因为上面只有向服务器发送的数据包内容,而没有服务器返回的数据包内容。正常的数据交互如下图:
wireshark_mysql_reps

&lt;img src="http://www.bo56.com/wp-content/uploads/2015/01/wireshark_tcp_follow_mysql.jpg" alt="wireshark_tcp_follow_mysql" width="784" height="190" class="alignnone size-full wp-image-700" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;img src="http://www.bo56.com/wp-content/uploads/2015/01/wireshark_mysql_reps.jpg" alt="wireshark_mysql_reps" width="685" height="148" class="alignnone size-full wp-image-701" /&gt;&lt;/a&gt;&lt;/p&gt;

多次分析,都是192.168.1.2服务器没有正常返回数据。由此可以判断,是192.168.1.2服务器的问题。跟业务方沟通后,让其下线192.168.1.2服务器。持续观察,没再发现gone away的问题。由此最终确定,的确是192.168.1.2服务器的问题。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
记一次典型的TCP传输吞吐效率问题
客户在ECS上实现了一个供小图片上传的接口,通过高防->SLB->ECS的网络链路将接口发布给终端用户,但是发现上传的速率很不理想。初看起来像是高防问题,但是通过排查最终发现这是一个典型的TCP传输吞吐量问题,并且是由于后端服务器端的配置而引起,在此记录下排查过程和相关原理。
363 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4617 0
TCP的backlog导致的HBase超时问题排查
TCP的backlog导致的超时问题排查
2474 0
就是要你懂 TCP-- 最经典的TCP性能问题
# 就是要你懂 TCP-- 最经典的TCP性能问题 ### 问题描述 某个PHP服务通过Nginx将后面的tair封装了一下,让其他应用可以通过http协议访问Nginx来get、set 操作tair 上线后测试一切正常,每次操作几毫秒,但是有一次有个应用的value是300K,这个时候set一次需要300毫秒以上。 在没有任何并发压力单线程单次操作也需要这么久,这个延迟是没有道
3290 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
10784 0
TCP TIME_WAIT状态解析及问题解决
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaobryant/article/details/80557158 一、TCP四次挥手过程 TCP在建立连接时需要握手,同理,在关闭连接的时候也需要握手。
2001 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3664 0
+关注
exinnet
淘宝技术专家
91
文章
70
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载