一、防火墙、SELinux检查

达梦和oracle都建议操作系统关闭防火墙和selinux,特别是集群,如不关闭,可能导致集群无法安装。

--关闭防火墙

[root@~]# systemctl stop firewalld  

--关闭开机自启

[root@~]# systemctl disable firewalld

---永久关闭SELinux

修改配置文件/etc/selinux/config,修改 SELINUX=disabled,重启服务器

selinux:是用来加强安全性的一个组件,但非常容易出错且难以定位,它在本来已经很安全的 Linux 环境中,凌驾于 root 权限之上,设置了很多额外的条条框框。如果了解这些条条框框,就可以进行相应设置;但如果不了解,那 SELinux 可能并没有帮什么忙,还会带来很多不确定因素。

二、磁盘调度算法

达梦和oracle都建议将普通磁盘的调度算法设置为deadline。

调度算法介绍

每当进程需要进行磁盘 I/O 操作时,它就向操作系统发出一个系统调用。如果所需的磁盘驱动器和控制器空闲,则立即处理请求。如果磁盘驱动器或控制器忙,则任何新的服务请求都会添加磁盘驱动器的待处理请求队列。对于具有多个进程的一个多道程序系统,磁盘队列可能有多个待处理的请求。因此操作系统如何选择待处理请求的服务便是磁盘调度算法。

CFQ(完全公平排队I/O调度程序)

CFQ全称 Completely Fair Scheduler ,中文名称完全公平调度器,CFQ 是内核默认选择的 I/O 调度器。它将由进程提交的同步请求放到多个进程队列中,然后为每个队列分配时间片以访问磁盘。

CFQ 对于很多 IO 压力较大的场景就并不是很适应,尤其是 IO 压力集中在某些进程上的场景。因为这种场景我们需要更多的满足某个或者某几个进程的 IO 响应速度,而不是让所有的进程公平的使用 IO,比如数据库应用。

NOOP(电梯式调度程序)

NOOP全称 No Operation,中文名称电梯式调度器,该算法实现了最简单的 FIFO 队列,所有 I/O 请求大致按照先来后到的顺序进行操作。NOOP 实现了一个简单的先入先出(FIFO)队列,它像电梯的工作方式一样对 I/O 请求进行组织。它是基于先入先出(FIFO)队列概念的 Linux 内核里最简单的 I/O 调度器。此调度程序最适合于固态硬盘。

NOOP 倾向饿死读而利于写,因为写请求比读请求更容易,写请求通过文件系统cache,不需要等一次写完成,就可以开始下一次写操作,写请求通过合并,堆积到 I/O 队列中。读请求需要等到它前面所有的读操作完成,才能进行下一次读操作,在读操作之间有几毫秒时间,而写请求在这之间就到来,饿死了后面的读请求。对于数据库应用磁盘 IO 读写都高频的进程而言NOOP也是不适合的。

Deadline(截止时间调度程序)

deadline 实现了四个队列,其中两个分别处理正常 read 和 write,另外两个处理超时 read 和 write 的队列,按请求创建时间排序,如果有超时的请求出现,就放进这两个队列,调度算法保证超时(达到最终期限时间)的队列中的请求会优先被处理,防止请求被饿死。Deadline 确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限,这样就防止了写操作因为不能被读取而饿死的现象。

AS(预料I/O调度程序)

AS(预料I/O调度程序)是基于预测的 I/O 算法。顾名思义有 I/O发生时,如果又有进程请求 I/O 操作,则将产生一个默认的 6 毫秒猜测时间,猜测下一个进程请求 I/O 是要干什么的。这个 I/O 调度器对读操作优化服务时间,在提供一个 I/O 的时候进行短时间等待,使进程能够提交到另外的 I/O。AS 算法从 Linux 2.6.33 版本后被删除了。

AS 适合于写入较多的环境,AS对数据库环境表现很差。


临时更改

--临地更改I/O调度方法,重启后失效

[root@~]# echo deadline > /sys/block/sdc/queue/scheduler


-永久修改

--修改内核引导参数,加入elevator= deadline

[root@~]# vi /boot/grub/menu.lst

 --更改到如下内容

[root@~]# kernel /boot/vmlinuz-2.6.32-504.el6 ro root=LABEL=/ elevator=deadline rhgb quiet

 --重新确认调度算法

[root@~]# cat /sys/block/sdc/queue/scheduler


三、关闭 swap

达梦数据库建议在内存充裕(较大)情况下关闭swap,oracle数据库无此建议。

关闭SWAP的意义

