Linux内核常见参数详解:

2020年6月29日

一、修改最大进程数

系统允许创建的最大进程数量即是max user processes 这个参数。 我们可以使用 ulimit -u 65535 修改max user processes的值,但是只能在当前终端的这个session里面生效,重新登录后仍然是使用系统默认值。

正确的一次性修改是在/etc/security/limits.d/90-nproc.conf文件中, 该文件修改如下:

  1. * soft nproc 65535
  2. root soft nproc unlimited

*代表任意用户,也可以指定某一个用户,如root不限制

二、修改文件最大打开数

大家知道linux默认打开的文件数是1024,而实际生产环境中,服务器使用充分的情况下,该值肯定是不够用,往往有时会报too many open files

正确的一次性修改是在/etc/security/limits.conf,改文件修改如下:

  1. * soft nofile 327680
  2. * hard nofile 327680

三、系统内核修改

系统优化是在/etc/sysctl.conf中

  • net.core.somaxconn

net.core.somaxconn是Linux中的一个kernel参数,表示socket监听(listen)的backlog上限。什么是backlog呢?backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。

我们需要在sysctl.conf中增加如下:

net.core.somaxconn = 32786
  • net.ipv4.tcp_tw_reuse

开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认是0,表示关闭

我们需要在sysctl.conf中增加如下:

net.ipv4.tcp_tw_reuse = 1
  • net.ipv4.tcp_tw_recycle

开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭

我们需要在sysctl.conf中增加如下:

net.ipv4.tcp_tw_recycle=1
  • net.ipv4.tcp_fin_timeout

对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。

我们需要在sysctl.conf中增加如下:

net.ipv4.tcp_fin_timeout = 30
  • net.ipv4.tcp_max_orphans

最大孤儿套接字(orphan sockets)数,单位是个,当cat /proc/net/sockstat看到的orphans数量达到net.ipv4.tcp_max_orphans的约一半时,就会报:Out of socket memory

我们需要在sysctl.conf中增加如下:

net.ipv4.tcp_max_orphans = 327680
  • fs.file-max

file-max是设置 系统所有进程一共可以打开的文件数量

我们需要在sysctl.conf中增加如下:

fs.file-max = 6553560
  • net.ipv4.tcp_max_tw_buckets

系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息

我们需要在sysctl.conf中增加如下:

net.ipv4.tcp_max_tw_buckets = 200000
  • net.ipv4.tcp_syncookies

开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭

我们需要在sysctl.conf中增加如下:

net.ipv4.tcp_syncookies = 1
  • net.unix.max_dgram_qlen

swoole使用unix socket dgram来做进程间通信,如果请求量很大,需要调整此参数。系统默认为10,可以设置为100或者更大。 或者增加worker进程的数量,减少单个worker进程分配的请求量。 net.core.wmem_max 修改此参数增加socket缓存区的内存大小

我们需要在sysctl.conf中增加如下:

net.unix.max_dgram_qlen = 20000
  • net.ipv4.tcp_max_syn_backlog

端口最大 backlog 内核限制。此参数限制 服务端应用程序 可以设置的端口最大 backlog 值 (对应于端口的 syn_backlog 和 backlog 队列长度)。动机是在内存有限的服务器上限制/避免应用程序配置超大 backlog 值而耗尽内核内存。如果应用程序设置 backlog 大于此值,操作系统将自动将之限制到此值。

我们需要在sysctl.conf中增加如下:

net.ipv4.tcp_max_syn_backlog = 8192
  • net.ipv4.tcp_mem

内核分配给TCP连接的内存,单位是Page,1 Page = 4096 Bytes,该值一般是三个数值。

第一个数字表示,当 tcp 使用的 page 少于 196608 时,kernel 不对其进行任何的干预

第二个数字表示,当 tcp 使用了超过 262144 的 pages 时,kernel 会进入 “memory pressure” 压力模式

第三个数字表示,当 tcp 使用的 pages 超过 393216 时(相当于1.6GB内存),就会报:Out of socket memory

4G的虚拟机,我们需要在sysctl.conf中增加如下:

net.ipv4.tcp_mem = 196608       262144  393216

8G的虚拟机,我们需要在sysctl.conf中增加如下:

 net.ipv4.tcp_mem = 524288     699050  1048576

net.ipv4.ip_local_port_range

本地可用端口极限值,默认值是32768到61000,说明这台机器本地能向外连接61000-32768=28232个连接,高并发的服务明显就不够用.关于端口的文章,参考 : https://it.baiked.com/system/62.html

我们需要在sysctl.conf中增加如下:

net.ipv4.ip_local_port_range= 1024 65000

如果某个TCP连接在空闲30秒后,内核才发起 探查(probe);

如果探查(probe)5次(每次5秒 tcp_keepalive_intvl值)不成功,内核才彻底放弃,认为该连接已失效;

net.ipv4.tcp_keepalive_time = 30

net.ipv4.tcp_keepalive_probes = 5

net.ipv4.tcp_keepalive_intvl = 5

放弃回应一个TCP 连接请求前﹐需要进行N次重试;

net.ipv4.tcp_retries1 = 5

在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行N次重试;

net.ipv4.tcp_retries2 = 15

关闭TCP连接之前重试多少次;

net.ipv4.tcp_orphan_retries = 0

在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目);

net.ipv4.ip_conntrack_max = 655360

开启恶意icmp错误消息保护;tcp_syncookies

net.ipv4.icmp_ignore_bogus_error_responses = 1

该参数控制RFC 1323 时间戳与窗口缩放选项

net.ipv4.tcp_timestamps = 1

选择性应答(SACK)是 TCP的一项可选特性,可以提高某些网络中所有可用带宽的使用效率;

net.ipv4.tcp_sack = 1

打开FACK(Forward ACK) 拥塞避免和快速重传功能

net.ipv4.tcp_fack = 1

打开重传重组包功能,为0的时候关闭重传重组包功能;

net.ipv4.tcp_retrans_collapse = 1

对于一个新建连接,内核要发送多少个SYN 连接请求才决定放弃;

net.ipv4.tcp_syn_retries = 5

tcp_synack_retries显示或设定Linux在回应SYN要求时尝试多少次重新发送初始SYN,ACK封包后才决定放弃;

net.ipv4.tcp_synack_retries = 5

 

综上所述,sysctl.conf增加完成后,执行:

sysctl -p

 

没有评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注