一、知识准备
在nginx优化中有个经常需要设置的参数,tcp_nodelay
ASP站长网该参数最核心的功能,就是把小包组成成大包,提高带宽利用率也就是著名的nagle算法
tcp协议中,有一个现象:应用层数据可能很低(比如1个字节),而传输层开销有40字节(20字节的IP头+20字节的TCP头)。这种情况下大部分都是控制包的传输,既加大了带宽的消耗,带宽利用率也不高
nagle算法就是为了解决这个问题。在发出去的数据还未被确认之前,或者说还没有收到对端的ack之前,新生成的小包是不允许被发送的,必须要凑满一个MSS或者等到收到确认后再发送,直至超时
二、环境准备
组件 版本
OS Ubuntu 18.04.1 LTS
docker 18.06.0-ce
客户端 : 192.168.17.171
服务端 : 192.168.17.173
 
三、打开nagle算法
192.168.17.173,先准备一个nginx配置文件,并且打开nagle算法,设置tcp_nodelay off;
 
root@k8s-node2:/tmp# more nginx.conf
user  nginx;
worker_processes  1;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  /var/log/nginx/access.log  main;
 
    sendfile        on;
    tcp_nodelay off;
 
    keepalive_timeout  65;
 
    include /etc/nginx/conf.d/*.conf;
}
启动容器
 
root@k8s-node2:/tmp# docker run -d --name nginx_delay -v /tmp/nginx.conf:/etc/nginx/nginx.conf -p 80:80 nginx:latest
6b7d5a5d3c3ed021fed6847d138837754c5732979d1c829ec62107ec80440db8
root@k8s-node2:/tmp# docker ps | grep nginx_delay
6b7d5a5d3c3e        nginx:latest                                                        "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds        0.0.0.0:80->80/tcp   nginx_delay
首先使用tcpdump抓取本机的80端口的流量:
 
root@k8s-node2:/tmp# tcpdump -i ens3 port 80 -afexnnvv -w nginx_ab.cap
在192.168.17.171,使用ab压测工具对该端口进行放量
 
注意:必须使用 -k 参数,使用keepalived模式下才能模拟出nagle算法
 
root@k8s-node2:~# ab -n 1000 -c 100 -k http://127.0.0.1/
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
 
...
Time per request:       44.619 [ms] (mean)
...
过滤掉大量信息,我们来到这个指标Time per request,无论怎么测试,平均延时总是在40ms左右
 
我们来看下抓包信息,使用wireshark打开
 
在大量的数据包中,我们先处理一下数据包,随便选取一个syn,选取与该syn对应的tcp流

dawei

【声明】:九江站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。