上一篇DM8在Linux/Uinx平台与Oracle对比安装部署。地址:Linux(Unix)下 DM8 的安装与卸载(一)_羽书飞影的博客-CSDN博客
上一篇文章提及DM8数据库安装前操作系统层面基础调整,这篇文章详细讨论一下DM数据库在Linux操作系统平台部署如何全面调优。DM一般运行于Linux系统中,对于DM的调优一般分为Linux操作系统层面的调优和DM层面的调优(当然还有架构层面、业务层面、应用程序层面、表设计等层面的调优)。操作系统主要是管理和分配硬件资源,所以其实系统层面的调优包括了硬件的调优,也就是调整硬件参数。Linux系统层面的调优一般分为 CPU的调优、内存的调优、磁盘的调优、网络的调优、Linux后台service调优等等。
在server环境的CPU一定要关闭节能模式,节能模式不适应于服务器环境。因为他会自动给CPU降频进入休眠模式!关闭CPU的节能模式有两种方法:
1、在BIOS中进行设置,彻底关闭,修改grub文件:
# vim /etc/default/grub
修改
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
为
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_pstate=enable"
或者执行:
sed -i 's/quiet splash/quiet splash intel_pstate=enable/g' /etc/default/grub
然后执行:reboot。
2、关闭Linux中的服务 cpuspeed 和 irqbalance(这里以centos6.5以下版本命令,6.5以上chkconfig命令为systemctl disable 服务名)。
[root@localhost ~]# chkconfig --level 35 cpuspeed off
[root@localhost ~]# chkconfig | grep cpuspeed
cpuspeed 0:off 1:on 2:off 3:off 4:off 5:off 6:off
[root@localhost ~]# chkconfig --level 35 irqbalance off
[root@localhost ~]# chkconfig | grep irqbalance
irqbalance 0:off 1:off 2:off 3:off 4:off 5:off 6:off
注:cpuspeed 就是负责CPU节能的后台服务;而irqbalance在cpuspeed将某个或某几个CPU调节进入休眠模式时,它负责将中断发送到没有休眠的CPU。关闭irqbalance会将所有中断均衡的发送到所有cpu。
numa:非一致存储访问结构 (NUMA : Non-Uniform Memory Access) 也是最新的内存管理技术,它和对称多处理器结构 (SMP : Symmetric Multi-Processor) 是对应的。简单的队别如下:
numa的会导致数据库产生swap,严重影响性能。因为numa架构的CPU和内存是bind的,如果CPU自己node中的内存不够,就会导致swap的产生,即使此时其它node中有大量的空闲内存,它也不会去使用。这就是numa的一个缺陷。
在操作系统中关闭,可以直接在/etc/grub.conf的kernel行最后添加numa=off
interleave=all 其实是将NUMA架构的各个node中的内存,又重新虚拟成了一个共享的内存来进行分配,但是和SMP不同的是,因为每两个node之间有 inter-connect ,所以又避免了SMP架构总线争用的缺陷。
内存主要是要防止发生 swap。因为发生swap的话,从内存访问直接下降为硬盘访问,随机访问的速度下降10的6次方倍,也就是10万倍,顺序访问下降10倍左右。
防止发生swap:
①关闭CPU的numa,防止numa导致的swap;
②设置 vm.swappiness=1;在 /etc/sysctl.conf 中添加:vm.swappiness=1,然后 sysctl -p; 也可以 sysctl vm.swappiness=1临时修改,然后sysctl -p
注意:在RHEL/CentOS 6.4及更新的内核中 vm.swappiness = 0 的默认行为被修改了,如果继续设置vm.swappiness = 0,有可能导致系统内存溢出,从而导致数据库进程被意外kill掉。所以这里我们设置为 1 而不是传统的 0。
③ 设置 /proc/$(pidof -s 进程名)/oom_adj为较小的值(-15,-16或者-17)来尽量避免MySQL由于内存不足而被关闭
[root@localhost ~]# echo -17 > /proc/$(pidof 进程名)/oom_adj
[root@localhost ~]# cat /proc/$(pidof 进程名)/oom_adj
-17
注:这个oom_adj中的变量的范围为15到-16之间。越大越容易在内存不足时被kill。-17 则表示该进程不会被kill掉,当内存不足时,会kill其它进程。
④使用 hugepage 可以避免swap out; 但是 huagepage也是有代价的(导致page争用加剧)。
1、因为Linux默认会大量的进行文件cache,也就是将大量内存用于disk cache。这样的话,会影响数据库使用内存。所以我们可以调节disk cache在脏块达到多大的百分比时,进行刷新。vm.dirty_background_ratio=10;
默认值为10,表示disk cache中的脏页数量达到10%时,pdflush内核线程会被调用,异步刷新disk cache;
vm.dirty_ratio=20;
表示disk cache中的脏页数量达到20%时,会进行同步的disk cache刷新,从而会阻塞系统中应用进程的IO操作!我们可以调低vm.dirty_background_ratio来降低disk cache对mysql使用内存的影响,但是可能会增加磁盘IO,因为文件cache减少了,增加其他进程的page fault;(vm.dirty_background_ratio / vm.dity_ratio 带有backround表示异步刷新,没有带的是同步刷新。)
2.1 文件系统的调优 ( xfs > ext4 > ext3 )
1. ext3
(1)最多只能支持32TB的文件系统和2TB的文件,实际只能容纳2TB的文件系统和16GB的文件
(2)ext3目前只支持32000个子目录
(3)ext3文件系统使用32位空间记录块数量和i-节点数量
(4)当数据写入到Ext3文件系统中时,ext3的数据块分配器每次只能分配一个4KB的块
2. ext4
ext4是系统下的日志文件系统,是ext3文件系统的后继版本。
(1)ext4的文件系统容量达到1EB,而文件容量则达到16TB
(2)理论上支持无限数量的子目录
(3)ext4文件系统使用64位空间记录块数量和i-节点数量
(4)ext4的多块分配器支持一次调用分配多个数据块
3. xfs
(1)根据所记录的日志在很短的时间内迅速恢复磁盘文件内容
(2)采用优化算法,日志记录对整体文件操作影响非常小
(3) 是一个全64-bit的文件系统,它可以支持上百万T字节的存储空间
(4)能以接近裸设备I/O的性能存储数据
2.2 磁盘的调优
IO调度算法:服务器一定不要使用默认的CFQ调度算法。如果是SSD,那么应该使用NOOP调度算法,如果是磁盘,就应该使用Deadline调度算法。
修改方法:
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
[root@localhost ~]# echo noop > /sys/block/sda/queue/scheduler
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
[noop] anticipatory deadline cfq
这是临时修改,重启失效。永久修改,需要修改文件 /boot/grub/menu.lst 中的elevator=deadline 或者noop:
# vi /boot/grub/menu.lst
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
网络调优分为硬件层面和TCP/IP软件层面参数的调优。
①换延迟更小,throught更大的网卡;
②双网卡绑定,进行负载均衡和高可用;
[root@localhost ~]# echo 1>/proc/sys/net/ipv4/tcp_mem TCP全局缓存,单位为内存页(4k);
对应的内核参数:net.ipv4.tcp_mem ,可以在 /etc/sysctl.conf 中进行修改;
root@localhost ~]# echo 2>/proc/sys/net/ipv4/tcp_rmem 接收buffer,单位为字节
对应的内核参数:net.ipv4.tcp_rmem, 可以在 /etc/sysctl.conf 中进行修改;
root@localhost ~]# echo 3>/proc/sys/net/ipv4/tcp_wmem 接收buffer,单位为字节
对应的内核参数:net.ipv4.tcp_wmem, 可以在 /etc/sysctl.conf 中进行修改;
root@localhost ~]# echo 4>/proc/sys/net/core/rmem_default 接收buffer默认大小,单位字节
对应内核参数:net.core.rmem_default, 可以在 /etc/sysctl.conf 中进行修改;
root@localhost ~]# echo 5>/proc/sys/net/core/rmem_max 接收buffer最大大小,单位字节
对应内核参数:net.core.rmem_max, 可以在 /etc/sysctl.conf 中进行修改;
root@localhost ~]# echo 6>/proc/sys/net/core/wmem_default 发送buffer默认大小,单位字节
对应内核参数:net.core.rmem_default, 可以在 /etc/sysctl.conf 中进行修改;
root@localhost ~]# echo 7>/proc/sys/net/core/wmem_max 发送buffer最大大小,单位字节
对应内核参数:net.core.rmem_max, 可以在 /etc/sysctl.conf 中进行修改;
a、将tso,checksum等功能交给网卡硬件来完成:
ethtool -K eth0 rx on|off
ethtool -K eth0 tx on|off
ethtool -K eth0 tso on|off
b、调大网卡的接收队列和发送队列:
接收队列:/proc/sys/net/core/netdev_max_backlog 对应内核参数:net.core.netdev_max_backlog
c、发送队列:
查看大小:ifconfig eth0 | grep txqueue
修改大小:ifconfig eth0 txqueuelen 20000
d、调大 SYN 半连接 tcp_max_syn_backlog 数量:
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
也可以在/etc/sysctl.conf文件中配置。
e、net.core.somaxconn:
该参数为完成3次握手,已经建立了连接,等待被accept然后进行处理的数量。默认为128,我们可以调整到 65535,甚至更大。也就是尅有容纳更多的等待处理的连接。
a、 如果TCP连接的两端的网卡和网络接口层都支持大的MTU,那么我们就可以配置网络,使用更大的mtu大小,也不会导致被 切割重新组装发送。
配置命令:ifconfig eth0 mtu 9000 up
b、TCP连接的 CLOSE_WAIT 和 TIME_WAIT
如果TCP连接的 CLOSE_WAIT 和 TIME_WAIT 状态过多时,分别需要调优TCP的keepalive相关的参数和TCP的回收相关的参数。更多详细参照系统手册进行调整。
Linux系统中存在各种各样的后台daemon,也就是各种service,对于DM数据库服务器来说很多没有必要的service就可以通通关闭掉。以mysql为例子,Mysql的最小化的后台服务,可以只有:crond,sshd,rsyslog,network,sysstat,如果有需要可以在增加其他服务。使用 chkconfig --level 35 servicename off; 可以进行关闭。(35表示在runlevel的level =3 和 level =5级别进行关闭。)
一般而言,我们很容易在 open files 上被限制,DM数据库要求如下:
根据我的工作经验,我们一般尽可能地把相关参数进行一此全面的调整,我们可以临时修改和永久修改。具体相关参数解释如下:
下图是ulimit 命令参数临时修改及含义:
1、临时修改
通过-Sn/-Hn设置最大打开文件描述符数的soft/hard,注意soft必须小于hard
# ulimit -Sn 65537
# ulimit -Hn 65538
同时设置soft和hard。对于非root用户只能设置比原来小的hard。
# ulimit -n 180000
2、永久修改
/etc/security/limits.conf是linux资源限制配置文件,需要在root权限下,才能修改/etc/security/limits.conf文件。
永久修改,需要修改文件 /etc/security/limits.conf, 加上:
* soft nofile 65536
* hard nofile 65536
修改之后,还需要在 vi /etc/pam.d/login 最后加上一行:
session required pam_limits.so (用户登录即加载limit配置生效用户)。
注意:/etc/security/limits.d/90-nproc.conf 与 /etc/security/limits.conf 都是系统用户资源配置文件,两者有什么不一样呢?
/etc/security/limits.conf 配置文件可限制文件打开数,系统进程等资源,在该文件配置中写的最大用户进程数是受/etc/security/limits.d/90-nproc.conf(有些操作系统是20-nproc.conf)配置上限影响的。一般系统普通用户进程数满了都是修改/etc/security/limits.d/90-nproc.conf文件。
SELinux(Secure Enhanced Linux)安全增强的Linux是由美国国家安全局NSA针对计算机基础结构安全开发的一个全新的Linux安全策略机制。SELinux可以允许系统管理员更加灵活的来定义安全策略。
SELinux是一个内核级别的安全机制,从Linux2.6内核之后就将SELinux集成在了内核当中,因为SELinux是内核级别的,所以我们对于其配置文件的修改都是需要重新启动操作系统才能生效的。现在主流发现的Linux版本里面都集成了SELinux机制,CentOS/RHEL都会默认开启SELinux机制。
①、[root@localhost ~]# /usr/sbin/sestatus -v #如果SELinux status参数为enabled即为开启状态
SELinux status: enabled
②、[root@localhost ~]# getenforce ##也可以用这个命令检查
① 临时关闭(不用重启机器):
[root@localhost ~]# setenforce 0 ##设置SELinux 成为permissive模式
[root@localhost ~]# setenforce 1 ##设置SELinux 成为enforcing模式
② 永久修改配置文件需要重启机器:
[root@localhost ~]# vi /etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled ,最后需要reboot生效。
至于为何建议关闭selinux具体原因,是由于SElinux可能会处于安全考虑产生诸多问题与阻止性错误。
一般建议关闭防火墙策略,避免造成端口telnet不通或者TCP发送包不全受限制等因素导致数据库链接传输和握手问题的产生。不同版本的操作系统命令有所区别,以centos 为例,6.5以下是iptables,6.5以上是firewalld。
①查看防火墙状态
[root@localhost ~]# service iptables status
②暂时关闭防火墙
[root@localhost ~]# service iptables stop
③永久关闭防火墙
[root@localhost ~]# chkconfig iptables off
①查看防火状态
[root@localhost ~]# systemctl status firewalld
②暂时关闭防火墙
[root@localhost ~]# systemctl stop firewalld
③永久关闭防火墙
[root@localhost ~]# systemctl disable firewalld
以上关于数据库在Linux平台几方面调优大概包含这几方面,具体调整还需要根据实际使用过程中具体监控使用情况进行调整,从微调到正确调整。
DM 武汉达梦数据库股份有限公司 24小时免费服务热线:400 991 6599
达梦技术社区:https://eco.dameng.com