Performance Tuning (TBD)
性能调优是个大而复杂的系统性问题,涉及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