跳转至

操作系统参数调整

操作系统配置

本章描述如何为SeaboxMPP准备操作系统环境,并在所有SeaboxMPP数据库的节点上安装数据库软件二进制文件。 需按顺序执行以下任务:

除非另有说明,上述任务应对SeaboxMPP数据库集群中的所有节点执行(包括coordinator节点和executor节点)。

关闭SELINUX及防火墙

关闭SELinux

所有SeaboxMPP数据库集群的节点SELinux必须关闭。 参照以下步骤:

  1. 使用root用户,检查SELinux状态:
# sestatus
SELinuxstatus: disabled
  1. 如状态不是disabled,通过编辑/etc/selinux/config文件,禁用SELinux。使用root用户,按下述示意在配置文件中更改SELINUX配置参数的值:
SELINUX=disabled
  1. 如操作系统中安装了SSSD服务(System Security Services Daemon),编辑SSSD的配置文件将selinux_provider参数值设置为none,以防止SELinux-related SSH机制拒绝禁用SELinux。使用root用户编辑/etc/sssd/sssd.conf文件并增加以下参数:
selinux_provider=none
  1. 重启操作系统使/etc/selinux/config修改生效,并且确保SELinux已禁用。

关于禁用SELinux的相关信息,请查阅SELinux文档。

关闭防火墙

同样,须关闭防火墙软件firewalld(RHEL/CentOS7.x操作系统)。按以下步骤执行:

系统防火墙为firewalld,使用如下命令检查firewalld服务状态:

# systemctl status firewalld

如firewalld服务已禁用,命令输出为:

firewalld.service - firewalld - dynamic firewall daemon Loaded: 
loaded (/usr/lib/systemd/system/firewalld.service; disabled;vendor preset: enabled)
Active: inactive (dead)

如未关闭, root用户执行以下命令禁用firewalld:

# systemctl stop firewalld.service

# systemctl disable firewalld.service

了解更多防火墙软件信息,请查阅防火墙相关文档或操作系统相关文档。

调整操作系统参数

SeaboxMPP要求在数据库系统中的所有节点上设置linux操作系统(OS)特定参数。

通常,下述类型系统参数需要调整:

  • 共享内存

操作系统内核的共享内存段大小须设置正确,否则SeaboxMPP数据库实例将无法工作。对于SeaboxMPP数据库,大多数操作系统安装后默认的共享内存值设置得太低,同时还必须禁用oom机制(out of memory)。

  • 网络

在大容量SeaboxMPP数据库集群中,必须设置某些与网络相关的调节参数,来优化Interconnect组件的网络连接。

  • 用户Limits参数

用户limits参数控制通过用户shell启动进程的可用资源。SeaboxMPP数据库对单个进程可以打开的文件描述符的允许数量要求更高的要求。操作系统默认设置可能会因文件描述符步骤导致一些数据库查询失败。

/etc/hosts设置

编辑/etc/hosts文件,确保该文件中包含SeaboxMPP数据库集群的每台服务器的主机名和所有网络接口名。

Sysctl内核参数设置

在配置文件/etc/sysctl.conf中设置以下参数,调整后通过sysctl -p命令生效:

# kernel.shmall = _PHYS_PAGES / 2 # 参照注1
kernel.shmall = 4000000000
# kernel.shmmax = kernel.shmall * PAGE_SIZE # 参照注1
kernel.shmmax = 500000000
kernel.shmmni = 4096
vm.overcommit_memory = 0
vm.overcommit_ratio = 95
net.ipv4.ip_local_port_range = 10000 65535 # 参照注2
kernel.sem = 500 2048000 200 40960
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.all.arp_filter = 1
net.ipv4.ipfrag_high_thresh = 5368709120  # 参照注3
net.ipv4.ipfrag_time = 5 # 参照注3
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
vm.swappiness = 10
vm.zone_reclaim_mode = 0
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
vm.dirty_background_ratio = 0 # 参照注3
vm.dirty_ratio = 0
vm.dirty_background_bytes = 1610612736
vm.dirty_bytes = 4294967296

