操作系统参数优化

1、前言

  为了确保SinoDB数据库系统能够高效、可靠地运行,数据库操作系统参数的优化变得至关重要。本文介绍SinoDB 数据库在Centos 6 和7操作系统参数优化,并提供一些关键的参数和最佳实践,帮助数据库管理人员更好地理解、配置操作系统参数,以确保数据库系统的最佳性能。

2、内核参数

  • fs.aio-max-nr = 1048576
    //同时可以拥有的的异步IO请求数目。1048576 即 1024*1024 也就是 1024K 个。

  • fs.file-max = 6553600
    //系统允许打开的文件数。

  • kernel.shmall = 2097152
    //设置共享内存总页数。这个值太小有可能导致数据库启动报错。
    计算公式为:内存(G)*1024 * 1024 * 1024/4096,4096为getconf PAGE_SIZE得到分页大小。

  • kernel.shmmax = 2147483648 //Linux进程可以分配的单独共享内存段的最大值。
    建议值为多于内存的一半。
    因此对于安装SinoDB数据库的系统,shmmax的值应该比内存的二分之一大一些。

  • kernel.shmmni = 4096
    //设置系统级最大共享内存段数量。推荐最小值为4096。

  • kernel.sem = 250 32000 100 128 //从左到右分别为SEMMSL、SEMMNS、SEMOPM和SEMMNI。

    1)SEMMSL:设置每个信号灯组中信号灯最大数量,推荐的最小值是250。
    对于系统中存在大量并发连接的系统,推荐将这个值设置为PROCESSES初始化参数加10。

    2)SEMMNS:设置系统中信号灯的最大数量。操作系统在分配信号灯时不会超过LEAST(SEMMNS,SEMMSLSEMMNI)。
    事实上,如果SEMMNS的值超过了SEMMSL
    SEMMNI是非法的,因此推荐SEMMNS的值就设置为SEMMSL*SEMMNI。 SinoDB推荐SEMMNS的设置不小于32000。

    3)SEMOPM:设置每次系统调用可以同时执行的最大信号灯操作的数量。
    由于一个信号灯组最多拥有SEMMSL个信号灯,因此有推荐将SEMOPM设置为SEMMSL的值。

    4)SEMMNI:设置系统中信号灯组的最大数量。

  • net.ipv4.ip_local_port_range = 1024 65000
    //ip_local_port_range表示端口的范围,为指定的内容

  • net.core.rmem_default = 262144
    //表示接收套接字缓冲区大小的缺省值(以字节为单位)。

  • net.core.rmem_max = 4194304
    //表示接收套接字缓冲区大小的最大值(以字节为单位)。

  • net.core.wmem_default = 262144
    //表示发送套接字缓冲区大小的缺省值(以字节为单位)。

  • net.core.wmem_max = 1048586
    //表示发送套接字缓冲区大小的最大值(以字节为单位)。

3、 内存oom相关参数

  • panic_on_oom
    //用来控制当内存不足时该如何做。
    cat /proc/sys/vm/panic_on_oom
    值为0:内存不足时,启动 OOM killer。
    值为1:内存不足时,有可能会触发 kernel panic(系统重启),也有可能启动 OOM killer。
    值为2:内存不足时,表示强制触发 kernel panic,内核崩溃GG(系统重启)。

  • oom_kill_allocating_task
    //用来决定触发OOM时先杀掉哪种进程
    cat /proc/sys/vm/oom_kill_allocating_task
    值为0:会 kill 掉得分最高的进程。
    值为非0:会kill 掉当前申请内存而触发OOM的进程。
    当然,一些系统进程(如init)或者被用户设置了oom_score_adj的进程等可不是说杀就杀的。

  • oom_dump_tasks
    //用来记录触发OOM时记录哪些日志
    cat /proc/sys/vm/oom_dump_tasks
    oom_dump_tasks参数可以记录进程标识信息、该进程使用的虚拟内存总量、物理内存、进程的页表信息等。
    值为0:关闭打印上述日志。在大型系统中,可能存在上千进程,逐一打印使用内存信息可能会造成性能问题。
    值为非0:有三种情况会打印进程内存使用情况。
    1、由 OOM 导致 kernel panic 时;
    2、没有找到符合条件的进程 kill 时;
    3、找到符合条件的进程并 kill 时。

  • oom_adj、oom_score_adj 和 oom_score
    //用来控制进程打分(分数越高,就先杀谁)
    这三个参数的关联性比较紧密,都和具体的进程相关,位置都是在 /proc/进程PID/ 目录下。
    内核会对进程打分(oom_score),主要包括两部分,系统打分和用户打分。系统打分就是根据进程的物理内存消耗量;用户打分就是 oom_score_adj 的值。如果用户指定 oom_score_adj 的值为 -1000,也就是表示禁止 OOM killer 杀死该进程。
    用户可以通过调整 oom_score_adj 的值来决定最终 oom_score 的值,oom_score_adj 的取值范围是 -1000~1000,为0时表示用户不调整 oom_score。另外,root进程拥有3%的内存使用特权,因此做最终 oom_score 计算时需要减去这些内存使用量。
    oom_adj是一个旧的接口参数,其功能类似oom_score_adj,为了兼容,目前仍然保留这个参数,当操作这个参数的时候,kernel实际上是会换算成oom_score_adj。

    omm参数修改方法:
    前三个参数修改方式如下:
    vim /etc/sysctl.conf 添加如下:
    vm.panic_on_oom = 1
    sysctl -p
    或重启操作系统

    后三个参数修改方式如下:
    echo 20 > /proc/进程id/oom_score_adj

4、 limits 参数

  对informix 用户做资源的限制,主要是出于性能上的考虑,防止informx用户过度消耗有限资源,使其系统变得臃肿缓慢。
在/etc/security/limits.conf 在文件末尾加

informix soft nofile 65536
informix hard nofile 65536
informix soft nproc 65536
informix hard nproc 65536
informix soft stack 65536
informix hard stack 65536