TCP内核参数的简单验证

tcp,内核,参数,简单,验证 · 浏览次数 : 207

小编点评

** time wait 连接数:40条** ** 等待时间:** | 连接数 | 等待时间 | 端口 | |---|---|---| | 40 | 51.06 | 5096 | | 40 | 55.94 | 5008 | | 40 | 56.10 | 5008 | | 40 | 57.94 | 37604 | | 40 | 57.96 | 37630 | | 40 | 58.02 | 37696 | | 40 | 58.02 | 37708 | | 40 | 58.02 | 5200 | | 40 | 59.15 | 5200 |

正文

前言

春节假期时学习了下内核参数与nginx的调优
最近因为同事遇到问题一直没有解,自己利用晚上时间再次进行验证.
这里将几个参数的理解和验证结果简单总结一下.
希望能够在学习的过程中将问题解决掉. 

其实很后悔没有好好学习代码.现在很多问题都已经到了瓶颈期
无法深入的研究下去. 

参数一

  • net.ipv4.tcp_max_tw_buckets
先说一下基本的结论:
CentOS默认的值: 262144
阿里云虚拟机的默认值: 5000
华为云虚拟机的默认值: 5000
腾讯云虚拟机的默认值: 131072

在简单描述一下这个参数的作用: 
在 TIME_WAIT 数量等于 tcp_max_tw_buckets 时,
不会有新的 TIME_WAIT 产生。

类似 Nginx 之类的中间代理一定要关注这个值,因为它对你的系统起到一个保护的作用,
一旦端口全部被占用,服务就异常了。 
tcp_max_tw_buckets 能帮你降低这种情况的发生概率,争取补救时间。
学习来源: https://www.jianshu.com/p/b7e991be0909

我这边理解就类似于 JVM里面GC over limited的处理机制相仿. 
能够快速重用部分端口, 避免无端口可用无法建立新连接. 

参数二

  • net.ipv4.ip_local_port_range
这个参数 云计算和CentOS的默认值出奇的一致: 
32768    60999
第一个参数代表随机端口的下限
第二个参数代表建立TCP连接时端口的上限
C10K甚至是C100K的很多优化里面都是需要改这个参数的

TCP是有四元素 local_ip local_port remote_ip remote_port 
来唯一确认一个TCP连接的.
理论上一个TCP的LISTEN的监听端口可以建立很多个TCP连接的. 

参数三

  • net.ipv4.tcp_tw_reuse
个人感觉这个参数其实是存在一定风险的
可能会导致错误的TCP连接.
但是理论上 linux内核有TCP状态的检验还有TCP的序列号进行串行化处理
几乎零可能性的出现严重的数据问题. 

一个简单的进行验证的脚本

echo "443:" `netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 884 |grep -v 1521 |grep -v tcp6 |grep -v :22 |grep :443 |awk '{++state[$6]} END {for(key in state) print key,state[key]}'`
echo "5000:" `netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 884 |grep -v 1521 |grep -v tcp6 |grep -v :22 |grep :5000 |awk '{++state[$6]} END {for(key in state) print key,state[key]}'`
echo "5200:" `netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 884 |grep -v 1521 |grep -v tcp6 |grep -v :22 |grep :520 |awk '{++state[$6]} END {for(key in state) print key,state[key]}'`

可以定量分析不同端口的连接信息. 

内核参数的验证-1

