CentOS7 内核版本3.10 内核参数调优参考

查看网络上大部分内核参数文档,整理出如下内容,如有错误请指正,过程很辛苦,转载请附上原地址。

前言

常用的Linux内核参数,具体优化值要参考应用场景。

通过/var/log/message查看系统日志或dmesg命令查看开机信息,对相应信息做系统参数调优;还可根据TCP状态进行TCP相关参数调优。

以CentOS7,内核版本3.10的服务器为例。

针对系统

配置在/etc/sysctl.conf中,可通过命令sysctl -a查看内核参数。

全局参数

文件句柄

fs.file-max

表示系统级别的能够打开的文件句柄的数量,直接限制最大并发连接数。是对整个系统的限制,并不是针对用户的。

系统当前打开的文件描述符个数:cat /proc/sys/fs/file-nr。

file-nr中的三个值表示已分配的文件句柄数、已分配但未使用的文件句柄数(Linux 2.6总是将0报告为可用文件句柄数)以及最大文件句柄数(等于file-max)。

默认值:在系统启动时,根据内存计算得出。

参考值:一般为内存大小(KB)的10%来计算:grep -r MemTotal /proc/meminfo | awk  '{printf("%d",$2/10)}'

fs.nr_open

单进程能够打开的最大文件句柄数。

使用cat /proc/sys/fs/nr_open查看。

默认值:1048576(1024*1024)

参考值:默认值足够使用,根据实际高并发连接数修改。

net.core.somaxconn

调节系统同时发起的TCP连接数。高并发情况下,该值越小,越容易出现超时情况。

TCP 建立连接时要经过3次握手。对于服务器而言,一个完整的连接建立过程,服务器会经历2种 TCP 状态:SYN_REVD,ESTABELLISHED。

一个存放SYN_REVD状态的队列(半连接队列);一个存放ESTABELLISHED状态的队列(全连接队列)。后端应用程序会从全连接队列获取请求。

如果服务器需要处理高并发,需要修改这2个队列大小,也就是需要同时设置应用层的backlog及内核参数somaxconntcp_max_syn_backlog来满足高并发要求。

半连接队列长度 = min(backlog, net.core.somaxconn, tcp_max_syn_backlog)

全连接队列长度 = min(backlog, net.core.somaxconn)

backlog

服务器端TCP的ESTABELLISHED状态对应的全连接队列长度。

在Tomcat里是Connector中的acceptCount(默认值为128)。

在Nginx(默认值为511)里是

server{

    listen  8080  default_server  backlog=1024;

}

backlog <= somaxconn

查看一个程序最终生效的accept队列的大小:ss -tnl输出结果中当处于listen状态时Send-Q的值即为accept队列大小。

somaxconn和tcp_max_syn_backlog区别:

tcp_max_syn_backlog是半连接上限,例如场地容纳多少人,net.ipv4.tcp_syncookies = 1时该参数无效;

somaxconn是全连接上限,例如场地仅有多少个座位。

默认值:128

参考值:262144

相关技术参考:

https://www.cnblogs.com/grey-wolf/p/10999342.html

https://jaminzhang.github.io/linux/understand-Linux-backlog-and-somaxconn-kernel-arguments/

https://blog.51cto.com/wujianwei/2104779

套接字缓存

net.core.netdev_max_backlog

当每个网络接口接受数据包的速率比内核处理速率快时,允许发送到队列的数据包的最大数。

内核从网卡收到数据包后,交由协议栈(如IP、TCP)处理之前的缓冲队列。每个CPU核都有一个backlog队列,当协议栈处理速度满足不了接收包速率时会发生丢包。

查看数据处理情况:cat /proc/net/softnet_stat

每一行代表一个CPU。

第一列为该CPU所接收到的所有数据包。

第二列为该CPU缺省queue满的时候,所删除的包的个数。如果该列有数据,则通过net.core.netdev_max_backlog调整。

第三列表示time_squeeze,一次的软中断的触发还不能处理完目前已经接收的数据,因而要设置下轮软中断,time_squeeze 就表示设置的次数。

