本文档介绍 SequoiaDB 巨杉数据库性能瓶颈分析思路,帮助用户找到系统瓶颈并优化。在满足基本功能的基础之上,性能问题是数据库行业用户最关心的问题,而它也是数据库领域最难分析和解决的问题之一。因为它的问题细分种类太多,原因多种多样,所以正确的问题诊断策略和手段必不可少。性能问题诊断一般包含以下步骤:
在诊断性能问题前,需要了解应用系统的类型,包括并发度、写入量和高频查询语句。以下是根据不同类型系统,缩小最可能的可疑点,重点收集和调优对应的指标:
并发读高的应用,重点分析 CPU、内存相关
写入量高重点分析磁盘 IO 相关
收集数据的来源,通常分成两大类:一是数据库提供的信息,二是一些数据库之外的通用信息,最常见的就是操作系统层面的数据。
在系统压测过程中,分别收集以下各类性能指标:
使用 top
命令,查看 cpu 使用情况
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us:用户占用 CPU 百分比,如果长期高于 50%,需检查会话中是否存在大量表扫描,检查会话快照中耗时长的会话操作和检查上下文快照中,存在 tbscan 的上下文操作。如果存在表扫描,可以使用添加索引进行优化
sy:内核占用cpu百分比。如果 us + sy 长期高于 80% ,表明 cpu 资源不足,需要增加集群 cpu 资源
wa:I/O 等待占用 CPU 时间比,如果长期高于 20%,说明 I/O 等待严重,可能的原因是磁盘的大量随机读写造成的,也可能是磁盘的读写瓶颈,可以通过磁盘 I/O 工具进一步进行诊断
使用 iostat -xz 1
命令,查看服务器磁盘 I/O 情况
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.06 0.67 0.43 84.39 19.50 187.90 0.03 29.32 30.03 28.20 4.89 0.54
r/s、w/s、rkB/s、wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节),如果读写量已经达到磁盘硬件上限,说明磁盘的读写遇到瓶颈
await:I/O 操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括 I/O 等待和实际操作的耗时。如果这个数值过大,可能是磁盘 I/O 遇到了瓶颈
%util:设备利用率,这个数值表示设备的繁忙程度,经验值是如果超过 60,可能会影响 I/O 性能(可以参照 I/O 操作平均等待时间);如果到达 100%,说明磁盘 I/O 已经饱和
Note:
如果通过上述命令,发现磁盘读写遇到瓶颈,可以从以下几个方面进一步分析原因:
- 索引缺失
- 数据分布不均匀或存在热点数据
- 集群硬件资源不足
使用 vmstat 1
命令,查看服务器内存使用情况
procs -----------memory---------- ---swap-- -----io---- -system-- ------ cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 0 750176 948 1299700 0 0 77 18 167 707 0 1 99 0 0
使用 sar -n DEV 1
命令,查看服务器网络设备的吞吐率
02时43分01秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 02时43分02秒 ens33 1.08 1.08 0.06 0.17 0.00 0.00 0.00
rxkB/s、txkB/s:网卡接收和发送数据速率,如果接收或发送速率达到网卡上限,表明网络设备已经饱和。如示例输出中,ens33 千兆网卡,接收和发送速率上限为 125Mbytes/s。如果遇到网络瓶颈,考虑使用万兆网或增加服务器数量,提升整体集群的网络吞吐能力
使用命令 ethtool <IFACE>
查看网卡速率
Speed: 1000Mb/s
使用 sar -n TCP 1
命令,查看 TCP 连接状态
02时59分20秒 active/s passive/s iseg/s oseg/s 02时59分21秒 0.00 0.00 1.00 1.00
active/s:每秒本地发起的 TCP 连接数,即通过 connect 调用创建的 TCP 连接
passive/s:每秒远程发起的 TCP 连接数,即通过 accept 调用创建的 TCP 连接。TCP 连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接