修改内核参数
sysctl -w "net.ipv4.tcp_max_tw_buckets=50000"
登录系统进行分析查看time wait的TCP数量. 
[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 :5200
tcp        0      0 10.110.139.230:5200     10.110.136.50:57506     TIME_WAIT   -                    timewait (0.71/0/0)
tcp        0      0 10.110.139.230:5200     10.110.136.50:37506     TIME_WAIT   -                    timewait (57.65/0/0)
tcp        0      0 10.110.139.230:5200     10.110.136.50:37604     TIME_WAIT   -                    timewait (57.94/0/0)
tcp        0      0 10.110.139.230:5200     10.110.136.50:57490     TIME_WAIT   -                    timewait (0.70/0/0)
tcp        0      0 10.110.139.230:5200     10.110.136.50:37708     TIME_WAIT   -                    timewait (58.02/0/0)
tcp        0      0 10.110.139.230:5200     10.110.136.50:37696     TIME_WAIT   -                    timewait (58.02/0/0)
tcp        0      0 10.110.139.230:5200     10.110.136.50:37630     TIME_WAIT   -                    timewait (57.96/0/0)
tcp        0      0 10.110.139.230:5200     10.110.136.50:57538     TIME_WAIT   -                    timewait (0.75/0/0)

发现会有40条 time wait的 tcp连接. 
最后一列是等待终结的time wait的tcp连接 等到所有的连接都停止后再次修改内核参数
sysctl -w "net.ipv4.tcp_max_tw_buckets=10"
# 注意我这种修改仅是验证问题, 没有生产适用性. 
# 注意每次测试至少要等待60秒等待之前的tcp连接终结. 

再次执行登录简单测试,效果为:
[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 :5200
tcp        0      0 10.110.139.230:5200     10.110.136.50:59150     ESTABLISHED 716321/nginx: worke  off (0.00/0/0)

发现没有再次生成 time wait的连接
# 注意这个参数是整个操作系统所有的time_wait的连接数 不单纯是一个端口的. 所以10个肯定是不够用的. 

内核参数验证-2

直接修改参数: 
sysctl -w "net.ipv4.ip_local_port_range=3000 4000"
# 注意结果可以与内核参数验证-1 里面的结果进行对照. 
# 注意需要修改回 bucket的数据避免测试失效. 
[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.139.230
tcp        0      0 10.110.136.50:3508      10.110.139.230:5200     ESTABLISHED 3872246/nginx: work  off (0.00/0/0)
tcp        0      0 10.110.136.50:31062     10.110.139.230:5200     TIME_WAIT   -                    timewait (51.06/0/0)
注意可以再次修改一下 端口信息再次进行验证
sysctl -w "net.ipv4.ip_local_port_range=5000 5100"
测试结果为: 
[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.139.230
tcp        0      0 10.110.136.50:5096      10.110.139.230:5200     ESTABLISHED 3872246/nginx: work  off (0.00/0/0)
tcp        0      0 10.110.136.50:3508      10.110.139.230:5200     TIME_WAIT   -                    timewait (55.94/0/0)
仅仅是执行了一下刷新动作. 
就会看到上面一个3508 local 的本地端口开始进入time_wait状态
新建立的连接的local_port 就是 5096  
sysctl -w "net.ipv4.ip_local_port_range=5000 5050"
效果也是完全一致符合猜测. 
[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.139.230
tcp        0      0 10.110.136.50:5096      10.110.139.230:5200     TIME_WAIT   -                    timewait (56.10/0/0)
tcp        0      0 10.110.136.50:5008      10.110.139.230:5200     ESTABLISHED 3872246/nginx: work  off (0.00/0/0)

# 需要注意 修改改端口仅影响 第四列的本地连接信息, 不会影响第五列的外部连接信息
# 外部的需要是一个 监听端口为主. 

与TCP内核参数的简单验证相似的内容:

TCP内核参数的简单验证

前言 春节假期时学习了下内核参数与nginx的调优 最近因为同事遇到问题一直没有解,自己利用晚上时间再次进行验证. 这里将几个参数的理解和验证结果简单总结一下. 希望能够在学习的过程中将问题解决掉. 其实很后悔没有好好学习代码.现在很多问题都已经到了瓶颈期 无法深入的研究下去. 参数一 net.ip

TCP内核参数与Nginx配置的简单测试

背景 昨天晚上整理了下几个TCP内核的参数. 学习到了一点内核参数的影响. 但是因为时间比较晚了没有继续钻研与nginx的关系 今天想着继续研究一下TCP的部分参数与nginx的关系 每个系统都不一样. 结果可能跟内核版本和内核参数强相关. 我这里用的是基于ARM的银河麒麟 还有基于x86的Open

[转帖]一个简单的内核参数优化

一个简单的内核参数优化 作者:孤风孤影 https://www.bilibili.com/read/cv15200947/ 出处:bilibili net.ipv4.tcp_keepalive_time=600 #此参数表示TCP发送keepalive探测消息的间隔时间(秒) net.ipv4.tc

【转帖】TCP内核参数

https://www.cnblogs.com/chia/p/7799231.html tcp_syn_retries :INTEGER默认值是5对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言

[转帖]Linux内核参数net.ipv4.ip_local_port_range对服务器连接数影响的正确解释

首先明确一下该参数的意义:net.ipv4.ip_local_port_range表示本机作为客户端对外发起tcp/udp连接时所能使用的临时端口范围。 对于TCP连接,本机所能发起的tcp连接数受四元组(源地址*源端口*目标地址*目标端口)限制。 而对于UDP连接,本机所能发起的udp连接数则受二

[转帖]linux中内核的一个不错的参数somaxconn

最近发现很多内核优化参数都记不住了,写下文章来备记,方便以后查看. 编辑 /etc/sysctl.conf 文件,在里面加入如下内容:(有注释) #设置系统对最大跟踪的TCP连接数的限制(CentOS 5.6无此参数) net.ipv4.ip_conntrack_max = 25000000 #最大

[转帖]Linux内核调优

Linux服务器调优 转载于:https://blog.csdn.net/largetalk/article/details/16863689 安装一台新的Linux服务器之后都要做些配置调整工作,优化一下系统,以前零零碎碎记录过一些,这里集中整理一下。 Linux内核参数 net.ipv4.tcp

[转帖]Linux内核 TCP/IP、Socket参数调优

文章系转载,便于整理和分类,原文地址:http://www.360doc.com/content/14/0606/16/3300331_384326124.shtml Doc1: /proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sy

[转帖]已经被废弃的 tcp_tw_recycle

最近准备自己动手部署测试kubernetes集群,注备写一个 hands on 的手册。突发奇想将 centos 原有的内核从3.10更新到了4.14版本,并执行一些常规的优化操作。没有想到在修改了 sysctl.conf 里面的一些参数,希望能对新的 kubernetes 性能有所帮助。 当我在其

[转帖]容器化 TCP Socket 缓存、接收窗口参数

https://blog.mygraphql.com/zh/notes/low-tec/network/tcp-mem/ 最近需要支持一个单 POD 的 TCP 连接数上 10k 的基础服务(Cassandra)的容器化。需要对其使用的资源(特别是TCP缓存内存),以及对相邻 Pod(同一 work