系统内核参数配置
系统内核参数介绍
fs.aio-max-nr
该参数表示可以拥有的异步IO请求数目。
推荐值:1048576。
在Linux 6和7上使用aio时需要设置
fs.aio-max-nr
来适应异步IO。设置语句:
sysctl fs.aio-max-nr='1048576'
file-max
该参数表示每次登录会话可以打开的文件数。
在Linux 6和7上,file-max的值与内核资源使用参数max_files_per_process对应。
设置语句:
sysctl fs.file-max='76724600'
kernel.sem
该参数包含4个参数(排序为SEMMSL、SEMMNS、SEMOPM、SEMMNI)。
SEMMSL:每个信号量set中信号量最大个数,最小取值250。
SEMMNS:Linux系统中信号量最大个数,至少取值32000,等于SEMMSL*SEMMNI。
SEMOPM:SEMOP系统调用允许的信号量最大个数,至少取值100;或者等于SEMMSL。
SEMMNI:Linux系统信号量set最大个数,最少128。
ipcs -l
或ipcs -u
查看信号量。每16个进程一组,每组信号量需要17个信号量。可根据需要修改kernel.sem值。
SEMMSL代表信号量,SEMMNI代表组。
设置语句:
sysctl kernel.sem='4096 2097152000 4096 512000'
该参数用于控制共享内存页数,等于系统内存(建议设置为80%)/PAGE_SIZE,该参数设置太小有可能导致数据库启动报错。
单位:byte
示例:物理内存为128GB,PAGE大小为4096,则kernel.shmall=128*1024*1024*1024*0.8⁄4096=26843545。
使用
getconf PAGE_SIZE
命令查看page_size大小。内存大小需换算成bytes。
设置语句:
sysctl kernel.shmall='26843545'
该参数表示最大单个共享内存段大小(建议为大于shared_buffer值), 等于系统内存*0.5。
单位:bytes
示例:物理内存为128GB,则:kernel.shmmax=128*1024*1024*1024*0.5=68719476736。
内存大小需换算成bytes。
设置语句:
sysctl kernel.shmmax='68719476736'
kernel.shmmni
该参数系统范围内共享内存段的最大数量。
默认值:4096。
每个Vastbase数据库集群至少2个共享内存段。
设置语句:
sysctl kernel.shmmni='819200'
net.core.netdev_max_backlog
该参数表示允许送到队列的数据包的最大数目。
iptables防火墙链表相关。
设置语句:
sysctl net.core.netdev_max_backlog='10000'
net.core.rmem_default
该参数表示预留用于接收缓冲的内存默认值。
单位:bytes。
设置语句:
sysctl net.core.rmem_default='262144'
net.core.rmem_max
该参数表示预留用于接收缓冲的内存最大值。
单位:bytes。
设置语句:
sysctl net.core.rmem_max='4194304'
net.core.wmem_default
该参数表示预留用于发送缓冲的内存默认值。
单位:bytes。
设置语句:
sysctl net.core.wmem_default='262144'
net.core.wmem_max
该参数表示预留用于发送缓冲的内存最大值。
单位:bytes。
设置语句:
sysctl net.core.wmem_max='4194304'
net.core.somaxconn
该参数表示socket监听的backlog(队列)上限。
默认值:128
设置语句:
sysctl net.core.somaxconn='4096'
net.ipv4.tcp_fin_timeout
该参数表示FIN_WAIT_2状态的超时时长。
单位:秒。
加快僵死进程回收速度。
设置语句:
sysctl net.ipv4.tcp_fin_timeout='5'
vm.dirty_background_bytes
该参数表示触发回刷的脏页数据量,超过该参数后脏页刷到磁盘。
单位:btyes。
设置语句:
sysctl vm.dirty_background_bytes='409600000'
vm.dirty_expire_centisecs
该参数表示脏数据的过期时间,超过该时间系统会将脏数据回写到磁盘上。
单位:百分之一秒。
比vm.dirty_expire_centisecs值旧的脏页,将被刷到磁盘。
以下命令中3000代表30秒。
设置语句:
sysctl vm.dirty_expire_centisecs='3000'
vm.dirty_ratio
该参数表示脏数据百分比,超过这个百分比,新的IO请求将会被阻挡,直到脏数据被写进磁盘。
设置语句:
sysctl vm.dirty_ratio='80'
vm.dirty_writeback_centisecs
该参数表示多长时间,后台刷脏页进程会被唤醒一次,检查是否有缓存需要清理。
单位:百分之一秒。
参数设置为100代表1秒,如下命令中50代表0.5秒。
设置语句:
sysctl vm.dirty_writeback_centisecs='50'
vm.overcommit_memory
该参数表示内存分配策略,可选值:0、1、2。
0:表示内核将检查是否有足够的可用内存供应用进程使用,如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2:表示内核允许分配超过所有物理内存和交换空间总和的内存。
- 在分配内存时vm.overcommit_memory设置为0,vm.overcommit_ratio参数可以不设置。
设置语句:
sysctl vm.overcommit_memory='0'
vm.swappiness
该参数表示激活交换之前可用内存的百分比。数值越低,使用的交换越少,并且物理内存中保留的内存页越多。
默认值:60
设置为0时表示关闭交换分区,数据库服务器不建议使用swap,0值仅在极限测试时使用。
设置语句:
sysctl vm.swappiness='60'
net.ipv4.ip_local_port_range
该参数可以设置本地动态端口分配范围,防止占用监听端口。
设置语句:
sysctl net.ipv4.ip_local_port_range='40000 65535'
fs.nr_open
该参数表示单个进程可分配的最大文件数。对于有很多对象(表、视图、索引、序列和物化视图等)的PostgreSQL数据库,建议设置为2000万。
单位:个
建议设置为2000万。
设置语句:
sysctl fs.nr_open='20000000'
设置内核参数
设置内核参数前需参考内核参数介绍,结合实际情况调节参数大小,否则会影响数据库的安装部署。
其中关键配置项含义如下,建议用户在配置时着重关注:
- kernel.shmall:该参数用于控制共享内存页数,等于系统内存(建议设置为80%,单位:byte)/PAGE_SIZE(getconf PAGE_SIZE获取),该参数设置太小有可能导致数据库启动报错。
- kernel.shmmax:该参数表示最大单个共享内存段大小(建议为大于shared_buffer值), 等于系统内存*0.5,单位:byte。
- kernel.shmmni:该参数系统范围内共享内存段的最大数量,默认值:4096。
- vm.dirty_background_bytes:该参数表示触发回刷的脏页数据量,超过该参数,脏页刷到磁盘,单位:btye。
方式一:逐一设置内核参数。
步骤1 以root用户登录操作系统。
步骤2 设置内核参数(逐一设置),参数及其取值参见内核参数介绍。
sysctl key=values
key表示参数名。
values表示设置的参数值,参数值应用
''
包起来。
步骤3 重载配置,使其在不关机的情况下生效。
sysctl -p
方式二:批量设置内核参数
步骤1 以root用户登录操作系统。
步骤2 编译内核参数配置文件/etc/sysctl.conf,将内核信息写入文件末尾。
当系统物理内存 > 8G时,需重新计算内核参数设置示例中kernel.shmall和kernel.shmmax的值。
以下内核参数示例仅供参考,如需特殊化设置需结合参数介绍和实际情况进行设置。
fs.aio-max-nr=1048576 fs.file-max= 76724600 kernel.sem = 4096 2097152000 4096 512000 kernel.shmall = 26843545 # pages, 80% MEM or higher kernel.shmmax = 68719476736 # bytes, 80% MEM or higher kernel.shmmni = 819200 net.core.netdev_max_backlog = 10000 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 4194304 net.core.somaxconn = 4096 net.ipv4.tcp_fin_timeout = 5 vm.dirty_background_bytes = 409600000 vm.dirty_expire_centisecs = 3000 vm.dirty_ratio = 80 vm.dirty_writeback_centisecs = 50 vm.overcommit_memory = 0 vm.swappiness = 0 net.ipv4.ip_local_port_range = 40000 65535 fs.nr_open = 20480000
步骤3 信息写入完成后保存退出。
:wq
步骤4 重载配置,使其在不关机的情况下生效。
sysctl -p