性能测试调优

一、调优五部曲

1、建立基准

在进行优化或者开始进行监视之前,首先要建立一个基准数据和优化目标。这个基准包括硬件配置、组网、测试模型、系统运行数据(CPU/内存/IO/网络吞吐/响应延时等)。

优化目标即是基于当前的软硬件架构所期望系统达成的性能目标。所以必须保证当前环境达到性能目标才能继续进行下一步的业务层面的测试。

2、压力测试与监控瓶颈

使用专业的测试工具进行压力测试,以达到性能优化目标,测试期间使用性能监控工具观察系统状态,并详尽记录,有助于分析瓶颈和确认优化措施的效果。

3、确定瓶颈

压力测试和监控的目的是为了确定瓶颈,瓶颈分析的是整个测试环境,包括测试工具、组网、IO、CPU、内存等等。

4、实施优化

曲折中前进。做好优化措施的回滚准备,避免不可逆的优化措施导致重新恢复环境而浪费大量时间和精力。

调优分析思路如下:

(1)对于服务端的问题,需要重点定位的硬件指标包括CPU、内存、硬盘、BIOS配置,对于读写测试用例重点关注磁盘以及网络的IO性能;对于计算密集型例如Bulkload,需要关注CPU瓶颈。

(2)对于网络问题,网卡中断绑核对于性能提升增益可观。

5、确认优化效果

重复压力测试与监控瓶颈,做好记录和总结、归档。

二、硬件优化

满配,嘿嘿嘿。

三、系统优化

1、OS及内核

确认测试环境OS和内核版本

```cat /etc/redhat-release`

uname -r

2、内存大页调整

在 Linux 中大页分为两种: Huge pages ( 标准大页 ) 和 Transparent Huge pages( 透明大页 ) 。

内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为 4096 bytes 即 4K 。 1MB 内存等于 256 页; 1GB 内存等于 256000 页。

透明大页管理和标准大页管理都是操作系统为了减少页表转换消耗的资源而发布的新特性,虽然Oracle建议利用大页机制来提高数据库的性能,但是Oracle却同时建议关闭透明大页管理。这二者的区别在于大页的分配机制,标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。

2.1 Huge pages

原理

在虚拟内存管理中,内核维护一个将虚拟内存地址映射到物理地址的表,对于每个页面操作,内核都需要加载相关的映射。如果你的内存页很小,那么你需要加载的页就会很多,导致内核会加载更多的映射表。而这会降低性能。

使用“大内存页”,意味着所需要的页变少了。从而大大减少由内核加载的映射表的数量。这提高了内核级别的性能最终有利于应用程序的性能。

Huge pages 有两种格式大小:2MB 和 1GB ,2MB 页块大小适合用于 GB 大小的内存,1GB 页块大小适合用于 TB 级别的内存; 2MB 是默认的页大小。

使用

查看标准大页:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K9xRPRks-1595323044313)(C:\Users\Charlotte.jiang\AppData\Roaming\Typora\typora-user-images\image-20200720112044600.png)]

2.2 Transparent Huge pages

原理

Oracle官方推荐关闭,原因:

  1. 在 RAC 环境下 透明大页( TransparentHugePages )会导致异常节点重启,和性能问题;

  2. 在单机环境中,透明大页( TransparentHugePages ) 也会导致一些异常的性能问题;

  3. 关闭内存大页,防止内存泄漏,减少卡顿。

方法

a、关闭内存大页

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag

b、检查是否关闭

cat /sys/kernel/mm/transparent_hugepage/enabled

img

3、关闭swap

目的

Linux的虚拟内存会根据系统负载自动调整,内存页(page)swap到磁盘会影响测试性能。

方法

swapoff -a

修改前后对比如下图所示:

img

4、调整vm脏数据刷新策略

原理

PageCache中需要回写到磁盘的数据为脏数据。在应用程序通知系统保存脏数据时,应用可以选择直接将数据写入磁盘(O_DIRECT),或者先写到PageCache(非O_DIRECT模式) 。非O_DIRECT模式,对于缓存在PageCache中的数据的操作,都在内存中进行,减少了对磁盘的操作。

方法

a、/proc/sys/vm/dirty_expire_centiseconds此参数用于表示脏数据在缓存中允许保留的时长,即时间到后需要被写入到磁盘中。此参数的默认值为30s(3000 个1/100秒)。如果业务的数据是连续性的写,可以适当调小此参数,这样可以避免IO集中,导致突发的IO等待。可以通过echo命令修改:

echo 2000 > /proc/sys/vm/dirty_expire_centisecs