注:以上列出的sysctl参数适用于常见各种环境,但是这些设置在特定情况下可能需要更改。以下是其中某些参数的附加注释。

  1. kernel.shmall参数用来设置在操作系统范围内使用的共享内存页的总数(以页为单位),kernel.shmmax设置单个共享内存段的最大大小(以字节为单位)。

    需根据系统的物理内存和页大小来设置kernel.shmallkernel.shmax值。通常,这两个参数的值都建议设置为系统物理内存的一半,可使用操作系统变量_PHYS_PAGES和PAGE_SIZE计算参数值。

    kernel.shmall = ( _PHYS_PAGES / 2)
    kernel.shmmax = ( _PHYS_PAGES / 2) * PAGE_SIZE
    

    可通过系统终端运行以下2个命令来计算kernel.shmall和kernel.shmax参数的值,getconf命令可获取操作系统变量的值。

    $ echo $(expr $(getconf _PHYS_PAGES) / 2)
    $ echo $(expr $(getconf _PHYS_PAGES) / 2 \* $(getconf PAGE_SIZE))
    

    在实际项目中,建议使用计算出来的值来设置sysctl.conf中的这2个参数,例如,某节点有1583GB内存,该节点_PHYS_PAGES=395903676,PAGE_SIZE=4096,那么kernel.shmallkernel.shmax参数的值应被设置为:

    kernel.shmall = 197951838
    kernel.shmmax = 810810728448
    

    如果master节点共享内存配置与executor节点不同,导致系统变量_PHYS_PAGES和_PHYS_SIZE值不同,那么master节点这两参数值可与executor节点不同。

  2. 在初始化SeaboxMPP数据库时,为了避免数据库与其他程序之间的端口冲突,请勿在操作系统参数net.ipv4.ip_local_port_range指定数据库的端口在该参数范围内。例如,net.ipv4.ip_local_port_range=10000 65535,则可以将SeaboxMPP数据库的基本端口号设置为以下值:

    net.ipv4.ip_local_port_range=10000 65535
    

    关于SeaboxMPP数据库使用的相关端口情况,请参考SeaboxMPP数据库初始化章节。

  3. SeaboxMPP数据库executor实例之间的数据传输默认使用使用UDP协议,此时网卡控制数据包的分段和重组。 如果UDP消息的大小大于网络的最大传输单元(MTU)的大小,则IP层会将消息分段,接收方必须将片段存储在缓冲区中,然后才能重新组织和重组消息。 以下sysctl.conf操作系统参数控制重组过程:

    参数 描述
    net.ipv4.ipfrag_high_thresh 在内核开始移除碎片以释放资源之前,用于重组IP片段的最大内存量。默认值为4194304字节(4MB)。
    net.ipv4.ipfrag_time 将IP片段保留在内存中的最长时间(秒)。默认值为30。

    通常生产环境服务器使用万兆网络,上述参数建议设置如下:

    ` bash net.ipv4.ipfrag_high_thresh = 5368709120 net.ipv4.ipfrag_time = 5

  4. 服务器内存超过64GB时,以下参数建议设置:

    vm.dirty_background_ratio = 0
    vm.dirty_ratio = 0
    vm.dirty_background_bytes = 1610612736 # 1.5GB
    vm.dirty_bytes = 4294967296 # 4GB
    

    服务器内存小于等于64GB时,删除vm.dirty_background_bytes和vm.dirty_bytes这两个参数,并且设置以下2个相关比例的参数:

    vm.dirty_background_ratio = 3
    vm.dirty_ratio = 10
    
  5. 调大vm.min_free_kbytes值,确保可满足网络及存储驱动程序的PF_MEMALLOC请求。该参数调整,对内存很大的系统尤为重要,大内存系统中,该参数的默认值通常太低。使用以下awk命令来设置vm.min_free_kbytes的值为物理内存的3%:

    awk 'BEGIN {OFMT = "%.0f";} /MemTotal/ {print "vm.min_free_kbytes =", $2 * .03;}' /proc/meminfo >> /etc/sysctl.conf
    

    不要将vm.min_free_kbytes的值设置为高于系统内存的5%,这样做可能会导致内存不足。

系统资源limits参数

limits配置 在/etc/security/limits.conf配置文件中设置以下参数:

* soft nofile 524288
* hard nofile 524288
* soft nproc 131072
* hard nproc 131072

对于RHEL或CentOS 7.x操作系统,配置文件/etc/security/limits.d/20-nproc.conf中的配置会覆盖limits.conf文件中设置的值.需确保以上参数值在这些覆盖读取的配置文件中也被设置同同样的值。

Linux内核pam_limits模块先从limits.conf配置文件中读取参数值,后从覆盖文件中读取参数值来设置。有关PAM和用户limits的信息,请参阅PAM和pam_limits相关文档。

在每个executor节点上执行ulimit -u命令来显示每个用户的最大允许线程数,验证返回值是否为131072.

XFS文件系统挂载选项配置

XFS是Linux平台上用于数据存储首选的文件系统。建议使用以下XFS挂载选项:

rw,nodev,noatime,nobarrier,inode64

XFS挂载选项可在/etc/fstab文件中设置.以下是通过fstab文件指定XFS挂载选项的示例:

/dev/data /data xfs nodev,noatime,nobarrier,inode64 0 0
磁盘预读设置

每个磁盘设备文件需设置预读(blockdev)大小为16384。查看某磁盘设备的预读值命令为:

# /sbin/blockdev --getra devname

例如:

# /sbin/blockdev --getra /dev/sdb

设置某磁盘设置预读命令为:

# /sbin/blockdev --setra bytes devname

例如:

# /sbin/blockdev --setra 16384 /dev/sdb

blockdev命令的更多用法及信息请参考man手册(man blockdev)。

注意:blockdev –setra命令是非持久化的,操作系统重启均需重新执行。如何运行该命令因操作系统而异,但必须确保每次系统重新启动时都执行该预读设置。

设置磁盘I/O调度策略

Linux支持磁盘I/O调度策略不同的策略,如cfq、as及deadline,要求设置为deadline策略。修改当前系统的磁盘I/O调度策略可通过以下命令(重启后失效):

# echo schedulername > /sys/block/devname/queue/scheduler

例如:

# echo deadline > /sys/block/sbd/queue/scheduler

注意:通过上述命令设置磁盘I/O调度策略也是非持久化的,重启操作系统后须重新设置。如使用上述命令设置该策略,须确保操作系统启动时命令被执行。不同操作系统如何执行该命令的方式不同。

启动时设置I/O调度策略的方式是设置启动内核参数elevator。在GRUB配置文件/boot/grub/grub.conf中的kernel命令添加参数elevator=deadline。以下是RHEL或CentOS系统中,grub.conf配置文件修改的示例,为增加可读性,该命令显示为多行。

kernel /vmlinuz-2.6.18-274.3.1.el5 ro root=LABEL=/ elevator=deadline crashkernel=128M@16M quiet console=tty1 console=ttyS1,115200 panic=30 transparent_hugepage=never 
initrd /initrd-2.6.18-274.3.1.el5.img

在RHEL或CentOS7.x系统中,系统启动时设置I/O调度策略可直接使用grubby系统工具,root用户运行该命令可添加参数到配置文件中。

# grubby --update-kernel=ALL --args="elevator=deadline"

添加参数后,重启操作系统。以下grubby命令可显示已设置的kernel参数.

# grubby --info=ALL

关于grubby工具的更多信息,请查看操作系统文档。如执行grubby命令未能更新kernel的启动参数,请参考本章末的注意。

禁用透明大页(Transparent Huge Pages,THP)

在RHEL或CentOS 7.x系统中,可使用grubby系统工具,root用户运行该命令可添加参数到配置文件中。

# grubby --update-kernel=ALL --args="transparent_hugepage=never"

添加参数后,重启操作系统。以下命令可检查THP的状态,其输出表示THP已被禁用。

$ cat /sys/kernel/mm/*transparent_hugepage/enabled
always [never]

关于THP或grubby工具的更多信息,请参见操作系统文档。如执行grubby命令未能更新kernel的启动参数,请参考本章节末的注意。

SSH参数配置

部分SeaboxMPP数据库管理工具,包括scexpand、scnitsystem和scaddmirrors,执行相关操作需通过节点之间的SSH(secure shell)连接执行命令。在大规模SeaboxMPP数据库集群部署、云部署或每个executor节点具有较多segment实例的部署中,这些管理工具可能超过服务器设置的未认证连接最大阈值。发生这种情况时,会收到如下报错:

ssh_exchange_identification:Connection closed by remote host..

需对所有部署SeaboxMPP数据库的节点调大该连接阈值,修改ssh守护进程配置文件/etc/ssh/sshd_config(或/etc/sshd_config)中的ssh maxstartups配置参数。

如配置文件中MaxStartups配置值为单个整,则修改该值。如:

MaxStartups 200

如配置文件中MaxStartups配置值为 "start:rate:full"格式,ssh守护进程会随机drop较早的连接。"start:rate:full"中的start标识了允许未经处理的SSH尝试连接的最大数量,一旦未经验证的尝试连接数量达到start数,SSH守护进程拒绝rate%的后续尝试连接,full用来识别未经验证的尝试连接的最大数量,超过full的所有尝试连接都会被拒绝。例如:

MaxStartups 10:30:200

修改ssh MaxStartups配置后须重启ssh守护进程。RHEL/CentOS6操作系统中,root用户执行以下命令:

# systemctl restart sshd.service

注:RHEL/CentOS7.x系统中,如grubby命令不更新kernel启动选项,则需手动更新系统上的所有kernel启动选项。例如,要将参数"transparent_hugepage=never"添加到系统上所有的kernel启动选项。 1. 在配置文件/etc/default/grub中的GRUB_CMDLINE_LINUX行中添加参数:

``` text
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=cl/root
rd.lvm.lv=cl/swap rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"
```
  1. 使用root用户运行grub2-mkconfig命令更新所有kernel启动选项:

    # grub2-mkconfig -o /boot/grub2/grub.cfg/
    
  2. 重启操作系统。

网络设置

MTU相关设置

MTU是指网络设备能接收的最大帧大小。巨型帧是指大于1500字节的帧。和大多数MPP类型数据库相同,我们推荐使用巨型帧以减少中断和系统调用的次数。对于SeaboxMPP数据库而言,有以下三个MTU限制

  1. 数据库参数sc_max_packet_size, 默认值为8192。这是在使用巨型帧网络环境下的默认配置。

  2. 操作系统的MTU。

  3. 交换机的MTU。

以上限制是相互关联的,我们推荐使用数据库<操作系统<=交换机的配置。绝大多数网络设备和操作系统都能支持9000字节的巨型帧,如果配置环境不支持,我们推荐修改sc_max_packet_size以满足以上说明,对于MTU为1500字节的网络而言,sc_max_packet_size应修改为1472。

如果sc_max_packet_size大于操作系统MTU,会由操作系统负责对数据包进行分片和重组,随着集群规模的扩大,操作系统分片重组占用CPU和内存资源也会相应上涨。更严重的是,对于单个数据包而言,任意分片的丢失都会造成整个数据包的丢失。所以,目前最好的部署方式是按照MTU的大小配置sc_max_packet_size,尽可能不分片。

如果将sc_max_packet_size调整为默认值(8192)以下的配置,可能会造成系统调用次数过多,降低网络性能。此外,不同版本的操作系统内核对于网络系统调用的吞吐量也不同,当sc_max_packet_size小于默认值时,会更容易达到操作系统的上限,造成网络瓶颈。以配置为1472为例,3.10和4.19的内核UDP包吞吐量差距在一倍左右。

创建SeaboxMPP数据库的系统管理员账号

必须在所有节点上创建专用的操作系统用户帐户才能运行SeaboxMPP数据库,并通过此操作系统用户管理数据库。以下命令,均使用名为seabox进行安装。

  • SeaboxMPP数据库服务不允许使用root用户运行

  • seabox用户必须拥有安装和运行SeaboxMPP数据库需要的系统服务、目录的相关权限

  • 使用root用户运行groupadd、useradd及passwd命令来创建seabox操作系统用户

注:确保所有节点上seabox用户具有相同的用户ID(uid)和组ID(gid),以防一些脚本或服务使用这些ID进行标识或判断权限而出现问题。例如,如果不同的executor节点上有不同的uid或gid,那么将SeaboxMPP数据库备份到某些网络文件系统或存储设备可能会失败。创建seabox组和用户时,可使用groupadd -g选项指定gid号,使用useradd -u选项指定uid号。使用命令id seabox查看当前主机上seabox用户的uid和gid。 以下是创建操作系统seabox组及系统账户seabox的示例:

# groupadd seabox
# useradd seabox -r -m -g seabox
# passwd seabox
New password: <changeme>
Retype new password: <changeme>

系统时钟同步

需在所有SeaboxMPP数据库的服务器上使用NTP(Network Time Protocol)服务同步系统时钟,关于NTP的更多信息请登录www.ntp.org。

executor节点的NTP服务使用某个coordinator节点作为主时间源,而另一个coordinator节点可作为第二时间源,这2个coordinator节点上的NTP指向已有的时间服务器。

可在集群完成安装后,使用scssh进行所有节点统一配置。

配置NTP步骤如下:

  1. Root用户登录第一个coordinator节点(scnode1),编辑配置文件/etc/ntp.conf,设置server参数指向数据中心的NTP时间服务器。例如(假定10.6.220.20是数据中心时间服务器的IP地址):

    server 10.6.220.20
    
  2. 在所有executor节点上,使用root用户登录并修改配置文件/etc/ntp.conf ,设置第一个server参数指向第一个coordinator节点主机名(scnode1),设置第二个server参数指向第二个coordinator节点主机名(scnode2),例如:

    server scnode1 prefer
    server scnode2
    
  3. 在第二个coordinator节点上(scnode2),使用root用户登录并修改配置文件/etc/ntp.conf ,设置第一个server参数指向第一个coordinator节点主机名,设置第二个server参数指向数据中心时间服务器,例如:

    server scnode1 prefer
    server 10.6.220.20
    
  4. 第一个coordinator节点(scnode1)上,执行scssh命令使用NTP守护进程同步系统时钟,例如:

    # scssh -f hostfile_scssh_allhosts -v -e 'ntpd'
    

本地化设置

SeaboxMPP数据库运行以下功能时,依赖操作系统本地化设置:

  • 使用操作系统的本地化功能提供的特定于语言的排序、数字格式等

  • 支持不同语言的多字节字符集以及服务端与客户端不同字符集的转换功能。

为确保所有字符集功能运行完全一致,建议所有安装SeaboxMPP数据库的节点本地化设置保持一致。

以下命令可查看当前操作系统本地化设置:

[root@scnode2 ~]# localectl status
   System Locale: LANG=zh_CN.UTF-8
       VC Keymap: cn
      X11 Layout: cn

如节点间设置不一致,需设置为一致,建议设置为en_US.UTF-8或zh_CN.UTF-8。

设置本地化配置命令如下:

[root@scnode2 ~]# localectl set-locale LANG=zh_CN.UTF-8

时区设置

SeaboxMPP数据库可从一组内部存储的时区中选择其中之一使用。可用的时区取自Internet Assigned Numbers Authority(IANA)时区库。如未指定数据库时区值时,SeaboxMPP数据库在启动时自动从服务器操作系统设置的时区获取当前可用时区。虽然在数据库安装及初始化后可通过seabox config命令调整TimeZone参数的值,但仍强烈建议安装前确保所有节点时区设置是一致和正确的。

以下命令可查看当前操作系统时区设置:

[root@scnode2 ~]# timedatectl status
      Local time: 四 2021-04-22 18:36:56 CST
  Universal time: 四 2021-04-22 10:36:56 UTC
        RTC time: 四 2021-04-22 10:36:56
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

如有节点不一致或配置与当前地区不一致,建议统一为相同设置。在中国地区,建议都设置为:Asia/Shanghai

[root@scnode2 ~]# timedatectl  set-timezone Asia/Shanghai