TCP内核参数与Nginx配置的简单测试
背景
昨天晚上整理了下几个TCP内核的参数.
学习到了一点内核参数的影响.
但是因为时间比较晚了没有继续钻研与nginx的关系
今天想着继续研究一下TCP的部分参数与nginx的关系
每个系统都不一样. 结果可能跟内核版本和内核参数强相关.
我这里用的是基于ARM的银河麒麟
还有基于x86的OpenEuler
内核版本都比较高
测试机器信息
1. 域名站点
aarch64
银河麒麟V10SP3
8c 64g
内核: 4.19.90-52.15.v2207.ky10.aarch64
2. 微服务方向代理节点
x86_64
OpenEuler 2203 LTS
16c 96g
内核: 5.10.0-60.18.0.50.oe2203.x86_64
测试点
1. keepalive对域名和应用服务器的影响.
2. 内核参数 ip_local_port_range 对nginx的response code 的影响
Nginx的keepalive的设置
Nginx最常用的是两种模式:
1. Nginx作为web服务器进行使用
是一个纯粹的Server服务.只需要关注他与客户端的连接就可以了.
2. Nginx作为反向代理的实现
此时Nginx不仅是一个Server服务, 对于upstream的服务器还是
一个client.
基于如上两个配置:
Nginx的keepalive 的设置也分为两个地方
一个是http时的keepalive设置
另外一个是 upstream 上面的keepalive的设置
Nginx的测试
http的keepalive的设置效果
Nginx的http配置节下面可以使用如下命令进行设置
keepalive_timeout 0;
单位是秒钟, 设置为0 表示禁用长连接.
进行测试:
注意每次测试都至少间隔 1min 保证上一次测试的 time_wait 都进行了释放.
先禁用为0
打开 界面:https://10.110.136.50/
查看TCP链接的情况:
[root@KylinV10SP3ARM64 nginx]# netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 8848 |grep -v 1521 |grep -v tcp6 |grep -v :22 |grep 10.110.81.124
tcp 0 0 10.110.136.50:443 10.110.81.124:57491 TIME_WAIT - timewait (57.65/0/0)
tcp 0 0 10.110.136.50:443 10.110.81.124:57492 TIME_WAIT - timewait (57.45/0/0)
# 发现只有两个 time_wait的连接
打开登录界面: https://10.110.136.50/login.html
# 至少会有 20个time_wait的连接.
# 如果是刷新 产生20个time_wait的连接, 如果是全新打开, 产生73个time_wait的连接.
# 数量太多就不在一一展示了.
Nginx的测试
修改为: keepalive_timeout 10;
然后再次进行测试
注意需要重启nginx 不要使用 -s reload的模式.
发现打开登录:https://10.110.136.50/ 还有 https://10.110.136.50/login.html
都是两个 established 的连接.
但是很快就变成了FIN_WAIT 然后TCP连接很快就消失了.
而且明显感觉 10秒钟最后就已经全部没有了.
[root@KylinV10SP3ARM64 nginx]# netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 8848 |grep -v 1521 |grep -v tcp6 |grep -v :22 |grep 10.110.81.124
tcp 0 0 10.110.136.50:443 10.110.81.124:59809 ESTABLISHED 2532685/nginx: work off (0.00/0/0)
tcp 0 0 10.110.136.50:443 10.110.81.124:59810 ESTABLISHED 2532685/nginx: work off (0.00/0/0)
[root@KylinV10SP3ARM64 nginx]# netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 8848 |grep -v 1521 |grep -v tcp6 |grep -v :22 |grep 10.110.81.124
tcp 0 0 10.110.136.50:443 10.110.81.124:59809 FIN_WAIT2 - timewait (39.81/0/0)
tcp 0 0 10.110.136.50:443 10.110.81.124:59810 FIN_WAIT2 - timewait (39.59/0/0)
Upstream 的 keepalive 的测试
Upstream 不设置 keepalive的测试
域名层的nginx 会没次刷新多一个 TIME_WAIT的连接.
[root@CentOS7MINI nginx]# netstat -anop |grep tcp |grep -v LISTEN |grep -v :637 |grep -v :884 |grep -v :1521 |grep -v tcp6 |grep -v :22 |grep -v 127.0.0.1 |grep 10.110.139.230
tcp 0 0 10.110.139.181:65176 10.110.139.230:5200 TIME_WAIT - timewait (58.09/0/0)
tcp 0 0 10.110.139.181:64752 10.110.139.230:5200 TIME_WAIT - timewait (55.55/0/0)
tcp 0 0 10.110.139.181:23646 10.110.139.230:5200 TIME_WAIT - timewait (42.51/0/0)
tcp 0 0 10.110.139.181:64984 10.110.139.230:5200 TIME_WAIT - timewait (56.86/0/0)
tcp 0 0 10.110.139.181:65142 10.110.139.230:5200 TIME_WAIT - timewait (57.37/0/0)
tcp 0 0 10.110.139.181:65374 10.110.139.230:5200 ESTABLISHED 2340/nginx: worker off (0.00/0/0)
第二层方向代理会产生更多的TIME_WAIT的连接
一次登录和退出会生产非常多的time_wait的信息:
打开登录界面 10个time_wait
登录成功: 17个time_wait
退出登录: 13个time_wait
[root@openeuler2203 ~]# netstat -anop |grep tcp |grep -v LISTEN |grep -v :637 |grep -v :884 |grep -v :1521 |grep -v tcp6 |grep -v :22 |grep 10.110.139.181
tcp 0 0 10.110.139.230:5200 10.110.139.181:28270 TIME_WAIT - timewait (43.00/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28502 TIME_WAIT - timewait (44.91/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:26174 TIME_WAIT - timewait (57.03/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28506 TIME_WAIT - timewait (44.93/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28452 TIME_WAIT - timewait (44.71/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28478 TIME_WAIT - timewait (44.91/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:26158 TIME_WAIT - timewait (57.02/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28440 TIME_WAIT - timewait (44.70/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28268 TIME_WAIT - timewait (42.99/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:51306 TIME_WAIT - timewait (36.06/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28514 TIME_WAIT - timewait (44.99/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28564 TIME_WAIT - timewait (45.20/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:26148 TIME_WAIT - timewait (56.93/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28466 TIME_WAIT - timewait (44.74/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:26186 TIME_WAIT - timewait (57.06/0/0)
Upstream 的 keepalive 的测试
在upstream里面增加设置
keepalive 32;
并且在 location 里面设置
proxy_http_version 1.1;
然后重启nginx
需要注意的是:
在当前服务器只会看到一个 tcp 对中间层nginx的连接
但是中间nginx的连接
会产生 20个time-wait 的连接.
TCP内核的验证
- 不同TCP状态下的内存占用是不一样的, 这里先通过一个图来说明
- 来源: https://mp.weixin.qq.com/s/BwddYkVLSYlkKFNeA-NUVg

TCP内核验证出现502错误的过程
sysctl -w "net.ipv4.ip_local_port_range=6000 6001"
然后登录nginx 所在的服务器
使用两个客户端打开 或者是打开具体个功能
F12会立即发现有很多的502 badgates 的提示信息.
也就验证出 如果time_wait+eslabished 的连接数大于 ip_local_port_range
的范围的话 有极大的概率出现 502的问题.
注意这个修改完之后 需要立即改回来 不然会出现严重的问题.
TCP内核参数与Nginx配置的简单测试的更多相关文章
- TCP三次握手与Linux的TCP内核参数优化
感谢各位技术大佬的资料分享,这里我把我理解的内容做一个整理 一:TCP的三次握手 1.TCP简述 TCP是一个面向连接的协议,在连接双方发送数据之前,首先需要建立一条连接.TCP建立连接可以简单称为: ...
- 修改Linux内核参数提高Nginx服务器并发性能
当linux下Nginx达到并发数很高,TCP TIME_WAIT套接字数量经常达到两.三万,这样服务器很容易被拖死.事实上,我们可以简单的通过修改Linux内核参数,可以减少Nginx服务器 的TI ...
- 修改Linux内核参数提高Nginx服务器在高的时候的性能
并发 Linux下高并发的Nginx服务器,当TCP TIME_WAIT套接字数量经常达到两.三万,服务器很容易被拖死.通过修改Linux内核参数,可以减少Nginx服务器的TIME_WAIT套接字数 ...
- 修改tcp内核参数:somaxconn
修改somaxconn 该内核参数默认值一般是128(定义了系统中每一个端口最大的监听队列的长度),对于负载很大的服务程序来说大大的不够.一般会将它修改为2048或者更大. echo 2048 > ...
- openstack私有云布署实践【4.2 上层代理haproxy+nginx配置 (办公网测试环境)】
续上一节说明 一开始我也是使用haproxy来做的,但后来方式改了,是因为物理机controller的高配置有些浪费,我需要1组高可用的上层nginx代理服务器来实现其它域名80代理访问,很多办公网测 ...
- TCP内核参数
tcp_syn_retries :INTEGER默认值是5对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃.不应该大于255,默认值是5,对应于180秒左右时间.(对于大负载而物理通信良 ...
- nginx 配置优化(简单)
配置文件 正常运行的必备配置: 1.user username [groupname]:(推荐nginx) 以那个用户身份运行,以在configure指定的用户 ...
- Ubuntu Server 16.04下ASP.NET Core Web Api + MySql + Dapper在 Jexus、nginx 下的简单测试
一.环境及工具 1.服务器 VirtualBox5.1.4 安装 Ubuntu Server 16.04 amd64 MySql Ver 14.14 Distrib 5.6.21 Jexus 5.8. ...
- centos下 redis安装配置及简单测试
1:安装redis(使用的的环境是centos6.7 redis-2.6.14) 将redis-2.6.14.tar.gz文件拷贝到/usr/local/src 目录下 解压文件 tar zxvf ...
- drone 学习五 集成gitlab 配置以及简单测试
备注: 使用docker-compose 进行安装 同时集成gitlab,预备环境 docker docker-compose gitlab 1. docker-compose version: ...
随机推荐
- 技术实操丨SoundNet迁移学习之由声音分类到语音情感识别
摘要:声音也是识别对象的一种重要数据源.其中根据声音来识别声音所处的环境也是语音识别的研究内容之一. 一.思路 1.SoundNet模型在视频数据中先预训练,视频任务可能是场景识别,可参考这篇文章So ...
- 华为云NFT云宝限量开抢,区块链技术为你的数字资产保驾护航
摘要:正是有这些底层的区块链技术支撑,才能让我们真正的"拥有"独属于自己的NFT数字资产. 本文分享自华为云社区<华为云独家NFT限量开抢,背后的这些技术你都知道吗?> ...
- JS引擎(0):JavaScript引擎群雄演义—起底JavaScript引擎
JavaScript 既是一个 面向过程的语言 又是一个 面向对象的语言.在 JavaScript 中,通过在运行时给空对象附加方法和属性来创建对象,与编译语言如 C++ 和 Java 中常见的通过语 ...
- Windows 2012 上网慢如何解决
解决步骤:1.执行netsh int tcp show global 查看默认TCP全局参数等相关设置 Windows 2012 默认ECN 功能是开启的,将其关闭即可 以管理员的身份运行下列 ...
- C-Shopping基于Next.js,开源电商平台全新亮相
嗨,大家好!欢迎来到C-Shopping,这是一场揭开科技面纱的电商之旅.我是C-Shopping开源作者"继小鹏",今天将为你介绍一款基于最新技术的开源电商平台.让我们一同探索吧 ...
- POJ: 2236 Wireless Network 题解
POJ 2236 Wireless Network 加工并储存数据的数据结构 并查集 这是并查集的基本应用,两台修好的电脑若距离d内则加入合并.不过不小心的话会TLE,比如: #include < ...
- AtCoder Beginner Contest 180 个人题解(快乐DP场)
补题链接:Here A - box 输出 \(N - A + B\) B - Various distances 按题意输出 3 种距离即可 #include <bits/stdc++.h> ...
- 三、redis集群搭建
系列导航 一.redis单例安装(linux) 二.redis主从环境搭建 三.redis集群搭建 四.redis增加密码验证 五.java操作redis 环境:centos7需要的安装包: redi ...
- WebGPU光追引擎基础课:使用WebGPU绘制三角形
大家好~我开设了"WebGPU光追引擎基础课"的线上课程,从0开始,在课上带领大家现场写代码,使用WebGPU开发基础的光线追踪引擎 课程重点在于基于GPU并行计算,实现BVH构建 ...
- NOIP2020游记——AFO之战
阅读时请播放此音乐,这是我精心挑选的,很适合本文. Day-0奇遇 考试前一天,不顺,很不顺,简直可以写小说了.(不想看我车店可以往下翻,Day-1在后边) 我是下午两点从齐齐哈尔出发前往省会哈尔滨的 ...