VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

系统内核参数配置

本文将介绍系统内核参数,并指导用户如何设置系统内核参数

系统内核参数介绍

  • 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 -lipcs -u查看信号量。

    • 每16个进程一组,每组信号量需要17个信号量。可根据需要修改kernel.sem值。

    • SEMMSL代表信号量,SEMMNI代表组。

    设置语句:

    sysctl kernel.sem='4096 2097152000 4096 512000'
    
  • kernel.shmall

    该参数用于控制共享内存页数,等于系统内存(建议设置为80%)/PAGE_SIZE,该参数设置太小有可能导致数据库启动报错。

    单位:byte

    示例:物理内存为128GB,PAGE大小为4096,则kernel.shmall=128*1024*1024*1024*0.84096=26843545。

    • 使用getconf PAGE_SIZE命令查看page_size大小。

    • 内存大小需换算成bytes。

    设置语句:

    sysctl kernel.shmall='26843545'
    
  • kernel.shmmax

    该参数表示最大单个共享内存段大小(建议为大于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.shmallkernel.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 按下ESC键后执行:wq保存并退出编辑页面。

步骤4 重载配置,使其在不关机的情况下生效。

sysctl -p