本篇主要记录性能测试中需要使用到的各种命令,以及对各种情况的性能进行分析:
使用目录
使用uptime获取CPU 1/5/15分钟前到现在的负载平均值
显示:
14:49:05 up 2 days, 23:44, 1 user, load average: 0.12, 0.25, 0.24
结果说明:
14:49:05 :当前时间
2 days, 23:44 : 系统已运行时间
1 user : 当前在线用户数
load average : 0.12, 0.25, 0.24最近1分钟 5分钟 15分钟系统负载
常用命令:
- 1分钟;
uptime | awk '{print $9}' | cut -f 1 -d ','
- 5分钟;
uptime | awk '{print $10}' | cut -f 1 -d ','
- 15分钟;
uptime | awk '{print $11}' | cut -f 1 -d ','
使用IOSTAT 查看磁盘繁忙情况
默认显示:
Linux 2.6.32-642.el6.x86_64 (XXXX03) 11/01/2018 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.02 0.00 0.00 99.94
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.51 4.18 3.85 1095012 1009472
sdb 0.13 4.03 2.11 1055130 552400
dm-0 0.00 0.01 0.00 2504 0
dm-1 0.00 0.01 0.00 2504 0
dm-2 0.09 0.98 0.14 256538 35992
dm-3 0.40 4.02 2.11 1054450 552400
dm-4 0.08 0.62 0.02 161658 4840
dm-5 0.17 0.40 0.98 104626 257248
dm-6 0.08 0.19 0.42 49778 109160
dm-7 0.36 0.62 2.29 163570 599288
dm-8 0.05 1.25 0.01 328170 2864
结果说明:
第一部分包含了CPU报告
#user : 显示了在执行用户(应用)层时的CPU利用率
#nice : 显示了在以nice优先级运行用户层的CPU利用率
#system : 显示了在执行系统(内核)层时的CPU利用率
#iowait : 显示了CPU在I/O请求挂起时空闲时间的百分比
#steal : 显示了当hypervisor正服务于另外一个虚拟处理器时无意识地等待虚拟CPU所占有 的时间百分比。
#idle : 显示了CPU在I/O没有挂起请求时空闲时间的百分比
第二部分包含了设备利用率报告
#Device : 列出的/dev 目录下的设备/分区名称
#sda sdb: 个人理解->windows 硬盘卷,每增加一块物理硬盘/插入U盘 就会多一行该项
#dm-0 : 个人理解->windows 逻辑券 ,类似C盘 D盘 E盘等逻辑分区
#tps : 显示每秒传输给设备的数量。更高的tps意味着处理器更忙。
#Blk_read/s : 显示了每秒从设备上读取的块的数量(KB,MB)
#Blk_wrtn/s : 显示了每秒写入设备上块的数量(KB,MB)
#Blk_read : 显示所有已读取的块
#Blk_wrtn : 显示所有已写入的块
#tps : 每秒事务数
IOSTAT 常用参数 k m x d
iostat -mx
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.22 0.11 0.13 0.38 0.00 0.00 15.73 0.00 0.91 0.87 0.92 0.56 0.03
sdb 0.09 0.18 0.04 0.09 0.00 0.00 46.39 0.00 0.93 1.90 0.43 0.66 0.01
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 1.06 1.06 0.00 0.57 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 1.43 1.43 0.00 0.93 0.00
dm-2 0.00 0.00 0.07 0.02 0.00 0.00 12.16 0.00 3.15 2.06 7.84 0.39 0.00
dm-3 0.00 0.00 0.13 0.26 0.00 0.00 15.33 0.00 1.08 2.44 0.41 0.22 0.01
dm-4 0.00 0.00 0.08 0.00 0.00 0.00 8.00 0.00 0.38 0.36 0.80 0.06 0.00
dm-5 0.00 0.00 0.04 0.12 0.00 0.00 8.33 0.00 0.82 0.55 0.92 0.34 0.01
dm-6 0.00 0.00 0.02 0.05 0.00 0.00 8.04 0.00 1.28 0.73 1.53 0.18 0.00
dm-7 0.00 0.00 0.08 0.29 0.00 0.00 8.00 0.00 0.78 0.20 0.93 0.39 0.01
dm-8 0.00 0.00 0.05 0.00 0.00 0.00 23.30 0.00 1.62 1.63 1.45 0.62 0.00
输出信息的含义
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:每秒读取的扇区数;
wsec/:每秒写入的扇区数。
rKB/s:The number of read requests that were issued to the device per second;
wKB/s:The number of write requests that were issued to the device per second;
avgrq-sz 平均请求扇区的大小
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
使用sar命令 查看磁盘情况
1. 查看磁盘
sar -d
05:20:01 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:30:01 PM dev8-0 1.18 12.26 10.19 19.04 0.00 1.23 1.03 0.12
05:30:01 PM dev8-16 0.20 0.00 2.43 12.44 0.00 1.00 0.50 0.01
05:30:01 PM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:30:01 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:30:01 PM dev253-2 0.03 1.52 0.13 52.21 0.00 2.21 2.21 0.01
05:30:01 PM dev253-3 0.30 0.00 2.43 8.00 0.00 0.75 0.32 0.01
05:30:01 PM dev253-4 0.17 0.00 1.35 8.00 0.00 0.70 0.52 0.01
05:30:01 PM dev253-5 0.25 0.00 1.96 8.00 0.00 0.35 0.25 0.01
05:30:01 PM dev253-6 0.05 0.00 0.41 8.00 0.00 0.06 0.03 0.00
05:30:01 PM dev253-7 0.52 0.00 4.14 8.00 0.00 0.79 0.51 0.03
05:30:01 PM dev253-8 0.59 10.74 2.20 21.92 0.00 2.97 1.24 0.07
Average: dev8-0 0.47 1.57 4.38 12.61 0.00 0.95 0.77 0.04
Average: dev8-16 0.46 13.30 8.20 46.87 0.00 0.79 0.59 0.03
Average: dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev253-2 0.01 0.07 0.08 12.97 0.00 0.83 0.64 0.00
Average: dev253-3 1.15 13.30 8.20 18.66 0.00 0.56 0.24 0.03
Average: dev253-4 0.01 0.00 0.06 8.00 0.00 0.73 0.42 0.00
Average: dev253-5 0.14 0.00 1.12 8.00 0.00 0.91 0.38 0.01
Average: dev253-6 0.05 0.00 0.42 8.00 0.00 1.50 0.24 0.00
Average: dev253-7 0.33 0.00 2.66 8.00 0.00 0.93 0.71 0.02
Average: dev253-8 0.03 1.50 0.04 49.77 0.00 2.09 1.63 0.01
说明:
#tps:每秒I/O的传输总数
#rd_sec/s 每秒读取的扇区的总数
#wr_sec/s 每秒写入的扇区的 总数
#avgrq-sz 平均每次次磁盘I/O操作的数据大小(扇区)
#avgqu-sz 磁盘请求队列的平均长度
#await 从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒等于1000毫秒),等于寻道时间+队列时间+服务时间
#svctm I/O的服务处理时间,即不包括请求队列中的时间
#%util I/O请求占用的CPU百分比,值越高,说明I/O越慢
2.获取对应磁盘所对应的逻辑盘
ll /dev/mapper
crw-rw---- 1 root root 10, 58 Oct 29 15:05 control
lrwxrwxrwx 1 root root 7 Oct 29 15:05 VG00-lvapp -> ../dm-8
lrwxrwxrwx 1 root root 7 Oct 29 15:05 VG00-lvhome -> ../dm-4
lrwxrwxrwx 1 root root 7 Oct 29 15:05 VG00-lvroot -> ../dm-2
lrwxrwxrwx 1 root root 7 Oct 29 15:05 VG00-lvswap1 -> ../dm-0
lrwxrwxrwx 1 root root 7 Oct 29 15:05 VG00-lvswap2 -> ../dm-1
lrwxrwxrwx 1 root root 7 Oct 29 15:05 VG00-lvtmp -> ../dm-7
lrwxrwxrwx 1 root root 7 Oct 29 15:05 VG00-lvvar -> ../dm-5
lrwxrwxrwx 1 root root 7 Oct 29 15:05 VG00-lvvarlog -> ../dm-6
lrwxrwxrwx 1 root root 7 Oct 29 15:05 VGDATA-lvmdata -> ../dm-3
可以看到/data目录挂载在dm-3上
3.查看挂载软链
ll /dev/dm-*
可以查看所有盘都挂载硬盘 253上
brw-rw---- 1 root disk 253, 0 Oct 29 15:05 /dev/dm-0
brw-rw---- 1 root disk 253, 1 Oct 29 15:05 /dev/dm-1
brw-rw---- 1 root disk 253, 2 Oct 29 15:05 /dev/dm-2
brw-rw---- 1 root disk 253, 3 Oct 29 15:05 /dev/dm-3
brw-rw---- 1 root disk 253, 4 Oct 29 15:05 /dev/dm-4
brw-rw---- 1 root disk 253, 5 Oct 29 15:05 /dev/dm-5
brw-rw---- 1 root disk 253, 6 Oct 29 15:05 /dev/dm-6
brw-rw---- 1 root disk 253, 7 Oct 29 15:05 /dev/dm-7
brw-rw---- 1 root disk 253, 8 Oct 29 15:05 /dev/dm-8
4.直接查看虚拟盘的性能
sar -d -p
05:20:01 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:30:01 PM sda 1.18 12.26 10.19 19.04 0.00 1.23 1.03 0.12
05:30:01 PM sdb 0.20 0.00 2.43 12.44 0.00 1.00 0.50 0.01
05:30:01 PM VG00-lvswap1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:30:01 PM VG00-lvswap2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:30:01 PM VG00-lvroot 0.03 1.52 0.13 52.21 0.00 2.21 2.21 0.01
05:30:01 PM VGDATA-lvmdata 0.30 0.00 2.43 8.00 0.00 0.75 0.32 0.01
05:30:01 PM VG00-lvhome 0.17 0.00 1.35 8.00 0.00 0.70 0.52 0.01
05:30:01 PM VG00-lvvar 0.25 0.00 1.96 8.00 0.00 0.35 0.25 0.01
05:30:01 PM VG00-lvvarlog 0.05 0.00 0.41 8.00 0.00 0.06 0.03 0.00
05:30:01 PM VG00-lvtmp 0.52 0.00 4.14 8.00 0.00 0.79 0.51 0.03
05:30:01 PM VG00-lvapp 0.59 10.74 2.20 21.92 0.00 2.97 1.24 0.07
05:40:01 PM sda 0.54 0.00 5.56 10.30 0.00 0.83 0.61 0.03
05:40:01 PM sdb 0.17 0.00 1.85 11.12 0.00 1.27 0.66 0.01
05:40:01 PM VG00-lvswap1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:40:01 PM VG00-lvswap2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:40:01 PM VG00-lvroot 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:40:01 PM VGDATA-lvmdata 0.23 0.00 1.85 8.00 0.00 1.12 0.47 0.01
05:40:01 PM VG00-lvhome 0.04 0.00 0.32 8.00 0.00 0.50 0.50 0.00
05:40:01 PM VG00-lvvar 0.13 0.00 1.07 8.00 0.00 0.65 0.39 0.01
05:40:01 PM VG00-lvvarlog 0.05 0.00 0.36 8.00 0.00 3.04 0.33 0.00
05:40:01 PM VG00-lvtmp 0.48 0.00 3.82 8.00 0.00 0.99 0.51 0.02
05:40:01 PM VG00-lvapp 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: sda 0.47 1.55 4.39 12.58 0.00 0.95 0.77 0.04
Average: sdb 0.46 13.17 8.14 46.75 0.00 0.80 0.59 0.03
Average: VG00-lvswap1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: VG00-lvswap2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: VG00-lvroot 0.01 0.07 0.08 12.97 0.00 0.83 0.64 0.00
Average: VGDATA-lvmdata 1.14 13.17 8.14 18.64 0.00 0.56 0.24 0.03
Average: VG00-lvhome 0.01 0.00 0.06 8.00 0.00 0.72 0.42 0.00
Average: VG00-lvvar 0.14 0.00 1.12 8.00 0.00 0.91 0.38 0.01
Average: VG00-lvvarlog 0.05 0.00 0.42 8.00 0.00 1.51 0.24 0.00
Average: VG00-lvtmp 0.33 0.00 2.67 8.00 0.00 0.94 0.71 0.02
Average: VG00-lvapp 0.03 1.48 0.04 49.77 0.00 2.09 1.63 0.00
使用mysql自带工具mysqlslap进行数据库操作压测
磁盘读写能力的另外一个验证方法,是使用mysql的自带工具mysqlslap进行测试
常用测试命令:
./mysqlslap --concurrency=10 --engine=innodb --iterations=3 --auto-generate-sql --auto-generate-sql-load-type=write --number-int-cols=10 --number-char-cols=30 --auto-generate-sql-add-autoincrement --number-of-queries=10000 -u???? -p
???? -h127.0.0.1 -P????
–number-of-queries 测试总计运行次数(该次数会被所有线程运行平摊)
–iterations= 测试次数 该值建议3以上 ,最终显示最高值 最低值 与平均值
–number-int-cols=10 模拟表拥有的int类型的列的数量
–number-char-cols 模拟表拥有char类型的列的数量
–engine=innodb 索引类型
–concurrency 并发数 线程数
获取mysql写线程数的方法,但是实际使用其他测试工具时,并发数一定要大,因为mysql自己会对数据进行整合后再进行写入,特别是高tps下,所以实际上使用mysqlslap测试时 需要使用更多的线程建议 20以上 进行测试
mysql> show variables like 'innodb_write_io_threads'
-> ;
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| innodb_write_io_threads | 4 |
+-------------------------+-------+
单线程顺序写 测试命令 DD
rm -rf /data/a.dat && dd bs=4096 count=256000 oflag=direct if=/dev/zero of=/data/a.dat && rm -rf /data/a.dat
bs 数据块大小 单位B 4096=4k写入 一般为该值 1个页
多线程随机读写 测试工具sysbench
./sysbench --test=fileio --file-num=300 --file-block-size=4096 --file-total-size=300M prepare
./sysbench --test=fileio --file-num=300 --file-block-size=4096 --file-total-size=3000M --num-threads=4 --file-test-mode=rndwr --file-extra-flags=direct run
./sysbench --test=fileio --file-num=300 --file-block-size=4096 --file-total-size=3000M --num-threads=50 --file-test-mode=rndwr --file-extra-flags=direct run
./sysbench --test=fileio --file-num=300 --file-block-size=4096 --file-total-size=300M cleanup
–file-num 文件数 一般测试时为写入的文件数 ,如果测试服务的I/O时,主要为日志 ELK等性能损耗 所以该值建议为1
如果测试的是数据库,那么该值建议为表的数量
–file-total-size 文件总容量,如果设置为300文件 该值为文件倍数 例如设计每文件10M 那么该值为3000
–num-threads 测试时的并发数 测试线程数
–file-test-mode rndwr 为随机写 另外还有随机读写 随机读 顺序读 顺序写 顺序读写
{seqwr(顺序写), seqrewr(顺序读写), seqrd(顺序读), rndrd(随机读), rndwr(随机写), rndrw(随机读写)}
–file-extra-flags=direct 测试磁盘的话 一定加上该参数,否则会被操作系统在内存整合后再一并写入。
#使用uptraf查看本机网络吞吐量
iptraf -d eht0
#netperf 测试clinet/server下的端到端吞吐量
# netserver
Starting netserver at port 12865
Starting netserver at hostname 0.0.0.0 port 12865 and family AF_UNSPEC
# netperf -H 172.16.38.36 -l 10
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 172.16.38.36 (172.16.38.36) port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 10.32 93.68
一般磁盘经验总结
本地机械盘
磁盘种类 | 顺序4K写 | 4线程随机写write | 50线程随机写 | 10000次插入mysql插入耗时 |
---|---|---|---|---|
本地机械盘 | 25-28 MB/s | IOPS=5000-7000 MiB/s (20.64 MB/s) | IOPS=7313.73 28.57 MiB/s (29.96 MB/s) | 3-4s |
共享存储 3PARdataFibre | 6 MB/s-12MB/s | IOPS=520.86 - 1000 MiB/s (2.13 - 4MB/s) - | IOPS=5737.29 22.41 MiB/s (23.50 MB/s) | 4-7s |
目前一般服务器CPU / 内存 硬件过剩,更多的是网络状况 与 磁盘性能带来的性能瓶颈,在所有磁盘调整为本地盘,共享存储的不是那么繁忙的情况下,提升硬盘的速度 ->数据库的操作速度会带来更好的响应时间。
共享存储:虚机过多或同时使用,那么会存在资源竞争情况,对磁盘I/O测试带来很大干扰。可以由下面方法确认:
- 同时测试
- CPU iowait 参数 看io等待时间
- await svctm 比例 如果 svctm 接近 await 那么基本无等待 ,如果存在await 远大于 svctm 会存在I/O等待
200并发下 插入 /更新 的mybatis 在10-15ms内,duboo 200线程 轮询等待自身有大约5ms的损耗(总业务线上duboo大致损耗为10%),故相比数据库的操作,服务一般优化的幅度较少,如何提高硬件的I/O利用率是提高TPS的最快方法。
util%到达100% 并不代表使用率真的到达百分百,拥有并行能力的磁盘会远大于这个值。5个磁盘 其中1个满负载该值就为100%,实际上另外4个磁盘可能空闲。 ↩︎
svctm它并不代表真正的存储service time,因为它是计算出来的。需要统计该值需要使用压测工具。应该参考avgqu-sz:超过处理能力的请求数目,待处理的 I/O 请求,当请求持续超出磁盘处理能力,该值将增加。 网上标准说持续超过2就应该警示,具体值大家在工作中自己摸索,具体指什么,如一块机械盘,串行IO(每次1个IO),那么avgqu-sz持续大于2既代表持续有两倍读写能力的IO请求在等待。 那么当RAIDs 或者 SSD等并行,这里假定并行度为5.63,那么 avgqu-sz持续大于10,才代表持续有两倍读写能力的IO请求在等待。 ↩︎