动手实践云技术体系

Performance Tuning (TBD)

2018-08-01  本文已影响0人  拖鞋花短裤

性能调优是个大而复杂的系统性问题,涉及Linux系统(进程管理,文件系统,磁盘系统,网络IO处理等),内核参数调优,常见检测及配置工具的使用等等。在目前针对云和虚拟化的基础设施的性能评价体系,我们可以可以分别从CPU,内存,存储,网络以及内核参数几个方面来查看性能调优的具体实现和方法论。

在这之前,我们有必要了解一下相应的检测及配置工具,如下图:

常见工具及对应Linux模块

内核参数

TBD

CPU

我们先看看如何查看sysvinit或者systemd的服务

查看sysvinit运行的服务,其中+代表开启,-代表关闭:

# service --status-all

[ + ]  acpid

[ + ]  apache-htcacheclean

[ + ]  apache2

[ + ]  apparmor

[ + ]  apport

[ + ]  atd

[ + ]  binfmt-support

[ - ]  bootmisc.sh

[ - ]  cgroupfs-mount

[ - ]  checkfs.sh

[ - ]  checkroot-bootclean.sh

[ - ]  checkroot.sh

...

查看启动的系统守护进程,这里有一个工具叫做chkservice,执行后的界面如下:

chkservice,按?呼出帮助菜单

安装步骤如下:

# sudo add-apt-repository ppa:linuxenko/chkservice

# sudo apt-get update

# sudo apt-get install chkservice

查看启动的systemd服务:

# systemctl

查看装载的服务类型单元(服务即名称为.service)

# systemctl list-units --type service

UNIT                              LOAD  ACTIVE SUB    DESCRIPTION

acpid.service                      loaded active running ACPI event daemon

apparmor.service                  loaded active exited  LSB: AppArmor initialization

apport.service                    loaded active exited  LSB: automatic crash report generation

...

查看已安装的服务类型单元文件(服务类别)

# systemctl list-unit-files --type service

UNIT FILE STATE

accounts-daemon.service                    enabled

acpid.service                              disabled

apport-forward@.service                    static

apt-daily-upgrade.service                  static

systemd-cgtop 按照资源使用率(CPU,内存,磁盘吞吐率)从高到低的顺序显示系统中的控制组(Control Group)。类似top的一个命令,每秒刷新

# systemd-cgtop 

Control Group                                                                                                         Tasks   %CPU   Memory Input/s Output/s

/                                                                                                                         -   13.1     1.7G       -        -

/kubepods                                                                                                                96    9.2  996.9M        -        -

/kubepods/burstable                                                                                                      38    7.2   493.8M       -        -

/kubepods/burstable/pod4685929b3a965eb93b397eb2e4262428                                                                  13    3.3   341.4M       -      

...


以下是基本的方法论:

1. 对业务做CPU核绑定,针对OpenStack中的虚机,我们需要版本的支持

2. 分配大页内存减少TLB不命中的概率

3. TBD

内存

TBD

存储

对于存储尤其是远程访问的存储节点,一些基本的要素需要保证:

1. host上专有的物理网卡(如10G);

2. 隔离的网络;

3. 较大的MTU;

4. 高性能磁盘(SSD,SAS);

5. 大的内存;

说存储有必要提一下LVM,一个磁盘卷的管理工具,里面几个概念通过一张图来了解一下。可以看到P指的是物理意义,V指的是虚拟或者逻辑意义,通过LVM实现对物理磁盘的逻辑划分和分组。

LVM基本概念 LVM容量,可能同最新有出入

网络

针对DPDK对网络IO性能的提升,以下是基本的方法论:

1. 更新DPDK驱动(uio-pci-generic ----> vfio-pci);

2. vSwitch微调, 如NIC卡的mbuf分配;


针对TCP协议栈的性能调优,重点在于众多TCP参数的理解和配合。

查看默认TCP分配内存,其值是根据当前系统内存大小动态生成的一个值,其中显示的三个值分别是最小值,初始值和最大值。

在128G内存的设备上:

# cat /proc/sys/net/ipv4/tcp_mem

1347279 1796375 2694558

在32G内存的设备上:

# cat /proc/sys/net/ipv4/tcp_mem

384375  512503  768750

查看用来socket所使用接收缓冲区大小,固定值为208K

# cat /proc/sys/net/core/rmem_default

212992

查看socket所使用接收缓冲区最大值,理论不小于default值

# cat /proc/sys/net/core/rmem_max

212992

查看用来socket所使用发送缓冲区大小,固定值为208K

# cat /proc/sys/net/core/wmem_default

212992

查看socket所使用发送缓冲区最大值,理论不小于default值

# cat /proc/sys/net/core/wmem_max

212992

The maximum amount of option memory buffers:

每个socket可用的最大缓冲区大小。默认20K

# cat /proc/sys/net/core/optmem_max

20480

针对以上的默认值,可以将值做如下调整,仅供参考:

# echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf

# echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf

# echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf

# echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf

使能RFC1323定义的window scaling,要支持超过64KB的TCP窗口,必须启用该值(1表示启用),TCP窗口最大至1GB,TCP连接双方都启用时才生效。

# echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf

使能RFC1323定义的timestamps

# echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf

启用有选择的应答(1表示启用),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对CPU的占用。

# echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf

当连接关闭的时候,TCP 默认缓存了很多连接指标在 route cache 中,以至于在不久的将来,连接建立的时候,可以用这些值来设置初始化条件。通常,这提升了整体的性能,但是,有时候会引起性能下降,如果设置的话,TCP 在关闭的时候不缓存这些指标。

# echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf

设置在入方向上可入队列的最大报文数,当端口接收报文的速率大于内存处理速率时,微调该选项可以缓解CPU负荷

# echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf

重新载入新的设置

# sysctl -p

写入/etc/sysctl.conf是保证重启配置不会消失,如果仅做临时的操作调优,可以用sysctl来实现配置的查看和修改,如下:

# sysctl kernel.shmmax

# sysctl -w kernel.shmmax=xx

上一篇下一篇

猜你喜欢

热点阅读