Linux下Http高并发参数优化之抓包测试

 2017-06-06 22:19:32     TCP/IP  HTTP  Nginx  Wireshark   1423


导读: 各种参数设置都调好了,剩下的就是测试。先测试 keepalive 是否生效。虽然参数都按照理论进行一番设置,但由于涉及的环节太多,保不齐哪个地方抽风,就会导致各种问题。所以,测试验证一下比较保险。用 Wireshark 的强大抓包分析功能,可以清晰的看到服务的网络通信过程,也可以加深对 TCP/IP 协议的理解。

抓包分析用的Wireshark,功能很强大。目前,我只会简单的使用,但对验证 keepalive 的测试够用了。

该工具可以在客户端上使用,也可以在服务端通过 tcpdump 命令抓包,然后将抓捕的内容文件导入到 Wireshark 中进行分析。

我这里是在服务端进行抓包。

tcpdump -i eth1 -w /tmp/keepalive_concat.pcap -v

应用服务是一个简单的静态页面展示。Html 内容如下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>

    <link type="text/css" rel="stylesheet" href="assets/css/bootstrap.min.css"/>
    <script type="text/javascript" src="assets/js/jquery.min.js?v=1.0.0"></script>
</head>
<body>
    <h1>Welcome to MyTest!</h1>
    <p>If you see this page, the service is success.</p>
</body>
</html>

不使用keepalive


将 Nginx 的 keepalive_timeout 设置为 0,即关闭了 keepalive。

通过抓包分析可以看到,每个 Http 请求,都创建了新的连接, Http 响应后,又关闭了连接。

html 请求。

nokeepalive-html

css 请求。

nokeepalive-css

js 请求。

nokeepalive-js

使用keepalive


使用 keepalive 后,减少了 TCP 连接的创建。

html 和 css 请求。

keepalive-html

js 请求。

keepalive-js

为什么Html 和 CSS 请求公用了一个长连接,而 js 又重新创建了一个连接呢?

这个与并发有关,在进行 CSS 请求时, Html 请求已经响应,它创建的连接处于空闲,所以 CSS请求时,可以直接使用。在进行 JS 请求时, CSS 请求未完成,还在进行数据传输,没有空闲连接,所以就重新创建了连接,从端口号就可以看出,这是一个新的连接。

将抓包内容按照时间排序也可以看出。

keepalive-all

那有没有办法让这些请求尽可能的公用一个长连接呢? 或者是怎么进一步的减少连接的创建?

办法是有的。在OpenResty安装中,用到了 nginx-http-concat 模块,它是由淘宝开发的一个模块,就是为了解决页面引用大量 js、css 的加载性能问题。

nginx-http-concat


Html 页面 JS 引用做一下修改。(CSS一样)

<script type="text/javascript" src="assets/js/??jquery.min.js,bootstrap.min.js"></script>

Nginx 的 JS 部分加上以下内容。

location /assets/js/ {
    default_type 'application/javascript';
    concat on;
    concat_max_files 20;
    concat_unique on;
    ...
}

再来抓包看一下请求过程。

keepalive-concat

可以看出来,同样多的 Http 请求,只创建了一个 TCP 连接。服务器性能提升了,客户端加载也变快了。

这样,我们就可以将同一域名下的所有 JS/CSS 请求放在一个引用里。

ab压力测试



参考
Wireshark基本介绍和学习TCP三次握手