一、简述内核参数 somaxconn

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

该内核参数默认值一般是128(该参数限制系统中每一个端口最大的监听队列的长度),对于负载要求很高(并发要求很大)的服务程序的要求是远远不能满足的。因此,为了满足我们实际生产环境的需求,我们需要根据需求,修改该参数的默认值到2048或更多,但不是无限大,需要考虑本地的资源以及处理能力,避免服务响应时间过长影响用户体验。

二、内核参数修改 sysctl 命令

1.1 sysctl 命令简述

[root@docker ~]# sysctl -h
Usage:
 sysctl [options] [variable[=value] ...]
Options:
  -a, --all            display all variables  # 显示所有内核参数
  -n: Use this option to print only values of the given variable or variables. #查看指定内核参数的值
  -p: Load sysctl settings from the file specified or /etc/sysctl.conf if none is given. #重新加载内核参数文件,默认加载 /etc/sysctl.conf
  -w: Enables writing of a value to a variable. #给内核参数变量写入一个值

1.1.1 查看前10条内核参数

[root@docker ~]# sysctl -a |head -n 10|nl
     1  abi.vsyscall32 = 1
     2  crypto.fips_enabled = 0
     3  debug.exception-trace = 1
     4  debug.kprobes-optimization = 1
     5  debug.panic_on_rcu_stall = 0
     6  dev.cdrom.autoclose = 1
     7  dev.cdrom.autoeject = 0
     8  dev.cdrom.check_media = 0
     9  dev.cdrom.debug = 0
    10  dev.cdrom.info = CD-ROM information, Id: cdrom.c 3.20 2003/12/17

注: dev.cdrom.autoclose = 1dev.cdrom.autoclose 称为变量(键),后面的1,即为;Key/Value方式,或变量方式;

1.1.2 修改dev.cdrom.autoclose 变量(键)的值为0,重启失效

[root@docker ~]# sysctl -w "dev.cdrom.autoclose=0" 
dev.cdrom.autoclose = 0
[root@docker ~]# sysctl -n dev.cdrom.autoclose  #查看修改后的值
0 
[root@docker ~]# sysctl -a | grep dev.cdrom.autoclose 
dev.cdrom.autoclose = 0

修改内核信号量参数,重启后失效

[root@docker ~]# sysctl -w "kernel.sem= 250 64000 32 256"
kernel.sem =  250 64000 32 256

或者(直接修改内存中的信号量参数)重启后失效

[root@docker ~]# echo "250 64000 32 256" >/proc/sys/kernel/sem
[root@docker ~]# ipcs -sl

------ Semaphore Limits --------
max number of arrays = 256   # array数
max semaphores per array = 250   #每个array 中的信号个数
max semaphores system wide = 64000 
max ops per semop call = 32
semaphore max value = 32767

1.1.3 修改内核参数,永久生效

  1. 写入定义的内核参数

    [root@docker ~]# echo dev.cdrom.autoclose=1 >> /etc/sysctl.conf
    
  2. 根据默认内核参数配置文件重新加载

    [root@docker ~]# sysctl -p  
    dev.cdrom.autoclose = 1
    # 根据指定配置文件,重新加载内核参数设置
    [root@docker ~]# sysctl -p /etc/sysctl.conf 
    dev.cdrom.autoclose = 1
    

三、修改 somaxconn 内核参数

1.1 直接修改内存中的somaxconn 内核参数,重启后失效

系统重启后,该内核参数值丢失

[root@docker ~]# echo 2048 > /proc/sys/net/core/somaxconn 

1.2 通过修改内核参数文件修改内核参数,永久生效(推荐)

  1. 在/etc/sysctl.conf中添加如下
    [root@docker ~]# echo net.core.somaxconn = 2048
    
  2. 通过内核参数配置文件,重新加载,内核参数变量值:
    [root@docker ~]# sysctl -p
    

1.3 内核参数自定义建议

1. 如果对该内核参数不了解,在生产环境下,勿轻易改动
2. 如果修改内核参数,建议适当修改值的大小,避免给系统的稳定性带来隐患
Logo

更多推荐