鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

系统调优

网络性能调优

目的

本次测试网卡采用以太网标卡-25GE(Hi1822)-四端口-SFP+,以该网卡为例对网卡配置参数进行优化以达到最佳性能。

方法

优化方法主要包含调节网卡参数和中断绑核(即将网卡中断绑定到网卡所在物理CPU上),具体优化项如表1所示:

表1 网卡参数配置

参数名称

参数含义

优化建议

irqbalance

系统中断均衡服务,会自动将网卡软中断分配到相对空闲的CPU上。

默认值:active

现象:开启状态下系统会自动将网卡软中断分配到相对空闲的CPU上

修改建议:

  • 关闭irqbalance,将该参数设置为“inactive”
    1
    systemctl stop irqbalance
    
  • 通过设置为重启服务器后默认关闭。
    1
    systemctl disable irqbalance
    

rx_buff

“rx_buff”接收缓冲区,用于临时存储从网卡硬件接收的数据包,聚合较大的网络报文需要多篇不连续的内存空间,内存利用率低,增大该项可以提高内存利用率。

默认值:2

现象:默认值为2时中断会消耗较多的CPU资源

修改建议:通过加载参数的方式,配置“rx_buff”的大小,减少不连续的内存,提高内存利用率,提高性能,调整为“8”。具体操作见表后。

ring_buffer

“ring_buffer”环形缓冲区,网卡硬件和驱动之间的队列,存储待处理的数据包描述符,通过增加网卡buffer大小可以增加吞吐量。

默认值:1024

现象:通过ethtool -g <网卡名称> 查看

修改建议:将“ring_buffer”队列大小调整为4096。具体操作见表后。

lro

Large Receive Offload,打开后会将多个小包聚合为一个大包以提高效率。

默认值:off

现象:打开后最大吞吐量明显上升

修改建议:打开“large-receive-offload”功能,调高网络包收发效率。具体操作见表后。

hinicadm lro -i hinic0 -t 256

表示最大256微秒后将收到的包聚合发出,调整为256微秒。

默认值:16微秒

现象:配合lro功能使用

修改建议:调整为256微秒

hinicadm lro -i hinic0 -n 32

表示最大收到32个包后将聚合的包发出,设置为32个包。

默认值:4个包

现象:配合lro功能使用

修改建议:设置为32个包

  • 调整rx_buff:
    1. 进入路径“/etc/modprobe.d”
      1
      cd /etc/modprobe.d
      
    2. 新建hinic.conf。
      1
      vim /etc/modprobe.d/hinic.conf
      
      并增加以下内容:
      1
      options hinic rx_buff=8
      
    3. 重新加载驱动。
      1
      2
      rmmod hinic
      modprobe hinic
      
    4. 检查是否成功修改rx_buff为8。
      1
      cat /sys/bus/pci/drivers/hinic/module/parameters/rx_buff
      
  • 修改ring_buffer大小:
    1. 将buffer大小由默认的1024调整为4096。
      1
      ethtool -G <网卡名称> rx 4096 tx 4096
      
    2. 查看当前buffer大小。
      1
      ethtool -g <网卡名称>
      
  • 打开lro:
    1. 打开网卡lro功能。
      1
      ethtool -K <网卡名称> lro on
      
    2. 检查是否成功打开。
      1
      ethtool -k <网卡名称> | grep large-receive-offload
      

除了以上优化参数以外,还需要将网卡软中断绑核:

  1. 关闭irqbalance服务。
  2. 查询网卡归属于哪个NUMA节点。
    1
    cat /sys/class/net/ <网口名> /device/numa_node
    
  3. 查询该NUMA节点对应哪些CPU core
    1
    lscpu
    
  4. 查询网卡中断号(IN200网卡参考网口名为hns3,其他网卡可通过ip a命令进行网口名查询,或寻找对应网卡支持)。

    一般情况下网卡中断号可通过如下命令查询:

    1
    cat /proc/interrupts | grep <网口名> | awk -F ':' '{print $1}'
    

    但有些情况下不支持上述查询命令,需要通过网卡“bus-info”信息获取对应的中断号,以下步骤为通过“bus-info”信息获取对应的中断号。

    • 通过ethtool获取网卡信息。
      1
      ethtool -i <网口名>
      
    • 根据网卡的“bus-info”获取对应的中断号。
      1
      cat /proc/interrupts |grep <bus-info> | awk '{print $1}' | awk -F ':' '{print $1}'
      
  5. 将软中断绑定到该NUMA节点对应的core上。
    1
    echo <core编号> > /proc/irq/ <中断号> /smp_affinity_list。
    

旁路SMMU

  • 目的

    为了发挥鲲鹏处理器性能,我们推荐旁路SMMU。

  • 方法
  1. 编辑配置文件/etc/grub2-efi.cfg。
    1
    vi /etc/grub2-efi.cfg
    
  2. 在内核代码中找到vmlinuz-4.14.0-115.el7a.0.1.aarch64所在行,在该行末尾加入“iommu.passthrough=1”,保存退出,重启服务器,如下所示:
    1
    2
    3
    4
    5
    6
    7
    if [ x$feature_platform_search_hint = xy ]; then
    search --no-floppy --fs-uuid --set=root  e343026a-d245-4812-95ce-6ff999b3571c
    else
    search --no-floppy --fs-uuid --set=root e343026a-d245-4812-95ce-6ff999b3571c
    fi
    linux /vmlinuz-4.14.0-115.el7a.0.1.aarch64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap LANG=en_US.UTF-8 iommu.passthrough=1
    initrd /initramfs-4.14.0-115.el7a.0.1.aarch64.img
    

