More Related Content
Similar to 如何应用Tcpdump分析应用性能 (20)
如何应用Tcpdump分析应用性能
- 2. 敏 捷 运 维 , 成 就 数 字 化 业 务
应用性能实战:如何用tcpdump分析应用性能
刘成穆--优云软件
- 3. 敏 捷 运 维 , 成 就 数 字 化 业 务
01
02
03
04
基础知识准备
应用性能分析过程详解
其它和附录
大纲
- 4. 敏 捷 运 维 , 成 就 数 字 化 业 务
准备--TCP/IP数据包格式
TCP Header
Offsets Octet 0 1 2 3
Octet Bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 Source port Destination port
4 32 Sequence number
8 64 Acknowledgment number (if ACK set)
12 96 Data offset
Reserved
0 0 0
N
S
C
W
R
E
C
E
U
R
G
A
C
K
P
S
H
R
S
T
S
Y
N
F
I
N
Window Size
16 128 Checksum Urgent pointer (if URG set)
20
...
160
...
Options (if data offset > 5. Padded at the end with "0" bytes if necessary.)
...
IPv4 Header Format
Offsets Octet 0 1 2 3
Octet Bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 Version IHL DSCP ECN Total Length
4 32 Identification Flags Fragment Offset
8 64 Time To Live Protocol Header Checksum
12 96 Source IP Address
16 128 Destination IP Address
20 160
Options (if IHL > 5)
24 192
28 224
32 256
数据TCP头IP头Ethernet头
2016-12-05 20:54:31.964339 IP 192.168.99.101.8080 > 192.168.99.1.52739: tcp 266
0x0000: 4500 0132 7c13 4000 4006 75fb c0a8 6365 E..2|.@.@.u...ce
0x0010: c0a8 6301 1f90 ce03 3cbe a47d e4cf 5195 ..c.....<..}..Q.
0x0020: 5018 00fe 48dc 0000 4854 5450 2f31 2e31 P...H...HTTP/1.1
0x0030: 2032 3030 204f 4b0d 0a44 6174 653a 2054 .200.OK..Date:.T
- 5. 敏 捷 运 维 , 成 就 数 字 化 业 务
准备--TCPDUMP常用命令
参数 描述 参数 描述
-A 显示ASCII字符 -t 不显示时间戳
-c 指定抓包数量,到达指定数量后退出 -tttt 显示格式化时间
-D 列出机器网卡 -v -vv -vvv 在控制台显示信息
-G 指定抓包时长,-G30,可以跟-W一起使用 -w 保存到文件
-i 指定抓取的网卡 -X 打印HEX原始报文信息
-n 不要解析IP地址 -s 截取报文长度,默认1500
-nn 不要解析地址和端口 更多参数man tcpdump
tcpdump -A -s 0 port 80 抓取80端口的所有数据包,并以ASCII码显示
tcpdump -nvvX -s 768 src x.x.x.x and dst port 80 指定固定来源的请求
tcpdump
- 6. 敏 捷 运 维 , 成 就 数 字 化 业 务
01
02
03
04
基础知识准备
应用性能分析过程详解
其它和附录
大纲
- 7. 敏 捷 运 维 , 成 就 数 字 化 业 务
应用性能分析
抓取数据包
tcpdump
分析提取数据
awk
输出
report
吞吐量
•统计每秒钟处理的请求数量
•单位rps
平均响应时间
•从请求开始到数据返回的消耗时间,
为一次请求的响应时间
•统计所有请求的响应时间,计算平均
值
•单位ms
错误率
•http返回错误状态码的次数占所有请
求的比率
•单位%
一个简单的WEB应用
环境
指标
思路
- 8. 敏 捷 运 维 , 成 就 数 字 化 业 务
应用性能分析--抓包
tcpdump -G30 -W1 -i any port 8080 -w /tmp/8080.pcap
抓取数据包:抓取30秒数据,写入临时文件(假设WEB服务端口是8080)
- 9. 敏 捷 运 维 , 成 就 数 字 化 业 务
>,192.168.99.1.60299:-192.168.99.101.8080:,12-01 11:38:54.945952,/hello.echo.jsp,
<,192.168.99.1.60299:-192.168.99.101.8080:,12-01 11:38:54.946377,,200
应用性能分析--解析
2016-12-05 20:54:31.901814 IP 192.168.99.1.52737 > 192.168.99.101.8080: tcp 201
E...".@.......c...ce.......[....P...L...GET /hello.echo.jsp HTTP/1.1
Connection: keep-alive
Content-Length: 0
Content-Type: text/plain; charset=ISO-8859-1
2016-12-05 20:54:31.902287 IP 192.168.99.101.8080 > 192.168.99.1.52737: tcp 266
E..25.@.@..k..ce..c............$P...H...HTTP/1.1 200 OK
Date: Tue, 06 Dec 2016 01:54:31 GMT
Content-Type: text/html; charset=ISO-8859-1
解析数据包:用tcpdump从读取保存的pcap文件加载
tcpdump -tttt -s96 -nnn -A -i any "( tcp[tcpflags]& 0x8 !=0 ) " -r 8080.pcap
分析提取数据:用文本利器awk来提取上面标记的信息
tcpdump … 8080.pcap | awk -f trace.awk
- 10. 敏 捷 运 维 , 成 就 数 字 化 业 务
应用性能分析--解析(续)
>,192.168.99.1.60288:-192.168.99.101.8080:,12-01 11:38:50.737326,/hello.echo.jsp,
<,192.168.99.1.60288:-192.168.99.101.8080:,12-01 11:38:50.738115,,200
>,192.168.99.1.60289:-192.168.99.101.8080:,12-01 11:38:50.769716,/hello.echo.jsp,
<,192.168.99.1.60289:-192.168.99.101.8080:,12-01 11:38:50.770231,,200
>,192.168.99.1.60287:-192.168.99.101.8080:,12-01 11:38:50.824804,/hello.echo.jsp,
<,192.168.99.1.60287:-192.168.99.101.8080:,12-01 11:38:50.825312,,200
>,192.168.99.1.60290:-192.168.99.101.8080:,12-01 11:38:50.931915,/hello.echo.jsp,
<,192.168.99.1.60290:-192.168.99.101.8080:,12-01 11:38:50.932579,,200
>,192.168.99.1.60291:-192.168.99.101.8080:,12-01 11:38:51.018451,/hello.echo.jsp,
>,192.168.99.1.60289:-192.168.99.101.8080:,12-01 11:38:51.018473,/hello.echo.jsp,
<,192.168.99.1.60289:-192.168.99.101.8080:,12-01 11:38:51.019094,,200
<,192.168.99.1.60291:-192.168.99.101.8080:,12-01 11:38:51.019133,,200
>,192.168.99.1.60288:-192.168.99.101.8080:,12-01 11:38:51.135956,/hello.echo.jsp,
<,192.168.99.1.60288:-192.168.99.101.8080:,12-01 11:38:51.136451,,200
>,192.168.99.1.60287:-192.168.99.101.8080:,12-01 11:38:51.168214,/hello.echo.jsp,
<,192.168.99.1.60287:-192.168.99.101.8080:,12-01 11:38:51.168865,,200
由于并发请求,我们需要
用sort根据连接标记排序
按照TCP连接排序来区分关联请求响应
tcpdump …-r 8080.pcap | awk -f trace.awk | sort
- 11. 敏 捷 运 维 , 成 就 数 字 化 业 务
应用性能分析--解析(续)
>,192.168.99.1.60293:-192.168.99.101.8080:,12-01 11:38:52.916889,/hello.echo.jsp,
<,192.168.99.1.60293:-192.168.99.101.8080:,12-01 11:38:52.917607,,200
192.168.99.1.60293:-192.168.99.101.8080:,12-01 11:38:54.916889,/hello.echo.jsp,200,612us
排序后的数据会根据TCP连接和时间先后排序
继续使用文本神器awk,两行相减即可
tcpdump … -r 8080.pcap | awk -f trace.awk | sort | awk -f combine.awk > http.requests
然后把分析的结果保存的文件,后续统计使用
- 12. 敏 捷 运 维 , 成 就 数 字 化 业 务
应用性能分析--统计
192.168.99.1.60295:-192.168.99.101.8080:,12-01 11:38:54.039088,/hello.echo.jsp,200,618,us
192.168.99.1.60295:-192.168.99.101.8080:,12-01 11:38:54.163866,/hello.echo.jsp,200,440,us
192.168.99.1.60295:-192.168.99.101.8080:,12-01 11:38:54.374836,/hello.echo.jsp,200,549,us
192.168.99.1.60295:-192.168.99.101.8080:,12-01 11:38:54.661418,/hello.echo.jsp,200,5004,us
192.168.99.1.60296:-192.168.99.101.8080:,12-01 11:38:52.869262,/hello.echo.jsp,200,622,us
192.168.99.1.60296:-192.168.99.101.8080:,12-01 11:38:53.040559,/hello.echo.jsp,200,512,us
192.168.99.1.60296:-192.168.99.101.8080:,12-01 11:38:53.480057,/hello.echo.jsp,200,478,us
192.168.99.1.60296:-192.168.99.101.8080:,12-01 11:38:53.991262,/hello.echo.jsp,200,555,us
st=2016-12-01 11:38:25.834630,et=2016-12-01 11:38:54.945952,total=280265,count=485,rps=16.6602,resp
avg=577.866,resp max=5004,resp min=248,error=1,success
经过前面的分析,得到每一个WEB请求的响应时间和状态
指标
吞吐量 每秒钟的请求数
响应时间 平均值,最大值,最小值
成功率 错误次数/请求数
cat http.requests | awk -f statistic.awk
- 13. 敏 捷 运 维 , 成 就 数 字 化 业 务
应用性能分析--自动化监测
tcpdump -qnn -G30 -W1 -i any port 8080 -w /tmp/temp.pcap > /dev/null && tcpdump -q
-tttt -s96 -nnn -A -i any "( tcp[tcpflags]& 0x8 !=0 ) " -r /tmp/temp.pcap | awk -f
trace.awk | sort| awk -f combine.awk | awk -f statistic.awk && rm -f /tmp/temp.pcap
更进一步,可以把结果发送邮件,或者trap,或者curl推送到外部系统
把所有的一切连接起来,添加crontab定时任务
- 14. 敏 捷 运 维 , 成 就 数 字 化 业 务
01
02
03
基础知识准备
应用性能分析过程详解
其它和附录
大纲
- 15. 敏 捷 运 维 , 成 就 数 字 化 业 务
更多一点
还有其它一些什么方法可以用来做性能分析
各有什么优缺点
这个方法看起来有点麻烦
就是一种基于旁路监听的应用性能分析的基本原理,通过镜像镜像数据,分析更多节点,解析更多协议,
更多指标…;比如我们的优云APM
日志文件,代码跟踪,模拟用户,…
- 16. 敏 捷 运 维 , 成 就 数 字 化 业 务
附录 trace.awk
#把tcpdump -A出来的数据格式化,根据tcp连接提取请求路径和返回码
#注意:
#由于2016-12-05 20:54:31.901814 IP 192.168.99.1.52737 > 192.168.99.101.8080: tcp 201 发送和接收的顺序相反
#在输出的时候交换位置
BEGIN{
RS="([[:digit:]]{4}-)"
FS="no-field-seperator"
}
{
split($0, f, " ")
if( match($0 , /(GET|POST) ([^ ]*)/, m) ) {
print ">,"f[4]":-"f[6]",2016-"f[1]" "f[2]","m[2]","
}
if( match($0, /(HTTP)/1.1 ([[:digit:]]+)/, m) ){
print "<,"f[6]"-"f[4]":,2016-"f[1]" "f[2]",,"m[2]
}
}
END{
}
- 17. 敏 捷 运 维 , 成 就 数 字 化 业 务
附录 combine.awk
# 用于把两行独立的发送和响应合并,并且根据时间差计算响应时间
# 注意输入数据应该根据TCP连接,和时间先后排序
#
BEGIN{
RS=">";
FS=",|n“
}
{
if (NF > 5) {
split($8, sa,".");
split($3, sb,".");
gsub(/[:-]/, " ", sa[1]);
gsub(/[:-]/, " ", sb[1]);
rtime = (1000000*mktime(sa[1]) + sa[2]) - (1000000*mktime(sb[1]) + sb[2]);
print $2 "," $3 "," $4 "," $10 "," rtime ",us";
}
}
END{
}
- 18. 敏 捷 运 维 , 成 就 数 字 化 业 务
附录 statistic.awk
# 根据输入的每一次http请求,生成统计信息
# 输出开始时间,结束时间,最大最小响应时间,平均响应时间,总响应时间,请求量,吞吐量,和成功率
BEGIN {
FS=","
}
{
total += $5
count ++;
if( !max || $5 > max ) max = $5
if( !min || $5 < min ) min = $5
if( !max_date || $2 > max_date ) max_date = $2
if( !min_date || $2 < min_date ) min_date = $2
if( $4 > 400 ) error++
}
END {
split(max_date, maxs, ".")
split(min_date, mins, ".")
gsub(/[-:]/, " ", maxs[1])
gsub(/[-:]/, " ", mins[1])
delta = (1000000*mktime("2016 "maxs[1])+maxs[2]) -(1000000*mktime(mins[1])+mins[2])
print "st="min_date",et="max_date",total=" total ",count=" count ",rps="(1000000*count/delta) ",resp avg=" (total/count) ",resp
max=" max ",resp min=" min",error="error",success rate="((total-error)/total)
}
Editor's Notes
- 大家好,我是刘成穆,现在在优云软件从事APM产品方向的工作。
最近几年在运维领域里 APM这个名词变得有点火热,有人把它叫应用性能管理,也有人叫应用性能监测。
反正都离不了应用性能;那什么叫应用性能,用一句大白话来说就是,一个应用,或一个网站使用起来是否流畅,是否容易出错。
这也就是今天要跟大家分享的主题:如何利用tcpdump做应用性能分析,分析一个网站访问是不是快,有没有出错。
- 整个过程分成三个部分
1、第一部分会讲一点基础知识,因为后边分析过程需要用到,包括tcp/ip包格式,tcpdump命令使用
2、应用性能分析过程详解,用tcpdump一步一步分析应用性能
3、其余的一些扩展讨论
- 这一页PPT信息量有点大,内容多,还有点枯燥,但是是后续事情的一个基础。
第一行说的是TCP/IP网络数据包的基本结构,一般说来,7层网络模型,数据从应用层逐层往下到物理层,最后从网卡发送出去,每经过一层都会给数据添加一个包头,通常我们把这些叫做协议头。IP头,TCP头,HTTP头等。
这里我们关心的是IP头和TCP头。
IP头包主要含了数据包的来源IP地址和目标IP地址。
TCP头主要包含了数据包的来源端口和目标端口,数据包类型。
HTTP头中信息中会有,用户请求的URL地址,还有其他更多的HTTP的信息。
举个例子,
用户请求打开一个网站的的一个页面。
实际上在网络上,会建了一个从用户机器到服务器的之间的tcp连接。
然后再发送一个 HTTP GET请求,请求打开一个页面
服务器收到请求之后做出响应,就会把数据发送到客户的机器。
这个过程有几个关键的信息我们需要注意:
第一:
从IP包头里面有 客户端IP,服务器IP
TCP包里面有客户端端口信息,服务端端口信息
这4个信息很重要,又这四个信息,我们就可以在一定时间范围内唯一确定一个TCP连接
第二:
客户端发送的请求信息里面会有需要请求的地址,和时间
服务端返回的信息也会有返回的内容和时间
这几个信息我们就用来跟踪用户的请求
我们可以用tcpdump来抓获这些网络数据,下面我们就来看下如何用tcpdump来抓取网络数据。
红色部分就是IP头,绿色部分就是tcp头
- tcpdump是一个Linux下的抓包工具软件,很灵活很高效,这里我们列举一个常用的参数和使用模式
我们可以指定特定端口,特定IP地址
也可以抓取的时长,或者抓取多少数据包之后停止。
- 有了这些基础知识和工具之后,我们就可以开始如何利用这些工具做应用性能分析
- 假设有一个WEB应用
需要分析的指标,每秒钟的吞吐量(即每秒钟处理http请求数量);
响应时间:从web服务器接收请求开始到响应消耗的时间;
通过跟踪http的返回码,有没有返回500,404来判断是不是出现问题,把错误的次数跟总请求数的比率,记为错误率
大致思路就是
1、通过tcpdump,抓取网络数据包,并且把数据包转成文本
2、通过awk从数据包中提取 客户端ip,服务器ip,以及对应的端口用来跟踪tcp连接,提取数据包中的http请求的地址,和服务器返回的状态来判断是否成功
3、收集到基础数据之后,可以用awk统计生成对应的指标
- 那就开始第一步,抓包
我这里解释一下几个参数的意义
-G30 表示一次30秒
-W1 表示只需要重复一次
-w 把数据包写入文件
port 8080是一个过滤,我们只需要8080端口的数据
这个执行之后,等待30秒,并把抓取的数据包记录在文件中,供下一步分析使用
- 第二步,解析刚刚抓取的数据包
这里用到 tcpdump -r参数,表示从文件中加载数据包,-A参数表示把数据包转成ascii码输出
然后是一个看起来有点复杂的过滤 tcpflags,这里我们只需要tcpflag为psh(这个可以回头去看一下前面的ppt),这样就能过滤出那些有数据发送的数据包,屏蔽掉跟我们分析目标不相关的噪音。
图中是抓取的包的一个样本:
我们可以看到数据包时间、来源IP,端口,目标IP,端口。
请求的url地址
还有服务器返回的时间和状态
这里需要注意一下的是,客户端发送的数据包和服务器返回的数据包的目标地址和来源地址刚好相反
把数据包转成我文本之后,剩下的就是文本分析了。
就可以用awk来分析提取数据。
这里我写了一个trace.awk脚本把客户端ip,服务器ip,客户端端口,服务端端口,客户端发出请求的时间,请求的地址,服务器回应的时间,响应的状态几个数据从数据包中提取出来。
输出的数据其中的一个样本看起来就是这样
第一步就完成了
- 第二步,我们可以观察一下第一步得到的数据
从输出的数据来看,由于有多个客户端,数据的顺序并不是严格的一个请求,一次响应;而可是多个请求,然后多个响应;
这里我们就要根据tcp4个维度了先梳理,在每一个tcp中,这个请求和响应的顺序就会是有序对应的。
这里我们可以看下之前的awk的脚本,在处理的时候,把客户端发送的和服务器返回的数据的地址做了一下交换,这样我们就可以用排序工具直接做排序就好
排序很简单,sort就可以了。
把上一步的输出再通过管道连接到sort,我们就能得到根据tcp连接和时间先后排序的数据。
- 在正常的情况下,排序后的数据就会是一一对应的,一个请求,一个响应
现在我们只需要把返回时间跟请求时间相减就能得到响应时间。
这里还是继续使用awk,把两行合并成一行,并且计算好响应时间
最后把这个数据写入文件,备用
- 到现在为止,我们已经把网络数据包解析,转成了http请求到响应,响应状态,响应时间的数据行了。看起来很像nginx日志了。
可以放在excel里面分析,或者还是继续用awk来统计rate=0.999996吧。输出 开始时间,结束时间,总请求数,总耗时,吞吐量,平均响应时间,最大最小响应时间,错误数,成功率
这样分析过程就结束了,我们得到了想要的几个指标
再来回顾一下分析过程
1、抓取网络数据包
2、从数据包提取tcp 4个维度,以及http的请求时间,请求地址,服务器的返回的时间,和状态
3、把上一步骤的数据根据tcp 4维度排序(这个可以专业的称作连接跟踪)
4、然后把请求,返回的时间求差,计算响应时间
5、最后把所有的数据做指标统计
- 我们这过程都是一步一步,纯手动执行。
在linux下,如果要把这些自动执行,只要把这些命令用管道连接起来就好了。然后再把这个命令加入到crontab里面,定期执行。
统计的结果,也可以进一步用email,trap,或者curl之类的命令推送到其它外部系统,或者发送通知,这里不展开说了。
把这些脚本放在服务器上,就能真能定期收到系统的性能报告了。
到此为止,技术部分讲解就结束了,但是最重要的还在后面。
- 回顾一下,我们做了一个简单的,基于网络数据包的应用性能监测工具。
很原始,费那么大劲,就分析出来一个web日志的内容,看起来并没有太多用,假如放在服务器上跑,tcpdump,awk都会消耗不少性能。
所以我也不建议你就直接这么使用;
但是它能说明问题,这就是现在做应用性能监控的一种做法,基于网络镜像的APM。
把所有主机的数据都镜像到独立的服务器(这样不会影响应用本身的主机)
分析各种通讯协议的数据,http,数据库,缓存,还有各种各样的专有业务协议,比如银行的,语音的。
当然也可以分析到更丰富的指标,吞吐量,响应时间,成功率,数据包大小,应用性能指数,网络连接时间,地理位置;
分析发现老慢的那些地址,总是出错的地址
还可以在把发生错误的时候把网络数据包保留下来,分析bug使用
今天分享了,这里留两个思考题。
1、除了网络数据之外,其它还有什么方法可以用来做应用性能分析,日志文件,代码跟踪,模拟访问,或是其它?
2、第二个思考题是,他们各有什么优缺点?
谢谢大家,文中涉及到的脚本在后面的PPT。或者移步github