通用方案:专有云内核参数优化方法

通用方案:专有云内核参数优化方法

更新时间:2020-06-11 16:12:33

1. 概述

本文主要介绍在专有云环境中,pid_max和nf_conntrack_max内核参数的优化方法。

1.1. 适用范围

  • 专有云V2,基础组件

  • 专有云V3,基础组件

    说明

    • 适用于专有云V2,V3版本的Docker宿主机。
    • nf_conntrack参数适用于专有云V3环境的OPS服务器。在全新部署的专有云V3.6及之后的版本中,天基集群为7U的环境不需要修改参数,但升级到专有云V3.6及之后的版本需要修改参数。
    • 适用于所有5U、6U操作系统,但是不含7U操作系统。

1.2. 风险说明

  • 在业务低峰期进行操作。
  • 执行灰度策略时,建议逐台进行操作,中间间隔1个小时。修改下一台物理机参数时,需要登录上一台物理机执行top命令,验证top命令是否正常执行,并且验证天目控制台和天基控制台的状态是否正常。

1.3. 用户告知

  • 如果系统中的参数值高于本文涉及到的参数值,则不必进行更改。
  • 如果系统中的参数值低于本文涉及到的参数值,则更改为本文涉及到的参数值。
  • 本文中net.netfilter.nf_conntrack_max参数调整方法只适用于专有云V3环境的OPS1机器,其他Docker宿主机在专有云V3.6及之前的版本中没有net.netfilter.nf_conntrack_max参数,可不必修改此参数值。
  • 本文涉及到的IP地址等信息请根据现场实际情况进行设置。
  • kernel.pid_max参数的推荐值为131072,该参数限制了进程和线程打开数,解决messages日志中“cannot allocate memory”和“error(can't fork)”的报错问题。如果系统达到pid_max参数的推荐值会导致无法启动新进程和线程,并且导致Docker容器内服务无法正常工作,从而影响终态。
  • net.netfilter.nf.conntrack_max参数的推荐值为2097152,该参数关联最大连接跟踪表,解决dmesg程序中的table fulldropping packet等问题。如果达到nf_conntrack.max参数的推荐值会无法执行某些PING操作,影响天基对集群物理机状态判断的准确性,从而影响终态。

2. 问题描述

在专有云环境中的5U、6U操作系统中,部分内核参数较小会影响系统的性能和功能,因此通过优化pid_max和nf_conntrack_max内核参数,以保障系统正常运行。

3. 解决方案

3.1. 环境检查

获取Docker宿主机IP地址

参考以下步骤,获取Docker宿主机IP地址,由于本文分为专有云V2和V3环境,请根据现场环境选择对应的步骤。

  • 专有云V2环境

  1. 登录DMSAG,执行以下命令,查看tinamu_api容器的ID。

    docker ps | grep tianmu_api

    系统返回类似如下,获得tianmu_api容器的ID为[$Tianmu_ID]。

  1. 执行以下命令,查看tianmu_api的配置文件路径。

    docker inspect [$Tianmu_ID] | grep L1ROOT

    系统返回类似如下,获取并记录tianmu_api配置文件路径。

    "L1ROOT=[$L1ROOT_Catalog]"
  1. 登录DMSAG,依次执行以下命令,获取Docker宿主机的IP地址列表,并保存在host-tj文件中。

    cd [$L1ROOT_Catalog]/L1tools/main/config
    cat rtable.csv | grep -v sn_ | egrep docker | egrep --color "standard|back" | awk -F, '{print $6}' >/tmp/host-tj

    说明:[$L1ROOT_Catalog]为上一步记录的tianmu_api配置文件路径。

  • 专有云V3环境
  1. 登录OPS1,如何登录OPS1,请参见专有云如何登录OPS服务器
  2. 执行如下命令,获取Docker宿主机的IP地址列表,并保存在 host-tj 文件中。

    curl 'localhost:7070/api/v3/column/m.id?m.project=tianji' 2>/dev/null|grep id|awk '{print $2}'|grep -v vm|sed 's/[",]//g'|grep -v `hostname` >/tmp/host-tj

获取OS版本信息

登录服务器,执行以下命令,验证内核版本。

pssh -ih /tmp/host-tj 'uname -r | egrep -q "5.x86_64|6.x86_64"' | grep SUCCESS | awk -F " " '{print $4}' >/tmp/host-tj-5u6u

获取所有宿主机的内核参数

本步骤主要记录宿主机的内核参数,以用于回滚方案时使用。

  • 专有云V2环境
  1. 登录DMSAG服务器。
  2. 执行pssh -ih /tmp/host-tj-5u6u 'sysctl -a |grep pid_max'命令,获取并记录pid_max的值和参数值小于131072的宿主机。
  • 专有云V3环境
  1. 登录OPS1服务器。
  2. 执行sysctl -a |grep nf_conntrack_max命令,获取并记录nf_conntrack_max的值和参数值小于2097152的宿主机。

3.2. 实施步骤

修改pid_max参数

逐台登录 环境检查 中记录的Docker宿主机,依次执行以下命令,修改pid_max参数。

sysctl -w kernel.pid_max=131072
cp /etc/sysctl.conf /etc/sysctl.conf.bak
echo "kernel.pid_max = 131072" >>/etc/sysctl.conf

注意:建议使用pssh命令进行修改。环境规模较小的可分三批进行操作,环境规模较大的可分五批进行操作。例如在获取OS版本信息中,将5U、6U系统内kernel.pid_max参数小于131072的机器整理成列表,建议将此列表按灰度分成3到5个列表文件,再使用pssh命令分批修改参数。以将/tmp/host-tj-5u6u-1列表文件为第一批进行举例,可依次执行如下命令。

pssh -ih /tmp/host-tj-5u6u-1 "sysctl -w kernel.pid_max=131072"
pssh -ih /tmp/host-tj-5u6u-1 "echo 'kernel.pid_max = 131072' >>/etc/sysctl.conf"

修改nf_conntrack_max参数

  1. 当在专有云V3环境中时,登录OPS1服务器,依次执行以下命令,修改nf_conntrack_max参数。
sysctl -w net.netfilter.nf_conntrack_max=2097152
cp /etc/sysctl.conf /etc/sysctl.conf.bak
echo "net.netfilter.nf_conntrack_max = 2097152" >>/etc/sysctl.conf

注意:由于加载nf_conntrack内核模块之后才生成nf_conntrack_max参数,在OPS1服务器中启动特定Docker之后,才出现此nf_conntrack.max参数,所以在某些情况下只写入/etc/sysyctl.conf文件无法实现开机设置此参数,还需要添加脚本保证下次重启时此参数生效。但在5U,6U环境中默认rc.local开机启动nf_conntrack模块。

  1. 执行vim /etc/rc.d/rc.local命令,进入编辑器,添加以下文件内容,保存并退出。
modprobe nf_conntrack
sysctl -w net.netfilter.nf_conntrack_max=2097152

系统显示类似如下。
image.png

3.3. 结果验证

确认内核参数修改生效

  1. 登录服务器,执行以下命令,确认所有Docker宿主机中的pid_max参数值已调整为131072。

    pssh -ih /tmp/host-tj-5u6u 'sysctl -a |grep pid_max'
  1. 登录OPS1服务器,执行以下命令,确认nf_conntrack_max参数值已调整为2097152。

    sysctl -a |grep nf_conntrack_max

确认“/proc”目录下的内核参数修改生效

  1. 登录服务器,执行以下命令,确认pid_max参数值已调整为131072。

    pssh -ih /tmp/host-tj-5u6u 'cat /proc/sys/kernel/pid_max'
  1. 登录OPS1服务器,执行以下命令,确认nf_conntrack_max参数值已调整为2097152。

    cat /proc/sys/net/netfilter/nf_conntrack_max

4. 回滚方案

回滚pid_max参数

  1. 逐台登录环境检查中记录的Docker宿主机,执行以下命令,修改pid_max参数。

    sysctl -w kernel.pid_max=[$Pid_Max]

    说明:[$Pid_Max]为3.1. 环境检查中记录的Dokcer宿主机对应的pid_max的值。

  2. 执行以下命令,进入指定配置文件,删除kernel.pid_max=131072字段,并保存退出。

    vim /etc/sysctl.conf

回滚nf_conntrack_max参数

  1. 登录OPS1服务器,执行以下命令,修改nf_conntrack_max参数。

    sysctl -w net.netfilter.nf_conntrack_max=[$Nf_Conntrack_Max]

    说明:[$Nf_Conntrack_Max]为3.1. 环境检查中记录的nf_conntrack_max的值。

  2. 执行以下命令,进入指定配置文件,删除net.netfilter.nf_conntrack_max=2097152字段,并保存退出。

    vim /etc/sysctl.conf
  3. 执行vim /etc/rc.d/rc.local命令,进入编辑器,删除以下字段,保存并退出。
modprobe nf_conntrack
sysctl -w net.netfilter.nf_conntrack_max=2097152

5. 补充说明

7U环境中设置rc.local开机启动的命令如下。

modprobe nf_conntrack
sysctl -w net.netfilter.nf_conntrack_max=2097152