b、/proc/sys/vm/dirty_background_ratio脏页面占用总内存最大的比例(以memfree+Cached-Mapped为基准),超过这个值,pdflush线程会刷新脏页面到磁盘。增加这个值,系统会分配更多的内存用于写缓冲,因而可以提升写磁盘性能。但对于磁盘写入操作为主的的业务,可以调小这个值,避免数据积压太多最后成为瓶颈,可以结合业务并通过观察await的时间波动范围来识别。此值的默认值是10,可以通过echo来调整:

echo 8 > /proc/sys/vm/dirty_background_ratio

c、/proc/sys/vm/dirty_ratio为脏页面占用总内存最大的比例,超过这个值,系统不会新增加脏页面,文件读写也变为同步模式。文件读写变为同步模式后,应用程序的文件读写操作的阻塞时间变长,会导致系统性能变慢。此参数的默认值为20,对于写入为主的业务,可以增加此参数,避免磁盘过早的进入到同步写状态,可以通过echo来调整:

echo 40 > proc/sys/vm/dirty_ratio

说明

如果加大脏数据缓存时间和大小,意外断电情况下,丢失数据的概率会大大增加。所以实际客户环境中,绝不可以擅自调整。

5、块设备参数调整

5.1 队列深度

原理

队列深度决定给块设备写I/O的最大并发数,对Linux系统,默认值为128,不建议修改此参数。可以cat查看当前块设备队列深度,作为性能测试对线程的判断。

使用

cat /sys/block/sdc/queue/nr_requests

当对系统进行极限性能测试时,为了增大主机写I/O的压力以及I/O在队列中被合并的概率,可以适当增大此参数。使用以下方法临时修改:

echo 256 > /sys/block/sdc/queue/nr_requests
5.2 调度算法

linux操作系统2.6内核支持四种块设备调度算法:noop、anticipatory、deadline、cfq。默认使用cfq。可使用cat /sys/block/sdc/queue/acheduler查看当前设备调度算法。

一般使用默认cfq调度算法即可。如果I/O并发为瓶颈点,可尝试使用noop,临时修改方法如下:

echo noop > /sys/block/sdc/queue/acheduler
5.3 预读量

Linux预读功能类似于阵列的预读算法,仅对顺序读有效,且对顺序流进行识别,并提前读取“read_ahead_kb”(单位为扇区)长度的数据。一般默认值为512。当业务需要对大量大文件进行读取时,可以适当调大此参数以提升性能。

echo 1024 > /sys/block/sdc/queue/read_ahead_kb
5.4 I/O对齐

参见第四章 2磁盘基准测试前准备。

5、文件系统调整

原理

XFS是一种高性能的日志文件系统,XFS极具伸缩性,非常健壮,特别擅长处理大文件,同时提供平滑的数据传输。因此如果可以选择,我们可以优先选择XFS文件系统。

XFS文件系统在创建时,可先选择加大文件系统的block,更加适用于大文件的操作场景。

使用

a、格式化磁盘

mkfs.xfs /dev/sdb

b、增大blocksize,默认为4KB(4096B)。

mkfs.xfs /dev/sdb -b size=4194304

c、调整脏数据刷新策略

参见第三章 4、调整vm脏数据刷新策略,xfs文件系统的脏数据刷新配置与之类似。

本章主要对于系统参数进行优化,在调优时作为调优方法,针对瓶颈点进行优化,标准环境下,一般不做修改。

四、基准性能测试

1、网络

1.1、网络配置

在进行网络性能测试前,先确保组网情况,是否在组网上有较大网络损耗,单个万兆网络达不到性能要求时,可采用配置bond提高。

1.2、测试方法

工具一:iperf

iperf是一个开源且跨平台的软件,作为网络性能测试工具,行业认可度高,测试结果可作为对客户输出的测试数据。关闭防火墙测试。

工具二:dc_client_tool && dc_client_tool

该工具是我们内部产品包自带的网络测试工具,判断单个socket所能承受最大的带宽。单个任务的速度不会超过单个socket所能承受的带宽,若单个socket性能不满足性能要求,可采用多通道方式进行压测。

使用方法:

a、添加防火墙端口19999

 firewall-cmd --add-port=19999/tcp 

b、客户端:在客户端服务下,配置dc_client_tool.config–>服务器IP为服务端指定节点的数据传输IP,并配置环境变量export LD_LIBRARY_PATH=`pwd`

c、服务端:在内置客户端服务下,配置dc_client_tool.config–>服务器IP为服务端该节点数据传输IP,并配置环境变量export LD_LIBRARY_PATH=`pwd`

d、在服务端执行./dc_server_tool,在客户端./dc_client_tool