第四至八列固定为0,没有意义。

第九列表示发送数据包时,对应的队列被锁住的次数。

最后一列,该CPU向其它CPU发送的ipi中断个数。

默认值:1000

参考值:262144

相关技术参考:

https://blog.csdn.net/zgy666/article/details/104391160

https://www.lmlphp.com/user/57878/article/item/707848/

net.core.rmem_default

内核接收套接字缓冲区大小的缺省值(以字节为单位),包括TCP、UDP等。

应用程序通过socket系统调用和远程主机进行通讯,每一个socket都有一个读写缓冲区。

读缓冲区保存了远程主机发送过来的数据,如果读缓冲区已满,则数据会被丢弃。

查看socket状态:cat /proc/net/sockstat,根据所有套接字使用量配置。

sockets: used:已使用的所有协议套接字总量

TCP: inuse:正在使用(正在侦听)的TCP套接字数量。其值 <= netstat -lnt | grep ^tcp | wc -l

TCP: orphan:无主(不属于任何进程)的TCP连接数(无用、待销毁的TCP socket数)

TCP: tw:等待关闭的TCP连接数。其值等于netstat -ant | grep TIME_WAIT | wc -l

TCP: alloc:已分配的TCP套接字数量。其值等于netstat -ant | grep ^tcp | wc -l

TCP: mem:套接字缓冲区使用量,单位未查到。

UDP: inuse:正在使用的UDP套接字数量

FRAG:使用的IP段数量

默认值:212992

参考值:需要根据业务逻辑和实际的硬件成本来综合考虑。

相关技术参考:

https://zhuanlan.zhihu.com/p/426388054

https://www.cnblogs.com/zengkefu/p/5749009.html

http://www.2cto.com/os/201307/230154.html

https://www.sudops.com/linux-kernel-tcp-ip-sysctl-optimize.html

net.core.wmem_default

内核发送套接字缓冲区大小的缺省值(以字节为单位)。

写缓冲期保存了要发送到远程主机的数据,如果写缓冲区已满,则应用程序在写入数据时会阻塞。

wmem_default高于tcp_wmem。

默认值:212992

参考值:同rmem_default

net.core.rmem_max

内核接收套接字缓冲区大小的最大值(以字节为单位)。

通过dmesg命令查看,发现大量TCP: too many of orphaned sockets或out of socket memory错误或提示consider tuning tcp_mem时,需要调优。

cat /proc/net/sockstat 查看套接字使用情况,根据所有套接字使用量配置。

默认值:212992

参考值:需要根据业务逻辑和实际的硬件成本来综合考虑。

net.core.wmem_max

内核发送套接字缓冲区大小的最大值(以字节为单位)。用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。

默认值:212992

参考值:同rmem_max。

TCP参数

TCP套接字缓存

net.ipv4.tcp_mem

系统全局参数,所有TCP socket的buffer配置(以内存页为单位,页大小:getconf PAGE_SIZE)。

假设一个page大小是4K,设置的page数 * 4k即是内存数值。

如net.ipv4.tcp_mem = 378864 505153 757728,那么对应的内存分配就是:1480M 1973M 2960M。

通过dmesg命令查看,发现大量TCP: too many of orphaned sockets或out of socket memory错误或提示consider tuning tcp_mem时,需要调优。

根据cat /proc/net/sockstat(套接字状态)和netstat -an|awk '{print $NF}' | sort | uniq -c | sort -nr | head -10TCP连接状态)结果,调整相应的值。

调整tcp前,必须调整core,不能超出core的限制

low:内存使用的下限。当TCP使用了低于该值时,TCP不会考虑释放内存。

pressure:内存压力模式开始对缓冲区使用应用压力的上限。当TCP使用了超过该值时,TCP试图稳定内存使用。

high:内存上限。如果超过该值,系统拒绝分配socket,抛出“out of socket memory”。

默认值:根据机器自身内存情况进行分配。

参考值:

