OS部分关键参数整理

2022-05-12 10:53:37 浏览数 (1)

vm.swappiness = 0

默认0,表示不实用swap,改成1-100的情况表示使用swap,1表示尽量不使用,100尽量使用。不建议打开这个参数,大部分情况内存超了oom即可,swap属于温水煮青蛙。

vm.max_map_count = 65530

进程申请的最多虚拟内存数量,malloc、mmap等都会使用vma。(在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。)

net.ipv4.tcp_rmem = 4096    131072    6291456

socket使用的内存。第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)。

net.ipv4.tcp_tw_recycle = 0

4.2内核就没这个参数了,建议0。NAT环境会有连接异常,打开会增加一点重传,但是基本不影响吞吐量。

  • net.ipv4.tcp_tw_reuse = 0 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
  • net.ipv4.tcp_tw_recycle = 0 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
  • net.ipv4.tcp_fin_timeout = 60 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间

注意:

  • 像Windows 可以修改注册表修改2MSL 的值,linux 需要修改内核宏定义重新编译,tcp_fin_timeout 不是2MSL 而是Fin-WAIT-2状态超时时间.
  • tcp_tw_reuse 和 SO_REUSEADDR 是两个完全不同的东西
  • SO_REUSEADDR 允许同时绑定 127.0.0.1 和 0.0.0.0 同一个端口; SO_RESUSEPORT linux 3.7才支持,用于绑定相同ip:port,像nginx 那样 fork方式也能实现
  1. tw_reuse,tw_recycle 必须在客户端和服务端 timestamps 开启时才管用(默认打开)
  2. tw_reuse 只对客户端起作用,开启后客户端在1s内回收
  3. tw_recycle 对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况。内网状况比tw_reuse 稍快,公网尤其移动网络大多要比tw_reuse 慢,优点就是能够回收服务端的TIME_WAIT数量

对于客户端

1. 作为客户端因为有端口65535问题,TIME_OUT过多直接影响处理能力,打开tw_reuse 即可解决,不建议同时打开tw_recycle,帮助不大;

2. tw_reuse 帮助客户端1s完成连接回收,基本可实现单机6w/s短连接请求,需要再高就增加IP数量;

3. 如果内网压测场景,且客户端不需要接收连接,同时 tw_recycle 会有一点点好处;

4. 业务上也可以设计由服务端主动关闭连接。

对于服务端

1. 打开tw_reuse无效

2. 线上环境 tw_recycle 不建议打开

   服务器处于NAT 负载后,或者客户端处于NAT后(基本公司家庭网络基本都走NAT);

 公网服务打开就可能造成部分连接失败,内网的话到时可以视情况打开;

   像我所在公司对外服务都放在负载后面,负载会把 timestamp 都给清空,就算你打开也不起作用。

3. 服务器TIME_WAIT 高怎么办

   不像客户端有端口限制,处理大量TIME_WAIT Linux已经优化很好了,每个处于TIME_WAIT 状态下连接内存消耗很少,

而且也能通过tcp_max_tw_buckets = 262144 配置最大上限,现代机器一般也不缺这点内存。

    下面像我们一台每秒峰值1w请求的 http 短连接服务,长期处于tw_buckets 溢出状态,

tw_socket_TCP 占用70M, 因为业务简单服务占用CPU 200% 运行很稳定。

代码语言:javascript复制
slabtop

262230 251461  95%    0.25K  17482       15     69928K tw_sock_TCP

 ss -s
Total: 259 (kernel 494)
TCP:   262419 (estab 113, closed 262143, orphaned 156, synrecv 0, timewait 262143/0), ports 80

Transport Total     IP        IPv6
*         494       -         -        
RAW       1         1         0        
UDP       0         0         0        
TCP       276       276       0        
INET      277       277       0        
FRAG      0         0         0    

唯一不爽的就是:

系统日志中overflow 错误一直再刷屏,也许该buckets 调大一下了

TCP: time wait bucket table overflow TCP: time wait bucket table overflow TCP: time wait bucket table overflow TCP: time wait bucket table overflow TCP: time wait bucket table overflow

5. 业务上也可以设计由客户端主动关闭连接

原理分析

 1. MSL 由来

  发起连接关闭方回复最后一个fin 的ack,为避免对方ack 收不到、重发的或还在中间路由上的fin 把新连接给丢掉了,等个2MSL(linux 默认2min)。

  也就是连接有谁关闭的那一方有time_wait问题,被关那方无此问题。

2. reuse、recycle

     通过timestamp的递增性来区分是否新连接,新连接的timestamp更大,那么保证小的timestamp的 fin 不会fin掉新连接,不用等2MSL。

3. reuse

     通过timestamp 递增性,客户端、服务器能够处理outofbind fin包

4. recycle

    对于服务端,同一个src ip,可能会是NAT后很多机器,这些机器timestamp递增性无可保证,服务器会拒绝非递增请求连接。

kernel.core_pattern

kernel.core_pattern= pathto/core_%e_%u_%t_%s.%p         

kernel.sem

信号量, ipcs -l 或 -u 查看,每16个进程一组,每组信号量需要17个信号量。

kernel.sem = 4096 2147483647 2147483646 512000    

kernel.shmall

所有共享内存段相加大小限制(建议内存的80%)

kernel.shmall = 107374182      

所有共享内存段相加大小限制(建议内存的80%)

kernel.shmall = 107374182      

最大单个共享内存段大小(建议为内存一半) kernel.shmmax = 274877906944   

一共能生成多少共享内存段 kernel.shmmni = 819200         

tcp_syncookies

开启SYN Cookies。当出现SYN等待队列溢出时,启用cookie来处理,可防范少量的SYN攻击 net.ipv4.tcp_syncookies = 1    

dirty_expire_centisecs

比这个值老的脏页,将被刷到磁盘。3000表示30秒。

vm.dirty_expire_centisecs = 3000

dirty_background_bytes

系统脏页到达这个值,系统后台刷脏页调度进程 pdflush(或其他) 自动将(dirty_expire_centisecs/100)秒前的脏页刷到磁盘

vm.dirty_background_bytes = 409600000       

dirty_ratio

vm.dirty_ratio = 95                           如果系统进程刷脏页太慢,使得系统脏页超过内存 95 % 时,则用户进程如果有写磁盘的操作(如fsync, fdatasync等调用),则需要主动把系统脏页刷出。 有效防止用户进程刷脏页,在单机多实例,并且使用CGROUP限制单实例IOPS的情况下非常有效。 

dirty_writeback_centisecs

vm.dirty_writeback_centisecs = 100             pdflush(或其他)后台刷脏页进程的唤醒间隔, 100表示1秒。

0 人点赞