此优化只适用于鲲鹏计算平台上内核版本为4.14.0-115.el7a.0.1.aarch64的CentOS 7.6操作系统,若使用其他的操作系统,则需要先用uname -r命令查询当前内核版本,然后在找到vmlinuz-<内核版本>所在行的末尾加入“iommu.passthrough=1”。

OS配置调优

  • 目的

    调整系统配置选项,充分发挥系统硬件性能。

  • 方法
    具体优化项详见表2
    表2 OS配置参数

    参数名称

    参数含义

    优化建议

    配置方法

    vm.swappiness

    swap为系统虚拟内存,使用虚拟内存会导致性能下降,应避免使用。

    默认值:60

    现象:用到swap时性能明显下降

    修改建议:关闭swap内存的使用,将该参数设定为0

    执行命令:

    1
    sudo sysctl vm.swappiness=0
    

    MTU

    网卡所能通过的最大数据包的大小,调大后可以减少网络包的数量以提高效率。

    默认值:1500 Bytes

    现象:可以通过ip addr命令查看

    修改建议:网卡所能通过的最大数据包的大小设置为9000 Bytes

    1. 执行命令:
      1
      vim /etc/sysconfig/network-scripts/ifcfg-$(Interface)
      
      并增加MTU="9000"
      说明:

      ${Interface}为网口名称。

    2. 完成后重启网络服务。
      1
      service NetworkManager restart
      

    pid_max

    “pid_max”是内核提供的一个可调参数,用于限制系统可分配的最大进程数量。系统默认的“pid_max”值为32768,正常情况下是够用的,但跑重量任务时会出现不够用的情况,最终导致内存无法分配的错误。

    默认值:32768

    现象:通过cat /proc/sys/kernel/pid_max查看

    修改建议:设置系统可生成最大线程数为4194303

    执行命令:

    1
    echo 4194303 > /proc/sys/kernel/pid_max
    

    file_max

    “file-max”是设置系统所有进程一共可以打开的文件数量。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,则应该增加这个值。

    默认值:13291808

    现象:通过cat /proc/sys/fs/file-max查看

    修改建议:设置系统所有进程一共可以打开的文件数量,设置为cat /proc/meminfo | grep MemTotal | awk '{print $2}'所查看到的值

    执行命令:

    1
    echo ${file-max} > /proc/sys/fs/file-max
    
    说明:

    ${file-max}为cat /proc/meminfo | grep MemTotal | awk '{print $2}'所查看到的值。

    read_ahead

    Linux的文件预读readahead,指Linux系统内核将指定文件的某区域预读进页缓存起来,便于接下来对该区域进行读取时,不会因缺页(page fault)而阻塞。

    鉴于从内存读取比从磁盘读取要快很多,预读可以有效的减少磁盘的寻道次数和应用程序的IO等待时间,是改进磁盘读IO性能的重要优化手段之一。

    默认值:128 KB

    现象:预读可以有效的减少磁盘的寻道次数和应用程序的IO等待时间。通过/sbin/blockdev --getra /dev/sdb查看

    修改建议:通过数据预读并且记载到随机访问内存方式提高磁盘读操作,调整为8192 KB

    执行命令:

    1
    /sbin/blockdev --setra <sectors> /dev/sdb  
    
    说明:

    此处以“/dev/sdb”为例,其中<sectors>为要调整预读的值大小,建议填入8192,对所有服务器上的所有数据盘都要修改。

    I/O_Scheduler

    Linux IO调度器是Linux内核中的一个组成部分,用户可以通过调整这个调度器来优化系统性能。

    默认值:CFQ

    现象:要根据不同的存储器来设置Linux IO调度器从而达到优化系统性能

    修改建议:IO调度策略,HDD设置为deadline,SSD设置为none

    执行命令:

    1
    2
    echo deadline > /sys/block/sdb/queue/scheduler
    echo none > /sys/class/block/nvme0n1/queue/scheduler
    
    说明:

    此处以“/dev/sdb”和“/dev/nvme0n1”为例,对所有服务器上的所有数据盘都要修改。

    nr_requests

    “nr_requests”是内核提供的块设备I/O调度参数,用于控制每个块设备(如硬盘、SSD)的I/O请求队列深度。在Linux系统中,如果有大量读请求,默认的请求队列或许应付不过来,Linux可以动态调整请求队列数,默认的请求队列数存放在“/sys/block/hda/queue/nr_requests”文件中

    默认值:128(SSD默认1023)

    现象:通过适当的调整nr_requests参数可以提升磁盘的吞吐量

    修改建议:调整硬盘请求队列数,设置为512(SSD 配置1023)

    执行命令:

    1
    2
    echo 512 > /sys/block/sdb/queue/nr_requests
    echo 1023 > /sys/block/nvme0n1/queue/nr_requests
    
    说明:

    此处以“/dev/sdb”和“/dev/nvme0n1”为例,对所有服务器上的所有数据盘都要修改。