建议执行时间长一点,等待网络稳定,记录数据。

如需测试单个客户端与集群之间的网络,可复制多个客户端安装包在不同的目录,分别配置与多个节点的连接,同时执行

2、磁盘

测试磁盘性能时,若分区的初始磁柱编号是非4KB对齐,则对磁盘性能影响较大,请先确保分区的初始磁柱编号已经4KB对齐,再开始测试。

2.1 Windows

以windows 7 64位为例

a、使用“win + R”组合键唤醒运行窗口,输入“msinfo32”,回车,查看系统信息

b、选择“组件 > 存储 > 磁盘”,在右侧区域查看分区起始偏移值

  • 若4096能被该参数值整除,则表示已经4KB对齐,请执行步骤c

  • 若4096不能被该参数值整除,则表示未4KB对齐,如需继续测试请重新按照4KB对齐分区(重新分区)

    注:

    删除分区并重新按照4KB对齐选取初始磁柱编号时会导致磁盘原有数据的丢失,请谨慎操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N8rFCCR6-1595323044320)(C:\Users\Charlotte.jiang\AppData\Roaming\Typora\typora-user-images\image-20200717183928541.png)]

c、使用iometer工具测试磁盘性能,具体方法参见iometer产品文档。

2.2 Linux

以CentOs 7.5 64位为例

2.2.1 确认环境

a、确认磁盘分区的初始磁柱编号是否已经4KB对齐:fdisk -lu

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYlf7US3-1595323044324)(C:\Users\Charlotte.jiang\AppData\Roaming\Typora\typora-user-images\image-20200717184752135.png)]

  • 若start对应的初始磁柱编号能被8整除,则表示4KB对齐,请执行3进行性能测试。
  • 若start对应的初始磁柱编号不能被8整除,则表示未4KB对齐,如需继续测试请删除原有分区,重新按照4KB对齐选择初始磁柱编号。

注:

删除分区并重新按照4KB对齐选取初始磁柱编号时会导致磁盘原有数据的丢失,请谨慎操作。

2.2.2 fio测试

​ 每次测试前执行echo 3 > /proc/sys/vm/drop_caches清理缓存。

  • 测试随机写IOPS: fio -direct=1-iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=128G -numjobs=1 -runtime=600 -group_reporting -filename=/dev/[device] -name=Rand_Write_IOPS_Test
  • 测试随机读IOPS:fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4K -size=128G -numjobs=1 -runtime=600 -group_reporting -filename=/dev/[device] -name=Rand_Read_IOPS_Test
  • 测试写吞吐量:fio -direct=1 -iodepth=32 -rw=write -ioengine=libaio -bs=4M -size=128G -numjobs=1 -runtime=600 -group_reporting -filename=/dev/[device] -name=Write_BandWidth_Test
  • 测试读吞吐量:fio -direct=1 -iodepth=32 -rw=read -ioengine=libaio -bs=4M -size=128G -numjobs=1 -runtime=600 -group_reporting -filename=/dev/[device] -name=Read_BandWidth_Test
参数说明
direct定义是否使用direct IO,可选值如下:值为0,表示使用buffered IO值为1,表示使用direct IO
iodepth定义测试时的IO队列深度,默认为1。此处定义的队列深度是指每个线程的队列深度,如果有多个线程测试,意味着每个线程都是此处定义的队列深度。fio总的IO并发数=iodepth * numjobs。
rw定义测试时的读写策略,可选值如下:随机读:randread随机写:randwrite顺序读:read顺序写:write混合随机读写:randrw0
ioengine定义fio如何下发IO请求,通常有同步IO和异步IO:同步IO一次只能发出一个IO请求,等待内核完成后才返回。这样对于单个线程IO队列深度总是小于1,但是可以透过多个线程并发执行来解决。通常会用16~32个线程同时工作把IO队列深度塞满。异步IO则通常使用libaio这样的方式一次提交一批IO 请求,然后等待一批的完成,减少交互的次数,会更有效率。
bs定义IO的块大小(block size),单位是k、K、m和M等,默认IO块大小为4 KB。EOSS以4M块大小写入存储,所以测试顺序读写时用4M。
size定义测试IO操作的数据量,若未指定runtime这类参数,fio会将指定大小的数据量全部读/写完成,然后才停止测试。该参数的值,可以是带单位的数字,比如size=10G,表示读/写的数据量为10GB;也可是百分数,比如size=20%,表示读/写的数据量占该设备总文件的20%的空间。建议测试数据量为内存两倍大,尽量避免缓存影响。
numjobs定义测试的并发线程数。
runtime定义测试时间。如果未配置,则持续将size指定的文件大小,以每次bs值为分块大小读/写完。
group_reporting定义测试结果显示模式,group_reporting 表示汇总每个进程的统计信息,而非以不同job汇总展示信息。
filename定义测试文件(设备)的名称。此处选择文件,则代表测试文件系统的性能。例如:-filename=/opt/fiotest/fiotest.txt此处选择设备名称,则代表测试裸盘的性能。例:-filename=/dev/vdb1
**注:**如果在已经分区、并创建文件系统,且已写入数据的磁盘上进行性能测试,请注意filename选择指定文件,以避免覆盖文件系统和原有数据。
name定义测试任务名称。

