#操作系统参数调整

# 检查服务器名称(共享集群/分布式集群部署)

部署共享集群/分布式集群时,同一个集群中的服务器名称不能相同。

## 查看每台服务器的名称hostname
# hostnamectl

## 若名称相同,需进行相应调整
# hostnamectl set-hostname host0001

# 关闭交换分区

交换分区(Swap Space)是物理内存的重要补充,在数据库运行期间承担着内存页面置换、系统紧急内存回收等关键职能,直接影响数据库的稳定性和性能表现。

如果数据库用于运行低延迟、高稳定性以及I/O性能要求极高的关键业务,建议提高物理内存配置且不单独划分交换分区。若已经划分交换分区,可执行以下命令关闭系统swap。

## 查看当前启用状态
# swapon -s

## 关闭swap
# echo "vm.swappiness = 0">> /etc/sysctl.conf
# sysctl -p
# swapoff -a

## 若后续需重新启用swap,则执行如下命令
# swapon -a

如果物理内存配置相对紧张,内存不足时可能触发OOM Killer机制,若直接关闭交换分区可能会增加OOM问题的发生率,可酌情调低交换分区的优先级并可以将此作为一个性能调优观测项,例如先将vm.swappiness设置为0观察系统表现后再决定是否完全禁用,根据业务增长情况定期重新评估内存配置策略。如需深入了解swappiness配置细节,请参考Linux内核文档 (opens new window)

## 查看当前配置
# sysctl -a | grep swappiness

## 修改配置,将swappiness设置为0
# echo "vm.swappiness = 0">> /etc/sysctl.conf
# sysctl -p

# 调整自动分配本地端口范围

使用cat /proc/sys/net/ipv4/ip_local_port_range查看连接可用的本地端口范围,下限值建议大于30000以减少端口冲突。

## 查看当前配置
cat /proc/sys/net/ipv4/ip_local_port_range

## 修改配置
# sysctl -w net.ipv4.ip_local_port_range='32768 60999' 
# echo "net.ipv4.ip_local_port_range=32768 60999" >> /etc/sysctl.conf

本操作对IPv6同样生效。

# 调整进程VMA上限

进程的虚拟内存区域(VMA,Virtual Memory Area)是Linux内核中管理进程地址空间的重要数据结构。在数据库环境中,大量的共享内存段、SPA内存分配以及并发连接会导致进程创建大量的VMA区域。当VMA数量超过系统默认限制时,可能引发内存分配失败,影响数据库的正常运行。

当并发用户数较多或执行复杂的SQL操作时,单个进程可能需要管理数千个VMA区域。Linux系统默认的65536个VMA限制在高负载数据库环境中往往不够用,可能导致"Cannot allocate memory"或"ENOMEM"错误。建议调大VMA上限值,推荐2000000或以上。

## 查看当前配置
# sysctl -a|grep vm.max_map_count

## 修改配置
# sysctl -w vm.max_map_count=2000000
# echo "vm.max_map_count=2000000" >> /etc/sysctl.conf 

# 调整资源限制值

将部分资源限制值(使用ulimit -a可查看所有的资源限制值)调整为推荐值或以上,详细信息如下表所示,其中yashan为规划的数据库安装用户示例(具体用户名需以实际规划为准)。

资源项 推荐值 OS命令 资源项说明
open files 1048576 ulimit -n 1048576
vi /etc/security/limits.conf后添加:
yashan soft nofile 1048576
yashan hard nofile 1048576
进程打开的文件数
max user processes 1048576 ulimit -u 1048576
vi /etc/security/limits.conf后添加:
yashan soft nproc 1048576
yashan hard nproc 1048576
最大用户进程数
max memory size unlimited ulimit -m unlimited
vi /etc/security/limits.conf后添加:
yashan soft rss unlimited
yashan hard rss unlimited
进程最大占用内存值
stack size 8192 ulimit -s 8192
vi /etc/security/limits.conf后添加:
yashan soft stack 8192
yashan hard stack 8192
进程最大栈空间

# 调整网络连接参数

TCP监听队列(Listen Backlog Queue)是操作系统网络子系统中的重要缓冲机制,用于暂存已完成三次握手但尚未被应用程序接受的TCP连接请求。在高并发数据库环境中,合理的监听队列长度配置直接影响系统的连接处理能力和抗冲击能力,建议设置为32768或以上的值。

## 查看当前配置
# cat /proc/sys/net/core/somaxconn

## 调整参数值
# sudo sysctl -w net.core.somaxconn=32768

# 调整共享内存参数

共享内存是Linux系统中进程间通信的重要机制,在数据库环境中承担着关键的数据共享和传输职能。通过合理配置shmmax、shmall、shmmni这三个核心参数,可以为数据库实例提供充足的共享内存资源,确保其稳定高效运行。

使用sysctl命令可以查看各个参数的当前配置,请根据实际情况和推荐值进行相应调整,命令中的数值仅为示例,请按需替换为实际值。

配置项 推荐值 OS命令 说明
shmmax 物理内存的50% - 90%,且大于数据库的SGA vi /etc/sysctl.conf后添加kernel.shmmax = 24696061952,需重启生效 单个共享内存段的最大大小(单位:字节)
‌shmall 计算公式为shmmax值/PAGE_SIZE(通常页大小为4KB) vi /etc/sysctl.conf后添加kernel.shmall = 3774873,需重启生效 系统范围内共享内存总页数
‌shmmni 通常保持默认值4096即可,高并发场景可调大 vi /etc/sysctl.conf后添加kernel.shmmni = 4096,需重启生效 系统允许的共享内存段总数

# 配置大页内存

