设置内核参数
前提条件: 当您需要性能测试时可设置内核参数。
步骤1 以root用户登录操作系统。
步骤2 (可选)设置内核参数(逐一设置)。
注:您还可以直接执行步骤3,进行批量设置内核参数。
设置fs.aio-max-nr参数,该参数表示可以拥有的异步IO请求数目,推荐值:1048576。
sysctl fs.aio-max-nr='1048576'
设置file-max参数,该参数表示每次登录会话可以打开的文件数。
sysctl fs.file-max='76724600'
设置kernel.sem参数,该参数包含4个参数(排序为SEMMSL、SEMMNS、SEMOPM和MNI)。
SEMMSL:每个信号量set中信号量最大个数,最小250。
SEMMNS:Linux系统中信号量最大个数,至少32000,等于SEMMSL*SEMMNI。
SEMOPM:SEMOP系统调用允许的信号量最大个数,至少100;或者等于SEMMSL。
SEMMNI:Linux系统信号量set最大个数,最少128。
sysctl kernel.sem='4096 2097152000 4096 512000'
设置kernel.shmall参数,该参数用于控制共享内存页数,等于系统内存(建议设置为80%,单位:byte)/PAGE_SIZE(getconf PAGE_SIZE获取),该参数设置太小有可能导致数据库启动报错。示例:物理内存为128GB,PAGE大小为4096,则kernel.shmall=128*1024*1024*1024*0.8⁄4096=26843545。
sysctl kernel.shmall='26843545'
设置kernel.shmmax参数,该参数表示最大单个共享内存段大小(建议为大于shared_buffer值), 等于系统内存*0.5,单位:byte。示例:物理内存为128GB,则:kernel.shmmax=128*1024*1024*1024*0.5=68719476736。
sysctl kernel.shmmax='68719476736'
设置kernel.shmmni参数,该参数系统范围内共享内存段的最大数量,默认值: 4096。
sysctl kernel.shmmni='4096'
设置net.core.netdev_max_backlog参数,该参数表示允许送到队列的数据包的最大数目。
sysctl net.core.netdev_max_backlog='10000'
设置net.core.rmem_default参数,该参数表示预留用于接收缓冲的内存默认值,单位:byte。
sysctl net.core.rmem_default='262144'
设置net.core.rmem_max参数,该参数表示预留用于接收缓冲的内存最大值,单位:byte。
sysctl net.core.rmem_max='4194304'
设置net.core.wmem_default参数,该参数表示预留用于发送缓冲的内存默认值,单位:byte。
sysctl net.core.wmem_default='262144'
设置net.core.wmem_max参数,该参数表示预留用于发送缓冲的内存最大值,单位:byte。
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参数,该参数表示触发回刷的脏页数据量,超过该参数,脏页刷到磁盘,单位:btye。
sysctl vm.dirty_background_bytes='409600000'
设置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秒。
sysctl vm.dirty_writeback_centisecs='100'
设置vm.overcommit_memory参数,该参数表示内存分配策略,可选值:0、1和2。
0:表示内核将检查是否有足够的可用内存供应用进程使用,如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2:表示内核允许分配超过所有物理内存和交换空间总和的内存。
sysctl vm.overcommit_memory='0'
设置vm.swappiness参数,该参数表示激活交换之前可用内存的百分比。数值越低,使用的交换越少,并且物理内存中保留的内存页越多,默认值:60。
sysctl vm.swappiness='60'
设置net.ipv4.ip_local_port_range参数,该参数可以设置本地动态端口分配范围,防止占用监听端口。
sysctl net.ipv4.ip_local_port_range='40000 65535'
设置fs.nr_open参数,该参数表示单个进程可分配的最大文件数,单位:个。对于有很多对象(表、视图、索引、序列和物化视图等)的PostgreSQL数据库,建议设置为2000万。
sysctl fs.nr_open='20000000'
步骤3 设置内核参数(批量设置),执行 vi /etc/sysctl.conf
将以下内核信息写入sysctl.conf文件末尾,保存退出。
fs.aio-max-nr=1048576
fs.file-max= 76724600
kernel.sem=4096 2097152000 4096 512000
kernel.shmall=26843545
kernel.shmmax=68719476736
kernel.shmmni = 4096
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 = 100
vm.overcommit_memory = 0
vm.swappiness= 60
net.ipv4.ip_local_port_range = 40000 65535
fs.nr_open = 20000000
步骤4 重载配置,使其生效。
sysctl -p