关于linux内核参数的调优,你需要知道

前言

Tcp/ip协议对网络编程的重要性,进行过网络开发的人员都知道,我们所编写的网络程序除了硬件,结构等限制,通过修改Tcp/ip内核参数也能得到很大的性能提升,下面就列举一些Tcp/ip内核参数,解释它们的含义并通过修改来它们来优化我们的网络程序,主要是针对高并发情况。

net.core.somaxconn

1.net.core.somaxconn是什么?

net.core.somaxconn是Linux中的一个kernel参数,表示socket监听(listen)的backlog上限。什么是backlog呢?backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。在Hadoop 1.0中,参数ipc.server.listen.queue.size控制了服务端socket的监听队列长度,即backlog长度,默认值是128。而Linux的参数net.core.somaxconn默认值同样为128。当服务端繁忙时,如NameNode或JobTracker,128是远远不够的。这样就需要增大backlog,例如我们的3000台集群就将ipc.server.listen.queue.size设成了32768,为了使得整个参数达到预期效果,同样需要将kernel参数net.core.somaxconn设成一个大于等于32768的值。

2.如何修改net.core.somaxconn

Linux中可以用sysctl来动态调整所有的kernel参数。所谓动态调整就是kernel参数值修改后即时生效。但是这个生效仅限于os层面,对于Hadoop来说,必须重启应用才能生效。 

命令 

# sysctl -a 

会显示所有的kernel参数及值。 

修改参数值的语法 

# sysctl -w net.core.somaxconn=32768 

以上命令将kernel参数net.core.somaxconn的值改成了32768。这样的改动虽然可以立即生效,但是重启机器后会恢复默认值。为了永久保留改动,需要用vi在/etc/sysctl.conf中增加一行 

net.core.somaxconn= 4000 

然后执行命令 

# sysctl -p

net.ipv4.tcp_max_syn_backlog 

tcp_max_syn_backlog是指定所能接受SYN同步包的最大客户端数量,即半连接上限;打个简单的比方: 

某某发布公告要邀请四海之内若干客人到场参加酒席。客人参加酒席分为两个步骤:

1、到大厅; 
2、找到座位(吃东西,比如糖果、饭菜、酒等)。

tcp_max_syn_backlog用于指定酒席现场面积允许容纳多少人进来;somaxconn用于指定有多少个座位。显然tcp_max_syn_backlog>=somaxconn。如果要前来的客人数量超过tcp_max_syn_backlog,那么多出来的人虽然会跟主任见面握手,但是要在门外等候;如果到大厅的客人数量大于somaxconn,那么多出来的客人就会没有位置坐(必须坐下才能吃东西),只能等待有人吃完有空位了才能吃东西。那么问题来了:

somaxconn是内核里的参数,listen函数有个参数backlog,如果在listen方法里面指定该参数大于somaxconn的值,重新编译并启动程序,服务端所能接收的完整的连接数上限是backlog呢还是somaxconn?答案很简单,listen方法指定的backlog是在用户态指定的,内核态的参数优先级高于用户态的参数,所以即使在listen方法里面指定backlog是一个大于somaxconn的值,socket在内核态运行时还会检查一次somaxconn,如果连接数超过somaxconn就会等待。就相当于主人指定了能有多少座位没用,客人到了现场,准备入座时,还要看酒店的客户经理判断能有多少个座位。  

net.ipv4.tcp_syncookies

修改此参数可以有效的防范syn flood攻击
原理:在Tcp服务器收到Tcp Syn包并返回Tcp Syn+ack包时,不专门分配一个数据区,而是根据这个Syn包计算出一个cookie值。在收到Tcp ack包时,Tcp服务器在根据那个cookie值检查这个Tcp ack包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。默认为0,1表示开启

net.ipv4.tcp_keepalive_time

Tcp keepalive心跳包机制,用于检测连接是否已断开,我们可以修改默认时间来控制心跳包发送的频率。keepalive一般是服务器对客户端进行发送查看客户端是否在线,因为服务器为客户端分配一定的资源,但是Tcp的keepalive机制很有争议,因为它们可耗费一定的带宽。

net.ipv4.tcp_tw_reuse

大量处于time_wait状态是很浪费资源的,它们占用server的描述符等。修改此参数,允许重用处于time_wait的socket。默认为0,1表示开启

net.ipv4.tcp_tw_recycle

这个也是针对time_wait状态的,该参数表示快速回收处于time_wait的socket。默认为0,1表示开启

net.ipv4.tcp_max_tw_buckets

所允许存在time_wait状态的最大数值,超过则立刻被清楚并且警告。

net.ipv4.ip_local_port_range

表示对外连接的端口范围。

结论

在没有调优的centOS6.5版本的服务器上,由于受到系统级别的限制,在该服务器上运行的服务端程序,在同一时间,最大只能接受128个客户端发起持久连接,并且只能处理128个客户端的数据通信。

技术交流群

为了大家更快速的学习知识,掌握技术,随时沟通问题,特组建了技术交流群,大家在群里可以分享自己的技术栈,抛出日常问题,群里会有很多大佬及时解答,这样我们就会结识很多志同道合的人,群里还有很多关于kubernetes/docker/devops/openstack/openshift/linux/IaaS/PaaS的免费文章和视频,长按下图可加我微信,备注运维或者k8s或者devops即可进群,让我们共同努力,向着美好的未来出发吧~~~

微信:luckylucky421302

微信公众号

长按如下指纹可关注公众号·


————————————————
版权声明:本文为CSDN博主「I_myours」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wwh578867817/article/details/46707389

你可能感兴趣的:(关于linux内核参数的调优,你需要知道)