YashanDB利用大页内存提高内存访问效率。标准大页内存会在系统启动时预分配,而透明大页会在运行时动态分配大页内存,可能产生运行时错误,造成YashanDB被终止。

建议在安装时配置操作系统,启用大页内存,关闭透明大页(Transparent HugePages)选项,YashanDB服务安装完成后,如需使用大页内存,请修改数据库配置参数USE_LARGE_PAGES为TRUE或ONLY。

如需深入了解大页内存细节,请参考Linux内核文档 (opens new window)

# 启用大页内存

  1. 执行如下命令查看当前大页内存配置:(回显信息以实际为准)

    # grep -i huge /proc/meminfo
    AnonHugePages:         0 kB
    HugePages_Total:       0
    HugePages_Free:        0
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       2048 kB
    
    • AnonHugePages:当前透明大页使用的内存总量,可参考本文档关闭。
    • HugePages_Total:大页池中页面总数。
    • HugePages_Free:大页池中空闲页面数。
    • HugePages_Rsvd:系统预留(reserved)的页面数。表示应用已申请了对应数量的大页,但由于应用尚未访问这些页面,系统还没有真正从物理内存分配这些页面。应用最多还能申请HugePages_Free - HugePages_Rsvd个大页。
    • HugePages_Surp:当开启nr_overcommit_hugepages时,系统允许换出一些大页,使得系统支持应用申请超出大页池容量的页面,如果应用频繁访问大页,可能对性能存在负面影响。
    • Hugepagesize:大页的尺寸,不同平台支持的大页尺寸有差异,x86平台支持2M、1G,通常为2M。

    若HugePages_Total = 0、HugePages_Free = 0或HugePages_Free - HugePages_Rsvd < YashanDB需求,则需修改系统配置,启用大页内存或增加大页内存池容量。

  2. 估算大页内存需求,需先估算YashanDB的大页内存需求:

    配置参数 默认值
    DATA_BUFFER_SIZE 32M
    REDO_BUFFER_SIZE 8M
    VM_BUFFER_SIZE 16M
    SHARE_POOL_SIZE 64M
    LARGE_POOL_SIZE 8M
    DBWR_BUFFER_SIZE 4M
    WORK_AREA_POOL_SIZE 16M
    AUDIT_QUEUE_SIZE 16M

    根据配置计算YashanDB所需内存总量UserSize,即上述所有配置项的总和(未配置的项目按默认值计算)。如需规划使用MMS表空间,还需估计MMS表空间所需内存总量MMSSize。

    • YashanDB至少需要大页内存空间LargePageSize = (UserSize + MMSSize + 64M) * 1.2。

    • YashanDB需要的大页内存页面数HugePages = Ceil(LargePageSize / Hugepagesize)。

    Caution:

    若将所有内存都划归大页管理,可能造成系统无法启动或其他异常,请谨慎使用

    配置时,需确保系统内存容量足以支持大页配置的数值。

  3. 启用大页内存并根据上述估算值更改相关配置:

    本文以大页尺寸2M、申请16个大页(即规划32M大页内存)为例,生产环境配置请以实际为准。

    编辑/etc/sysctl.conf文件:

    # vi /etc/sysctl.conf
    

    追加以下配置:

    vm.nr_hugepages=16
    vm.nr_overcommit_hugepages=0
    
  4. 重启系统生效。

    # reboot
    

# 关闭透明大页

  1. 部分操作系统默认开启了透明大页选项,可执行以下命令确认:

    ## 1. 查找透明大页相关的虚拟文件系统路径
    # find / -name *transparent_hugepage
    
    ## 2. 根据路径选择查看命令,常见命令如下:
    # cat /sys/kernel/mm/transparent_hugepage/enabled
    ## 或
    # cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
    
    • 若显示[always] madvise neveralways [madvise] never,则说明透明大页已开启。

    • 若显示always madvise [never],则说明透明大页已关闭。

  2. 执行vi /etc/default/grub,在GRUB_CMDLINE_LINUX中添加或修改参数transparent_hugepage=never

       GRUB_TIMEOUT=5
       GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
       GRUB_DEFAULT=saved
       GRUB_DISABLE_SUBMENU=true
       GRUB_TERMINAL_OUTPUT="console"
       GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet transparent_hugepage=never"
       GRUB_DISABLE_RECOVERY="true"
    
  3. 通过以下指令检查当前系统的引导类型:

    # [ -d /sys/firmware/efi ] && echo UEFI || echo BIOS
    

    两种引导的启动文件路径分别为:

    • BIOS: /boot/grub2/grub.cfg

    • UEFI:/boot/efi/EFI/<distro_name>/grub.cfgdistro_name为系统发行版本名称,例如ubuntufedoradebian等。

  4. 执行grub2–mkconfig指令重新配置grub.cfg

    ## BIOS引导
    # grub2-mkconfig -o /boot/grub2/grub.cfg
    ## UEFI引导
    # grub2-mkconfig -o /boot/efi/EFI/<distro_name>/grub.cfg
    
  5. 重启操作系统,使配置永久生效。

    # reboot
    
  6. 验证透明大页已关闭:

    ## Red Hat Enterprise Linux内核
    # cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
    
    ## 其他内核
    # cat /sys/kernel/mm/transparent_hugepage/enabled
    

    应显示always madvise [never]

# 开启core文件(可选)

在搭建测试环境或实验环境时,建议打开生成core文件的开关(使用ulimit -c查看当前状态)便于问题定位。

在搭建生产环境时,不建议打开此开关以免影响系统效率。

# ulimit -c unlimited 
# vi /etc/security/limits.conf

## 添加以下信息并保存,yashan为规划的数据库安装用户示例,具体用户名需以实际规划为准

yashan soft core unlimited
yashan hard core unlimited
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流