前言

春节假期时学习了下内核参数与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内核参数的简单验证的更多相关文章

  1. TCP三次握手与Linux的TCP内核参数优化

    感谢各位技术大佬的资料分享,这里我把我理解的内容做一个整理 一:TCP的三次握手 1.TCP简述 TCP是一个面向连接的协议,在连接双方发送数据之前,首先需要建立一条连接.TCP建立连接可以简单称为: ...

  2. 修改tcp内核参数:somaxconn

    修改somaxconn 该内核参数默认值一般是128(定义了系统中每一个端口最大的监听队列的长度),对于负载很大的服务程序来说大大的不够.一般会将它修改为2048或者更大. echo 2048 > ...

  3. TCP内核参数

    tcp_syn_retries :INTEGER默认值是5对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃.不应该大于255,默认值是5,对应于180秒左右时间.(对于大负载而物理通信良 ...

  4. linux内核参数sysctl.conf,TCP握手ack,洪水攻击syn,超时关闭wait

    题记:优化Linux内核sysctl.conf参数来提高服务器并发处理能力 PS:在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题.要提 ...

  5. linux内核参数sysctl.conf,TCP握手ack,洪水攻击syn,超时关闭wait(转)

    http://www.xshell.net/linux/Linux_sysctl_conf.html 优化Linux内核sysctl.conf参数来提高服务器并发处理能力 Posted by 破冰 o ...

  6. Linux上TCP的几个内核参数调优

    Linux作为一个强大的操作系统,提供了一系列内核参数供我们进行调优.光TCP的调优参数就有50多个.在和线上问题斗智斗勇的过程中,笔者积累了一些在内网环境应该进行调优的参数.在此分享出来,希望对大家 ...

  7. tcp ip参数详解

    http://www.cnblogs.com/digdeep/p/4869010.html 1. TCP/IP模型 我们一般知道OSI的网络参考模型是分为7层:“应表会传网数物”——应用层,表示层,会 ...

  8. nginx的linux服务器内核参数调整【转】

    概述 由于默认的linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,让Nginx可以拥有更高的性能: 在优化内核时,可以做的事情很 ...

  9. 转载:Linux内核参数的优化(1.3.4)《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19615.html 由于默认的Linux内核参数考虑的是最通用的场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改 ...

  10. Linux(Centos )的网络内核参数优化来提高服务器并发处理能力【转】

    简介 提高服务器性能有很多方法,比如划分图片服务器,主从数据库服务器,和网站服务器在服务器.但是硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题 ...

随机推荐

  1. LiteOS内核源码分析:动态内存之Bestfit分配算法

    摘要:本文为大家剖析LiteOS动态内存模块bestfit算法的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要 ...

  2. 火山引擎 DataTester:如何用 A/B 测试做产品增长?

    技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着如今越来越高的获客成本,用户拉新变得不再容易:而且由于获客成本的增高,让用户留存也变得更加重要.同时,一个产品的使 ...

  3. flask自定义参数校验、序列化和反序列化

    项目总体结构 我的工厂函数factory.py from settings import setting from flask import Flask from models.models impo ...

  4. 面试官:分库分表后如何生成全局ID?

    分库分表后就不能使用自增 ID 来作为表的主键了,因为数据库自增 ID 只适用于单机环境,但如果是分布式环境,是将数据库进行分库.分表或数据库分片等操作时,那么数据库自增 ID 就会生成重复 ID,从 ...

  5. docker 容器关闭与springboot/springcloud client关闭

    问题的提出: 在docker容器中运行springboot.springcloud client,如何进行优雅的关闭,防止eureka出现: EMERGENCY! EUREKA MAY BE INCO ...

  6. 【3rd_Party】Cpp 单元测试框架-gtest

    Unit Test 和 gtest 介绍 单元测试( Unit Test ,模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确,通过编写单元测试可以在编码阶段发现程 ...

  7. VS遇到 error C4996问题的解决方法

    在编译c++程序时报如下错: error C4996: 'strncat': This function or variable may be unsafe. Consider using strnc ...

  8. JSP | application 对象详解 & 网站计数器实现

    原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 本篇学习自:C语言中文网,部分内容转载仅供学习使用. \[QAQ \] JSP applicat ...

  9. AcWing 第 13 场周赛  补题记录

    比赛链接:Here AcWing 3811. 排列 签到题, 先输出 \(n\) 然后输出 \(1\sim n -1\) 即可 AcWing 3812. 机器人走迷宫 不会什么特别高级的方法 qaq, ...

  10. redis管道技术pipeline一 ——api

    import java.io.UnsupportedEncodingException; import java.util.Set; import org.springframework.beans. ...