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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
现象

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服务器的问题。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
数据采集 机器学习/深度学习 网络协议
Linux|操作系统|应该知道的网络抓包知识(主要是wireshark,tcpdump)
Linux|操作系统|应该知道的网络抓包知识(主要是wireshark,tcpdump)
72 0
|
缓存 监控 网络协议
2022年最受工程师欢迎的10款抓包工具有哪些?不止Wireshark和Tcpdump哦!
网络嗅探器在日常工作中经常使用,通常情况下,我们叫做“抓包工具”,不管是软件开发、还是网络工程师,抓包解决一些问题已经称为最正常不过的操作。
845 0
2022年最受工程师欢迎的10款抓包工具有哪些?不止Wireshark和Tcpdump哦!
|
网络协议 Linux Windows
使用tcpdump+wireshark抓包分析网络数据包
最近和学弟在调试一个GPRS通信模块,需求是通过GPRS模块通过http协议发送数据到服务器,但是http协议一直失败,服务器返回400,通过查询http状态码得知,http400错误是请求无效,因为GPRS模块没有实现http协议的封装,需要在TCP协议的基础上,手动拼装http格式的报文.
3810 0
|
网络协议 C++
网络抓包工具wireshark and tcpdump 及其实现基于的libpcap
最近无意中看到博客园中一篇介绍wireshark的文章,写得不错,它简单清楚介绍了wireshark的使用 简介 wireshark以前叫做Ethereal, 在大学时候的网络课程中就常看到它,它是世界上最流行的网络抓包分析工具(world's most popular network protocol analyzer),它是基于图形界面的,官网有介绍wireshark是1998年的一个项目衍生出来的,它有比较强大的特性,可以用来分析数百种网络协议。
1579 0
|
网络协议 Unix Linux
Wireshark和TcpDump抓包分析心得
Wireshark和 TcpDump抓包分析心得    1. Wireshark与tcpdump介绍  Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Windows平台下使用Wireshark,如果是Linux的话,我直接用tcpdump了,因为我工作环境中的Linux一般只有字符界面,且一般而言Linux都自带的tcpdump,或者用tcpdump抓包以后用Wireshark打开分析。
4545 0