因为收到反馈说我们的 app 页面刷新慢,初步分析呢是因为运营的小伙伴上传了较大的图片导致的,然后就引发了一堆优化:
既然问题来了,那么怎么做呢?
以前做过 app 性能获取的工具,但是不理想,兼容性差:
开启一个代理服务器,通过抓包过滤出被测设备产生的流量,进行统计相对靠谱的多
windows, linux, mac 都可以设置代理服务器,我选择的是 centos,
由于公司的服务目前是基于 http 协议的,所以需要搭建一个 http 的代理服务,我选择了 nginx
yum install nginx
# 访问nginx安装目录
cd /etc/nginx
# 保存一份默认的配置文件
cp nginx.conf nginx.origin.conf
# 编辑配置文件,并增加http正向代理
vi nginx.conf
# 在server下面增加resolver,在location中增加proxy_pass与proxy_set_header
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
resolver 8.8.8.8;
resolver_timeout 5s;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
修改好配置文件后,可以测试一下,并启动 nginx
# 测试
nginx -t
# 启动
nginx
# 重启启动nginx
nginx -s reload
# 查看nginx访问日志,这个文件位置是在nginx.conf里面配的
tail -f /var/log/nginx/access.log
这里我在 win7 的机器上打开浏览器,修改代理设置:centos 机器 ip,端口是上面配的 80 端口
修改代理后,成功访问 163.com
注意了,我只代理了 http 协议,https 不能正常访问是正常的
wireshark
tcpdump
我希望最好是一个命令行工具,而不是 GUI 操作的工具,
tcpdump 和 tshark 大部分场景基本一致,最后选择了 wireshark 自带的 tshark
yum install wireshark
yum install wireshark-gnome
tshark -h
ifconfig
tshark -D
tshark -i 1
tshark -i enp2s0
tshark -i enp2s0 -w packets.pcap
tshark -i enp2s0 -w packets.pcap -c10 #只抓10个,抓满10即自动停止
tshark -r packets.pcap
tshark -r packets.pcap -c5 #读取前5个
tshark -r p.pcap -V
tshark -r p.pcap -V -c1 #结合之前的-c,可以查看第一个包的具体内容
The following values are available when using this option:
m MAC address resolution
n Network address resolution
t Transport layer (port name) resolution
N Use external resolvers
C Concurrent DNS lookups
tshark -i enp2s0 -n
tshark -ni 5 -w pack.pcap -f "tcp port 9980"
tshark -r pack.pcap -Y "tcp.dstport == 9980"
tshark -r p.pcap -t ad
tshark -z help
http,tree Displays statistics related to HTTP requests and responses
tshark -r pack.pcap -qz conv,tcp
================================================================================
TCP Conversations
Filter:<No Filter>
| <- | | -> | | Total | Relative | Duration |
| Frames Bytes | | Frames Bytes | | Frames Bytes | Start | |
192.168.1.189:57399 <-> 192.168.1.171:9980 1332 2008853 341 22849 1673 2031702 0.196315903 0.4847
192.168.1.189:57400 <-> 192.168.1.171:9980 376 565847 126 8770 502 574617 0.196795638 0.1422
192.168.1.189:57397 <-> 192.168.1.171:9980 231 340320 78 7273 309 347593 0.000000000 0.4854
192.168.1.189:57402 <-> 192.168.1.171:9980 86 123830 37 3437 123 127267 0.197292575 0.2728
192.168.1.189:57403 <-> 192.168.1.171:9980 59 85650 25 2711 84 88361 0.197415689 0.0599
192.168.1.189:57401 <-> 192.168.1.171:9980 50 71782 24 2660 74 74442 0.197162662 0.0567
================================================================================
上面按 tcp 协议统计,将 Total 下面的 Bytes 那一列求和,可得总计使用的流量信息
下面按 ip 统计
tshark -r pack.pcap -qz conv,ip
================================================================================
IPv4 Conversations
Filter:<No Filter>
| <- | | -> | | Total | Relative | Duration |
| Frames Bytes | | Frames Bytes | | Frames Bytes | Start | |
192.168.1.171 <-> 192.168.1.189 631 47700 2134 3196282 2765 3243982 0.000000000 0.6811
================================================================================
已将 tshark 服务端抓包,解析结果完成,
这里是基于 tshark 原生的分析汇总结果,还需要更多的分析和处理,得出我们需要关注的数据
由于我们的问题点主要是防止线上有大图片(文件大小),所以 tshark 自带的结果分析不符合我们的目标
我们的期望是得出哪些响应的大小超过了阀值(比如 0.5M),那么可能是需要关注的重点
原来 tshark 是通过 frame(帧)来记录所有的请求及响应的
tshark -r pack.pcap -Y "http.request_in != 0" -T fields -e "frame.number" -e "http.request_in" -e "http.response_in" -e "http.request_number" -e "http.response_number" -e "http.response.code" -e "http.host.uri"
Running as user "root" and group "root". This could be dangerous.
22 4 200
121 23 200
190 149 200
397 151 200
这里的 22 是 response 的 frame number,4 是请求的 frame number,这样一个请求就和一个响应对应起来了,响应帧的长度即响应消耗流量(frame.len)
tshark -i 5 -n -f 'tcp dst port 3306' -T fields -e mysql.query
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp2s0'
SELECT project_name as projectName FROM tb_project
根据 mysql 默认的 3306 端口过滤 sql 语句
tshark -i enp2s0 -t ad -w 2018.pcap -f "ip src host 被测机器ip(例:192.168.1.189)"
tshark -r 2018.pcap -R 'http.host==目标域名(例:www.xxx.com)' -qz conv,ip
《Practical Packet Analysis, 3rd Edition》
tshark 官网地址
wireshark 过滤器
wireshark display fields => 常用的:frame, http, tcp
已将 tshark 服务端抓包,原生解析展示完成,接下来是结果分析,感觉用 java 分析命令行结果,有点醉醉的