linux内核参数
Linux内核参数
提纲
1、linux内核参数概述
2、linux内核参数的修改方法
3、典型的linux内核参数
4、limit命令的作用
1、linux内核参数概述
linux内核参数是xxx。
2、linux内核参数的修改方法
内核参数修改主要涉及到一个命令,那就是sysctl命令。这个命令可以查看内核参数,动态修改内核参数,永久修改内核参数。
查看内核参数的方法:
sysctl -a //查看所有内核参数
修改内核参数的方法,两种:
- 第一种,是通过sysctl命令来修改内核参数
sysctl -w 参数名=值,这种方法可以动态写入内核参数。这种方式修改后的参数,在重启系统之后,就不会再起作用。
- 第二种,还是通过sysctl命令来修改
将要改写的内核参数写入/etc/sysctl.conf文件,然后执行sysctl -p命令,可以使内核参数生效。这种方式修改参数后,重启系统,参数还会起作用,因为系统重启时sysctl -p命令会被执行。
sysctl -p 可以加一个文件名作为参数,要修改参数可以写入文件,比如写入args.conf文件中,然后在命令行中执行sysctl -p args.conf。这样,args.conf中的内核参数就可以设置给内核。
不过如果sysctl -p命令不加任何参数,默认执行,会将/etc/sysctl.conf文件中的参数设置给内核。
3、典型的linux内核参数
一般调整linux内核参数,是为了让服务器支持更大的并发连接数,为了达到这个目标,需要调整的典型参数如下:
高并发的影响因素除了硬件,Web服务器外,操作系统对TCP相关参数的配置也会对其有很大影响。
默认情况下Linux内核参数是考虑通用场景的(如ulimits -n 限定为1024),这会对高并发访问下的Web服务器会造成影响。
所以一般需要对内核参数进行调整,来使Web服务器(如Nginx)支持更高的并发量。
-
fs.file-max=1024 这个参数表示 当前整个linux操作系统 允许同时打开的最大文件句柄数,对应于ulimits -n的设置。我们知道Linux下一切皆文件。那么建立一个TCP连接其实对应的也是一个sock文件。该值过小,将极大影响并发连接数。默认应该是1024。
-
fs.nr_open 这个参数表示 单个进程可以打开的最大文件句柄数量,通过fs.nr_open来进行修改。linux系统为了安全对全部进程可以打开的文件句柄数量进行了限制。文件句柄数量限制有三个级别:1、fs.file-max指的是 整个操作系统 允许打开的最大文件句柄数量;2、nofile,在/etc/security/limits.conf中定义,之后通过ulimit -n命令去生效,这个参数指定的是一个用户的全部进程可以打开的文件句柄的最大数量;3、fs.nr_open 这个参数是单个进程可以打开的最大文件句柄数量。
-
net.ipv4.tcp_tw_reuse=1 这个参数表示是否允许将TIME_WAIT状态的socket重新用于新的TCP连接,这对某种场景下用于客户端的服务器也是很有意义的。
-
net.ipv4.tcp_keepalive_time=1200 这个参数表示TCP发送keepalive保活心跳的频率(注意与HTTP keepalive不同,不要混淆了)。设置小一点,可以更快地清理无效的连接,以避免资源浪费。
-
net.ipv4.tcp_max_tw_buckets=18000 表示允许处于TIME_WAIT状态套接字的最大数量,默认18000。可以根据情况适当调小点,以避免资源浪费。
-
net.ipv4.tcp_max_syn_backlog=128。TCP半连接队列的最大长度。该值是可以调大,以避免因为Nginx来不及accept新连接(这里的新连接指的是半连接,而不是全连接)而导致新连接被内核丢弃的情况。
什么是半连接呢?
linux有2个连接队列,一个就是在握手过程中的连接所组成的队列,这个连接队列被称为半连接队列,指的是处于第二次握手至第三次握手期间的连接。
另一个就是握手成功之后连接所组成的队列,这个连接被称为完全连接,存放完全连接的队列被称为完全连接队列,三次握手成功后,服务端程序accept之前。
网络TCP连接的建立过程一般是这样的,详见参考资料10:
收到客户端的syn请求 ->将这个请求放入syn_table中去->服务器端回复syn-ack->收到客户端的ack->放入accept queue中。
1、客户端发送syn请求,服务端收到syn请求,将这个连接放入syn_table中去,这个syn_table中的连接就是半连接。这个过程也被称为第一次握手。
2、服务端对syn请求回复一个syn-ack给客户端,服务端为这次连接分配资源。这也被称为第二次握手。
3、客户端针对syn-ack给服务端发送一个ack,客户端为这次连接分配资源,服务端收到这个ack包,然后将连接放入accept_queue中去,这时候的连接被称为完全连接。这一步也被称为第三次握手。
通过以上三步,client和server之间的这个tcp连接就建立起来了。
-
net.core.somaxconn=128 每一个端口最大的监听队列的长度(完全连接)。这个就是平常编码时listen(port,backlog)中的backlog的上限值。
这里有一个解释:
对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后,我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了.
每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度,与如下两方面有关:
- somaxconn参数.
- 使用该端口的程序中listen()函数.
关于somaxconn参数:
定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128.限制了每个端口接收新tcp连接侦听队列的大小。
对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。
服务进程会自己限制侦听队列的大小(例如 sendmail(8) 或者 Apache),常常在它们的配置文件中有设置队列大小的选项。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。 -
net.ipv4.tcp_rmem 每个tcp连接的读操作需要的内存数量,可以理解为读buffer大小
-
net.ipv4.tcp_wmem 每个tcp连接的写操作需要的内存数量,可以理解为写buffer大小
-
net.ipv4.ip_local_port_range = 5000 65000 这个参数是一个linux系统能够给本地tcp/udp的端口范围。可以理解为系统中的程序会随机选择这个范围内的端口,来连接到目的端口(目的端口当然是用户指定的)。
The /proc/sys/net/ipv4/ip_local_port_range defines the local port range <br />
that is used by TCP and UDP traffic to choose the local port. <br />
You will see in the parameters of this file two numbers: <br />
The first number is the first local port allowed for TCP and UDP traffic on the server, <br />
the second is the last local port number. <br />
For high-usage systems you may change its default parameters to 32768-61000 -first-last.
4、ulimits命令的作用
参考资料:
1、https://mp.weixin.qq.com/s?src=11×tamp=1630465889&ver=3287&signature=Ubk0e0ovaGt3kumoqqQvyY2ktzIhtbjHsBGeRl1aCgEcmRELFNeiIJ8vPPniBF-0NI-8kUJdlXzzMRM73SeO2HoH8EDrhgWAa9lhjjs50q3DRz47gtizq6X9Vq&new=1
2、https://blog.csdn.net/yueguanghaidao/article/details/47144247
3、https://blog.csdn.net/russle/article/details/107445320
4、https://www.cnblogs.com/solohac/p/4154180.html?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com
5、linux内核参数配置,https://www.cnblogs.com/bodhitree/p/5756719.html,(这一篇很详细,是主要参考资料)
6、https://blog.51cto.com/825536458/1708052,讲了linux内核优化,还讲解了ulimit的两个用法
下面两篇文章对ulimit有详细介绍:
7、https://mp.weixin.qq.com/s?__biz=MzI1MzY3NTE1NQ==&mid=2247484670&idx=1&sn=9fcc29ac7a7bc47d43076f671c82f758&scene=21#wechat_redirect****
8、https://mp.weixin.qq.com/s?src=11×tamp=1630545415&ver=3289&signature=29vrxwHm5W8LbUcXmZQ75hLgg96VBGJnJUjeppGidD983vM26I56zQuLmBvc29vL3OadI*qSActiSnUOvdbAog4mqzB6ywkkFFFTHCAgAzktqudEthf5gmgjFqTuAd&new=1
9、内核参数优化,https://www.cnblogs.com/backups/p/linux_kernel_parameters.html
10、tcp三次握手和四次挥手,https://mp.weixin.qq.com/s?__biz=MzA5MDEzOTc5MQ%3D%3D&mid=2247484015&idx=1&sn=e48cff4d04ccfb92074ad1adcbf2d320&scene=45#wechat_redirect
11、三次握手和四次挥手,https://www.zhihu.com/question/271701044
12、linux内核安全调优和参数调优,https://mp.weixin.qq.com/s?src=11×tamp=1630630037&ver=3291&signature=Izg6RqX8GRiwqmVhKpDLMZkXGK5bW22ijtgqWgZhF4Un6YKmcUT4oh6z0yUdWuS2tVoshulV7iGbKStLYzU9BRw3YjqpvC3Mv1C5P-cclvwOXvcTESbkGpXIklsLoxhK&new=1
13、搜狗百科中关于四次挥手的描述也是很有参考意义的,https://baike.sogou.com/v99663686.htm?fromTitle=四次挥手
14、三次握手和四次挥手,尤其是挥手很有意义,https://blog.csdn.net/weixin_33765959/article/details/111892832
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2018-09-01 tomcat的配置文件server.conf中的元素的理解