08-10 性能瓶颈证据链
内存
磁盘空间
[root@ZT-TEST ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 402M 3.6G 11% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 95G 10G 86G 11% /
/dev/sda1 1014M 207M 808M 21% /boot
tmpfs 799M 16K 799M 1% /run/user/42
tmpfs 799M 0 799M 0% /run/user/0
运行内存
[root@ZT-TEST ~]# free -g
total used free shared buff/cache available
Mem: 7 0 2 0 4 6
Swap: 3 0 3
[root@ZT-TEST ~]# free -m
total used free shared buff/cache available
Mem: 7982 880 2851 408 4250 6394
Swap: 4095 3 4092
[root@ZT-TEST ~]# free -k
total used free shared buff/cache available
Mem: 8174056 902304 2919436 417952 4352316 6547824
Swap: 4194300 3368 4190932
虚拟内存(swap)
[root@ZT-TEST ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 3368 2919400 4204 4348128 0 0 0 1 0 0 0 0 100 0 0
0 0 3368 2919252 4204 4348128 0 0 0 0 173 240 1 0 99 0 0
0 0 3368 2919220 4204 4348128 0 0 0 0 139 219 1 0 99 0 0
0 0 3368 2919220 4204 4348128 0 0 0 0 121 208 1 0 99 0 0
内存交换设置:
- 查看 swappiness 比例:
[root@ZT-TEST ~]# cat /proc/sys/vm/swappiness
30
- 临时修改 swappiness 比例:
sudo sysctl vm.swappiness=10
- 永久修改 swappiness 比例:
vim /etc/sysctl.conf
- 关闭 swap:
swapoff -a
- 开启 swap:
swapon -a
瓶颈分析
命令: vmstat
[root@ZT-TEST ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 3368 2919400 4204 4348128 0 0 0 1 0 0 0 0 100 0 0
0 0 3368 2919252 4204 4348128 0 0 0 0 173 240 1 0 99 0 0
0 0 3368 2919220 4204 4348128 0 0 0 0 139 219 1 0 99 0 0
其中关于 IO 的几个指标解释如下:
- bi:读磁盘的速度,单位 KB/秒
- bo:写磁盘的速度
- wa:IO 的时间
瓶颈分析:
- wa 并不能反应磁盘的瓶颈,实际反应的是 CPU 的 IO 等待时间
- bi+bo 参考值为 1000,如果超过 1000,而且 wa 值比较大,表示系统磁盘 IO 存在瓶颈
命令: iostat
[root@ZT-TEST ~]# iostat -x -k -d 1
Linux 3.10.0-957.el7.x86_64 (ZT-TEST) 2021年10月03日 _x86_64_ (4 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.02 0.00 0.23 0.11 2.22 20.25 0.01 58.40 5.38 59.03 13.86 0.32
dm-0 0.00 0.00 0.00 0.24 0.11 2.21 18.71 0.01 57.77 5.58 58.32 13.01 0.32
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 11.00 0.00 3.65 5.39 2.36 0.65 0.00
###
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块 (block) 的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数
r/s: 每秒完成的读次数
w/s: 每秒完成的写次数
rkB/s: 每秒读数据量 (kB 为单位)
wkB/s: 每秒写数据量 (kB 为单位)
avgrq-sz:平均每次 IO 操作的数据量 (扇区数为单位)
avgqu-sz: 是平均请求队列的长度。队列长度越短越好
await: 平均每次 IO 请求等待时间 (包括等待时间和处理时间,毫秒为单位)。一般地系统 IO 响应时间应该低于 5ms
svctm: 平均每次 IO 请求的处理时间 (毫秒为单位)
%util: 1 秒中有百分之多少的时间用于 I/O 操作。该参数表示了设备的繁忙程度
瓶颈分析:
- CPU 会拿出一部分时间来等待 IO(iowait)。如果磁盘的利用率已经满了(util%),即使 CPU 使用率不高,但是系统整体 QPS 已经上不去了,如果继续加大流量,会导致单次 iowait 持续增加(IO 请求都堵在队列里),从而使整体性能塌方
- 高 iowait 并不代表磁盘的瓶颈。唯一能说明磁盘是系统瓶颈的方法是很高的 svctm(IO 请求的处理时间),一般来说超过 20ms,就代表了不太正常的磁盘性能。只要大于 20ms,就必须考虑是否磁盘读写的次数太多,导致磁盘性能降低
- svctm 一般要小于 await。svctm 的大小和磁盘性能有关,请求过多也会导致 svctm 的增加。await 的大小一般取决于 svctm 以及 I/O 队列的长度。如果 svctm 接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用的响应时间变慢,如果响应时间超过了用户可以容许的范围,需要考虑更换更快的磁盘;调整内核 elevator 算法;优化应用;升级 CPU
浏览器层面
关注白屏时间/首屏时间
接口层面
- 并发测试
- 负载测试
- SQL 层
服务端层面
机智的测试生活
双非大龄青年,转行测试工程师。 分享测试工程师的职业经验, 提供付费转行咨询
推荐阅读
转正实录|陪你走一段路
转行的第一喜事,当然是收到Offer啦~拿到Offer的那一天,我松了一口气,算是实现了一个小目标。但我又意识到,接下来,游戏要升级了,即将要面临试用期的考验。
机智的测试生活阅读 491
一文教会你mock(Mockito和PowerMock双剑合璧)
Mock有模仿、伪造的含义。Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。mock工具使用范畴:
京东云开发者赞 2阅读 393评论 1
源码学习之 Spring 容器创建原理
众所周知,Spring可以帮我们管理我们需要的bean。在我们需要用到这些bean的时候,可以很方便的获取到它,然后进行一系列的操作。比如,我们定义一个bean MyTestBean。
京东云开发者赞 3阅读 466
测试自动化中遵循的最佳实践
现在的企业从以往一年、一个月、一周交付,逐渐转变为开始关注两到三天甚至一天内交付。软件自动化测试的出现及其与手动测试的结合使得这种时长的交付成为可能。
陈琦赞 3阅读 522评论 1
一个漏测Bug能让你想到多少?
漏测Bug是指产品逻辑缺陷在测试过程中没有被发现(尤其是测试环境可以重现的缺陷),上线版本发布后或者在用户使用体验后发现并反馈回来的缺陷。可能造成线上故障或者资损,在对产品测试过程中,自己也难免出现一...
得物技术阅读 989评论 1
重写 Nacos 服务发现:多个服务器如何跨命名空间,访问公共服务?
这就意味着只需部署一个应用,就能满足所有测试环境的需求;也意味着所有测试环境都需要调用该公共应用,而不同测试环境的应用注册在不同的 Nacos 命名空间。
LigaAI阅读 640
结合 API & DaaS,让使用数据更方便
Eotalk 是由 Eolink CEO 刘昊臻发起的泛技术聊天活动,每期都会邀请一些技术圈内的大牛聊聊天,聊些关于技术、创业工作、投融资等热点话题。
Eolink阅读 608
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。