3、文件系统

3.1 服务端

测试工具:vdbench,oracle公司出的工具,认可度高。具体参数意义,参考官方文档。

vdbench测试文件系统时,先生成数据,再进行读写。

注:

a、如果在已经分区、并创建文件系统,且已写入数据的磁盘上进行性能测试,请注意filename选择指定文件,以避免覆盖文件系统和原有数据。

b、文件目录深度、宽度指定为1,单个文件大小1GB,对应dsd文件大小,测试文件大小为内存两倍大,避免缓存影响。

c、通过调整线程数进行压测,得出文件系统吞吐量。

d、”fwd=format“所在行 为创建文件,线程数建议等于files(文件数)。

e、elapsed=1200,为指定读写时间,单位:秒(s),不用自己指定。具体值需要根据实际文件大小和文件系统读写速度判断。

f、集群环境的存储,如果是采用同一个第三方存储,比如NAS\FusionStorage,那么测试的时候,需要考虑到相互之间的影响,集群同时测试,即在不同节点,对同一存储进行测试。

测试命令:

vim test-w

fsd=fsd1,anchor=/测试目录/test,depth=1,width=1,files=128,size=1G,openflags=o_sync    
fwd=fwd1,fsd=fsd1,operation=write,fileio=sequential,xfersize=4M,fileselect=sequential,threads=1
fwd=format,fsd=fsd1,xfersize=4M,threads=128
rd=rd1,fwd=fwd1,fwdrate=max,format=yes,elapsed=1200,interval=1

测试结果:

线程数写(MB/s)读(MB/s)
1
2
4
8
3.2 客户端

参见服务端测试方法。

4、监控工具

常用工具为dstat、iostat、top,具体使用办法可参见官方文档。

4.1 dstat

dstat命令是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具。

在进行基础性能测试的时候执行dstat -dnms -D 磁盘 设备 -N 网卡,可以对指定磁盘监控I/O、指定网卡监控网络带宽,是否平缓;监控缓存cache是否被利用,缓存变化期间,缓存命中率高,尤其是读操作时,测试数据会偏高;监控swap已使用和剩余量,若剩余量不断变小,说明物理内存不够,正在使用swap空间,对性能影响较大,建议关闭swap。

dstat还有许多更高级的用法,请参考网络资料,酌情使用。

4.2 iostat

iostat用于输出CPU和磁盘I/O相关的统计信息。

使用iostat -txm 磁盘设备 1命令时,界面每秒输出当前时间、指定磁盘的I/O状态和CPU状态。

通常使用该工具关注的是以下参数值:

a、%iowait:如果%iowait的值过高,表示硬盘存在I/O瓶颈。

b、%idle:如果%idle值持续低于1,需要判断是否为CPU处理能力低;如果该值持续走高,表示CPU较空闲,但实际性能不高,可以考虑是否是内存不足,CPU持续等待内存。

c、%util: 一秒中有百分之多少的时间用于 I/O。如果%util接近100%,说明产生的I/O请求太多,存储I/O已经满负荷。但是对于SSD、RAID这样可以一个时间物理执行多个I/O的存储设备,util%达到100% 并不代表使用率真的到达百分百,或可继续压测存储吞吐,实在需要判断存储是否已经满负荷,可以对比基础性能测试结果的吞吐,也可以参考网络资料计算存储设备的实际利用率。

本章为环境基准测试方法,若要达到性能预期值,基础性能必须高于预期值,并预留出一定业务性能折损空间。

若基础性能未能达到标准,首先查看环境配置是否标准,尤其是组网、磁盘,其次参见第三章系统优化,根绝当前性能表现对测试环境进行对应的配置,并做好回滚准备。

五、NAS存储调优

1、TCP参数调整

NFS使用TCP协议来进行数据的收发,适当增大缓存区大小可以加快TCP传输速度。在10GE网络下,TCP收发缓存区大小建议增大为下述值,GE网络下,可以不做调整。