pressure = 每个连接占用大小 * 最大并发量 / 页大小

high = pressure * 1.5

相关技术参考:

https://www.cnblogs.com/51core/articles/13683820.html

https://www.cnblogs.com/huanxiyun/articles/7521694.html

net.ipv4.tcp_wmem

TCP发送套接字缓存的内存最小值、默认值、最大值(以字节为单位),缓存应用程序的数据,被确认的数据会从发送缓冲区删除掉。

最小值:为TCP socket预留用于发送缓冲的内存最小值。

默认值:为TCP socket预留用于发送缓冲的内存数量,该值会覆盖net.core.wmem_default,一般要低于net.core.wmem_default。

最大值:用于TCP socket发送缓冲的内存最大值,不会覆盖net.core.wmem_max

默认值:4096 16384 [介于64K和4MB之间,具体取决于RAM大小]

参考值:

默认值 = 最大页面大小 * 最大并发量

最大值(字节) = 带宽(Mebibites) * 延时(s) / 8 * 2^20,如带宽为1.5M,延时500ms,则tcp_wmem = 1.5 * 0.5 / 8 * 2^20 = 1048576

或者最大值 = 默认值 * 2

相关技术参考:

http://www.2cto.com/os/201307/230154.html

net.ipv4.tcp_rmem

TCP接收套接字缓存的内存最小值、默认值、最大值(以字节为单位),缓存从对端接收的数据,后续会被应用程序读取。

默认值会覆盖net.core.rmem_default。

最大值最好是默认值的两倍,不会覆盖net.core.rmem_max。

默认值:4096 87380 [介于87380字节和6MB之间,取决RAM大小]

参考值:同tcp_wmem

TCP建立连接

net.ipv4.tcp_max_syn_backlog

记录尚未收到客户端确认信息的连接请求的最大值(三次握手建立阶段接受SYN请求,半连接队列)。设置大一些可使出现Nginx繁忙来不及接收新连接时,Linux不至于丢失客户端发起的链接请求。

net.ipv4.tcp_syncookies = 1时该参数无效。

默认值:1024

参考值:262144

相关技术参考:

https://www.cnblogs.com/lpfuture/p/12090045.html

net.ipv4.tcp_syn_retries

设置内核放弃建立连接之前向客户端发送SYN包的数据,即客户端发起SYN连接,如果超时会进行重传的次数。

默认值:6,不应高于127

参考值:对于大负载而物理通信良好的网络而言,可修改为2。

相关技术参考:

https://blog.csdn.net/bytxl/article/details/46437363

net.ipv4.tcp_syncookies

当半连接的请求数量超过了tcp_max_syn_backlog时,内核就会启用SYN cookie机制,不再把半连接请求放到队列里,而是用SYN cookie来检验,可防范部分 SYN 攻击。

但开启后会使用 SHA1 验证 Cookies,理论上会增大 CPU 使用率。

该选项千万不能用于那些没有收到攻击的高负载服务器,如果在日志中出现syn flood消息,但是调查发现没有收到syn flood攻击,而是合法用户的连接负载过高的原因,你应该调整以下参数来提高服务器性能:tcp_max_syn_backlog、tcp_synack_retries、tcp_abort_on_overflow。

默认值:0

参考值:1

net.ipv4.tcp_synack_retries

设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数据(三次握手中的第二次握手)。当为1时,内核在放弃连接之前再发送一次SYN+ACK包。

默认值:5

参考值:1,根据tcp_syn_retries决定该值。

TCP关闭连接

net.ipv4.tcp_max_orphans

设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上。为了防止简单的DOS攻击。如果超过这个数字,孤立链接将立即被复位并输出警告信息。

主动关闭端发送了FIN后转到FIN_WAIT_1,这时TCP连接就不属于某个进程了。每个孤儿(orphan)套接字最多能吃掉64K不可交互的内存。

默认值:8192

参考值:根据cat /proc/net/sockstatorphan的值,来判断是否需要调整。

相关技术参考:

https://www.sudops.com/debian-kernel-socket-memory.html

