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的值超过了SEMMSLSEMMNI是非法的,因此推荐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