net.ipv4.tcp_rmem=4000000 8000000 16000000 
net.ipv4.tcp_wmem=4000000 8000000 16000000 
net.core.rmem_max=8000000 
net.core.wmem_max=8000000 
net.core.rmem_default=8000000 
net.core.wmem_default=8000000 
net.core.optmem_max=8000000 
net.core.netdev_max_backlog=300000

以SUSE11为例,修改TCP收发缓存区大小。
执行如下命令:

sysctl -w net.ipv4.tcp_rmem='4000000 8000000 16000000' 
sysctl -w net.ipv4.tcp_wmem='4000000 8000000 16000000' 
sysctl -w net.core.rmem_max=8000000 
sysctl -w net.core.wmem_max=8000000 
sysctl -w net.core.rmem_default=8000000 
sysctl -w net.core.wmem_default=8000000 
sysctl -w net.core.optmem_max=8000000 
sysctl -w net.core.netdev_max_backlog=300000 
sysctl -w net.ipv4.route.flush=1

为了重启后生效,需要修改对应的配置文件。
执行如下命令:

sudo bash -c "echo net.ipv4.tcp_rmem=4000000 8000000 16000000 >> /etc/sysctl.conf" 
sudo bash -c "echo net.ipv4.tcp_wmem=4000000 8000000 16000000 >> /etc/sysctl.conf" 
sudo bash -c "echo net.core.rmem_max=8000000 >> /etc/sysctl.conf" 
sudo bash -c "echo net.core.wmem_max=8000000 >> /etc/sysctl.conf" 
sudo bash -c "echo net.core.rmem_default=8000000 >> /etc/sysctl.conf" 
sudo bash -c "echo net.core.wmem_default=8000000 >> /etc/sysctl.conf" 
sudo bash -c "echo net.core.optmem_max=8000000 >> /etc/sysctl.conf" 
sudo bash -c "echo net.core.netdev_max_backlog=300000 >> /etc/sysctl.conf"     

2、NFS并发数调整

增大NFS协议客户端与服务读的并发消息处理数,同一时刻内,可以将更多的客户端请求传递到服务端,增大业务并行度,提升性能。该值默认为16,可以调整为128。

以SUSE11为例,修改并发消息处理数值。
执行如下命令。

echo 128 > /proc/sys/sunrpc/tcp_slot_table_entries

执行umount /local_path取消共享目录挂载。

执行mount -t nfs -o vers=3,timeo=600 host:/share_path /local_path重新挂载共享目录。

timeo参数的单位是十分之一秒。如果需要修改timeo参数,建议将该参数设置为150以上的数值,即设置为15秒以上。

3、NFS挂载参数调整

挂载参数中较为关键的参数说明为如表3-5所示。

表3-5 提升性能参数

参数含义
rsize/wsize每次读写块的最大尺寸,建议调整为最大值。一般linux操作系统环境下,最大值为1M即1048576。
async允许数据异步写入。同步写入要求NFS服务器必须将每个数据都刷入硬盘后,才可以返回成功,时延较高。
noatime如果不需要记录文件的访问时间,可以增加该参数。避免频繁访问时,修改访问时间带来的开销。
nodiratime如果不需要记录目录的访问时间,可以增加该参数。避免频繁访问时,修改访问时间带来的开销。
nolock如果NFS客户端之间没有共享的文件,可以使用该参数。减少服务器侧文件锁带来的开销。
nfs.client.nfsiod_thread_maxNFS客户端异步I/O(nfsiod)的最大线程数。缺省值是16。

执行vi /etc/nfs.conf编辑nfs配置文件。

nfs.client.nfsiod_thread_max=64    

执行umount /local_path取消共享目录挂载。

执行如下命令重新挂载共享目录。

mount -t nfs -o vers=3,async,nolock,noatime,nodiratime,wsize=1048576,rsize=1048576,timeo=600 192.168.1.1:/nfsshare /mnt/work_space

4、dirty_bytes参数调整

当dirty cache到了对应值的时候,就启动pdflush进程,将dirtycache写回硬盘,适当调整dirty_bytes参数能够提升写性能。详见第三章 4、调整vm脏数据刷新策略。

调整dirty_byte的取值,51214400byte为典型值举例,现场必须根据性能观测结果,观察带宽是否波动,如果该值不合适,带宽会出现剧烈波动。

echo 51214400 > /proc/sys/vm/dirty_bytes

执行umount /local_path取消共享目录挂载。执行如下命令重新挂载共享目录。

mount -t nfs -o vers=3,async,nolock,noatime,nodiratime,wsize=1048576,rsize=1048576,timeo=600 192.168.1.1:/nfsshare /mnt/work_space
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值