在 Linux 下,SWAP 的作用类似 Windows 系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当 SWAP 分区(虚拟成内存)使用,从而解决内存容量不足的情况。数据库系统一般都对响应延迟比较敏感,如果使用 swap 代替内存,数据库服务性能必然不可接受。对于响应延迟极其敏感的系统来讲,延迟太大和服务不可用没有任何区别,比服务不可用更严重的是,swap 场景下进程就是不死,这就意味着系统一直不可用,再想想如果不使用 swap 直接 oom,是不是一种更好的选择。

而oracle是建议在服务器内存充裕(较大)情况下使用普通大页来转载在SGA,让数据库的SGA内存不用做交换。


临时修改 ---临地关闭 swap 分区,重启后失效

[root@~]# swapoff -a

永久修改 ---永久关闭 swap 分区

[root@~]# sed -ri 's/.swap./#&/' /etc/fstab

---重启操作系统

[root@~]# reboot

---再次确认

[root@~]# free -m


四、关闭 numa

达梦和oracle都建议操作系统禁用numa。

NUMA(Non-Uniform Memory Access)架构是为了解决多 CPU 下内存访问冲突,简单来说不在将整个物理内存作为一个整体,而是根据不同的 CPU 区分不同的内存块儿,如 2 颗 CPU 每颗 CPU 使用 64G 内存。

当 NUMA 参数 zone_reclaim_mode 在设置为 1 时,内核将要求多路 CPU 尽量从距离较近的系统内存节点(服务器的整体内存在 numa 架构下将被分成若干个节点)分配内存而不是在整个服务器可访问内存的范围内进行内存分配,因此在较高内存占用压力下内存申请会触发内存频繁回收整理的机制严重影响了系统整体性能(长期处于内核态 sys 很高)。进而可能导致 SQL 卡顿问题的发生。

关闭方法

cat /etc/default/grub  

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="rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet  transparent_hugepage=never numa=off"

GRUB_DISABLE_RECOVERY="true"


重新生成grub配置文件

On BIOS-based machines, issue the following command as root:

# grub2-mkconfig -o /boot/grub2/grub.cfg

On UEFI-based machines, issue the following command as root:

# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

重启主机,检查NUMA

#lscpu

重新生成grub配置文件

On BIOS-based machines, issue the following command as root:

# grub2-mkconfig -o /boot/grub2/grub.cfg

On UEFI-based machines, issue the following command as root:

# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

重启主机,检查NUMA

# numactl --hardware

[root@node11~]#lscpu

五、关闭透明大页(Transparent HugePages)

达梦和oracle都建议操作系统关闭透明大页。

Transparent HugePages (透明大页)在 khugepaged 进行扫描进程占用内存,并将 4kPage 交换为 Huge Pages 的这个过程中,对于操作的内存的各种分配活动都需要各种内存锁,直接影响程序的内存访问性能。并且,这个过程对于数据库是透明的,在数据库层面不可控制。因为上述原因透明大页可能导致节点意外重启和RAC性能问题,所以ORACLE强烈建议禁用透明大页。此外即使在单实例数据库环境中,Transparent Hugepages 也可能会导致出现意外性能问题或延迟的问题。因此,达梦和Oracle 建议在所有运行 达梦和Oracle 的数据库服务器上禁用透明大页。

关闭方法

cat /etc/default/grub  

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="rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet  transparent_hugepage=never numa=off"

GRUB_DISABLE_RECOVERY="true"


重新生成grub配置文件

On BIOS-based machines, issue the following command as root:

# grub2-mkconfig -o /boot/grub2/grub.cfg

On UEFI-based machines, issue the following command as root:

# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

重启主机,检查NUMA

#lscpu

重新生成grub配置文件

On BIOS-based machines, issue the following command as root:

# grub2-mkconfig -o /boot/grub2/grub.cfg

On UEFI-based machines, issue the following command as root:

# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

重启主机,透明大页是否关闭

[root@node11~]# cat /sys/kernel/mm/transparent_hugepage/enabled


六、配置参数 overcommit_memory 

达梦数据库建议配置系统虚拟内存参数overcommit_memory 为0,oracle数据库无此建议。

配置参数 overcommit_memory 表示系统的内存分配策略可以选值为 0,1,2。

0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2:表示内核允许分配超过所有物理内存和交换空间总和的内存。

临时生效

---使用root执行命令

# echo 0 > /proc/sys/vm/overcommit_memory

---查看执行结果

# cat /proc/sys/vm/overcommit_memory

永久生效 ---用root用户编辑配置文件编辑/etc/sysctl.conf,增加vm.overcommit_memory=0

sysctl -p或重启操作系统


以上可以看到达梦数据库和oracle数据库安装部署的最佳实践大部分调整都是相同的。