net.ipv4.tcp_orphan_retries

控制主动关闭端发送FIN,没有收到回应,重复发送FIN的次数。由于发送了FIN,处于FIN_WAIT_1状态。

如果设置为0,则socket会永远停留在FIN_WAIT_1这个状态。

默认值:8

参考值:如果系统是负载很大的web服务器﹐那么也许需要降低该值,参考值为3

net.ipv4.tcp_fin_timeout

如果socket由服务端要求关闭,则该参数决定了保持在FIN-WAIT-2状态的时间,即指定孤儿连接在内核中生存的时间。

默认值:60

参考值:30

net.ipv4.tcp_max_tw_buckets

timewait的数量,最大值为262144。如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。

建议减小,避免TIME_WAIT状态过多消耗整个服务器的资源,但也不能太小,跟后端的处理速度有关,如果速度快可以小,速度慢则适当加大,否则高负载会有请求无法响应或非常慢。

默认值:180000

参考值:6000

net.ipv4.tcp_tw_recycle

TCP连接中TIME-WAIT的sockets快速回收功能。同时开启的话,缓存每个连接最新的时间戳,若后续的请求中时间戳小于缓存的时间戳时,该请求会被视为无效,导致数据包会被丢弃。

默认值:0

参考值:0,需要结合配置net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_tw_reuse

允许将TIME-WAIT状态的sockets重新用于新的TCP连接,Nginx反向代理服务器(服务器即做客户端,也做server端时)

默认值:0

参考值:1,需要结合配置net.ipv4.tcp_timestamps = 1

net.ipv4.tcp_timestamps

设置时间戳,避免序列号的卷绕。

默认值:1

参考值:结合tcp_tw_recycle和tcp_tw_reuse使用。

net.ipv4.tcp_retries1

放弃回应一个TCP连接请求前,需要进行多少次重试。

默认值:3

参考值:3

net.ipv4.tcp_retries2

在丢弃激活的TCP连接(已建立通讯状态)之前,需要进行多少次重试。

默认值:15

参考值:5

TCP其他参数

net.ipv4.ip_local_port_range

放大本地端口范围。

默认值:32768 61000

参考值:15000 65000

net.ipv4.tcp_keepalive_*

由3个参数共同控制,表示某个TCP连接在空闲7200秒后,内核才发起探测,探测9次(每次75秒)不成功,内核才发送RST。清理无效链接。

默认值:

net.ipv4.tcp_keepalive_intvl = 75

net.ipv4.tcp_keepalive_probes = 9

net.ipv4.tcp_keepalive_time = 7200

参考值:

net.ipv4.tcp_keepalive_intvl = 15

net.ipv4.tcp_keepalive_probes = 3

net.ipv4.tcp_keepalive_time = 600 

针对用户(进程)

文件描述符

表示任何一个用户可以打开的最大的文件描述符数量。

使用ulimit -n查看的是soft nofile值;使用ulimit -Hn查看的是hard nofile值。

默认值:1024

参考值:hard值不能大于/proc/sys/fs/nr_opensoft值不高于hard

* soft nofile 65535

* hard nofile 65535

相关技术参考:

https://www.jianshu.com/p/47336fcd22da

用户进程

表示任何一个用户可以打开的最大的进程数。

参考值:

* soft nproc 65535

* hard nproc 65535

配置方式

修改/proc下内核参数文件内容

由于内核随时可能更改这些文件中的任意一个,因此不能使用编辑器进行编辑,而是使用echo命令输出重定向至 /proc 下所选定的文件中。

但是重启系统后,该参数又恢复成默认值。

#将 timeout_timewait 参数设置为30秒:
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

修改/etc/sysctl.conf文件

修改针对系统的内核参数,把参数添加或修改到/etc/sysctl.conf中,然后执行/sbin/sysctl -p使参数生效。

修改/etc/security/limits.conf文件

修改针对用户的内核参数,把参数添加或修改到/etc/security/limits.conf中,重新登录即生效。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值