性能瓶颈诊断

本文档介绍 SequoiaDB 数据库性能瓶颈分析思路,帮助用户找到系统瓶颈并优化。在满足基本功能的基础之上,性能问题是数据库行业用户最关心的问题,而它也是数据库领域最难分析和解决的问题之一。因为它的问题细分种类太多,原因多种多样,所以正确的问题诊断策略和手段必不可少。性能问题诊断一般包含以下步骤:

  • 了解应用系统
  • 收集数据

了解应用系统

在诊断性能问题前,需要了解应用系统的类型,包括并发度、写入量和高频查询语句。根据不同类型系统,缩小最可能的可疑点,重点收集和调优对应的指标。

  • 并发读高的应用,重点分析CPU、内存相关

  • 写入量高重点分析磁盘IO相关

  • 高频查询语句可以通过SQL调优尝试

收集数据

收集数据的来源,通常分成两大类:一是数据库提供的信息,二是一些数据库之外的通用信息,最常见的就是操作系统层面的数据。

在系统压测过程中,分别收集以下各类性能指标:

  • 通过快照命令,收集数据库集群性能指标,包括数据库连接数、数据读写、索引读写、增删改操作计数
  • 通过操作系统命令,收集系统层面的性能指标,包括以下几类:
    • CPU
    • 磁盘
    • 内存
    • 网络

CPU 使用率

  • 使用 top 命令, 查看cpu使用情况

    1. %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 情况:

    1. Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
    2. 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 性能(可以参照 IO 操作平均等待时间)。如果到达 100%,说明磁盘 I/O 已经饱和。

Note:

如果通过上述命令,发现磁盘读写遇到瓶颈,可以从以下几个方面进一步分析原因:

  • 索引缺失
  • 数据分布不均匀或存在热点数据
  • 集群硬件资源不足

内存

  • 使用 vmstat 1 命令,查看服务器内存使用情况:

    1. procs -----------memory---------- ---swap-- -----io---- -system-- ------ cpu-----
    2. r b swpd free buff cache si so bi bo in cs us sy id wa st
    3. 3 0 0 750176 948 1299700 0 0 77 18 167 707 0 1 99 0 0
  • memory

    • swpd: 使用虚拟内存大小,linux将不经常使用的页面从内存中写入交换空间,该值表示交换空间的使用大小,注意交换空间使用了很多并不能表示服务器内存资源不足,需结合free的值分析。
    • free: 空闲物理内存大小,由于linux内存使用策略,会将部分内存作为缓存,尽可能的利用内存提高读写性能,如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序,因此应用实际可用的内存是free+buff+cache的总和。
    • buff: 用作缓冲写操作的内存大小,将写磁盘操作先写入内存缓冲区,定期写入磁盘,可以将分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道耗时。
    • cache: 用作缓存读操作的内存大小,磁盘读操作会读取检索数据所在的整个数据页数据,并将数据页放入内存进行缓存,当应用再次访问数据页内的数据时,将直接从内存中读取,提高读操作性能。
    • swap: 交换区写入和读取的数量, 如果这两项数据较高,说明系统已经在使用交换区(swap),服务器物理内存资源不足,系统性能会大幅下降。此时需要增加系统内存资源。

网络

  • 使用 sar -n DEV 1 命令,查看服务器网络设备的吞吐率:

    1. 024301 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
    2. 024302 ens33 1.08 1.08 0.06 0.17 0.00 0.00 0.00
  • 使用命令 ethtool 查看网卡速率:

    1. Speed: 1000Mb/s
  • rxkB/s、txkB/s: 网卡接收和发送数据速率,如果接收或发送速率达到网卡上限,表明网络设备已经饱和。如示例输出中,ens33 千兆网卡,接收和发送速率上限为 125 Mbytes/s。如果遇到网络瓶颈,考虑使用万兆网或增加服务器数量,提升整体集群的网络吞吐能力

  • 使用 sar -n TCP 1 命令,查看TCP连接状态:

    1. 025920 active/s passive/s iseg/s oseg/s
    2. 025921 0.00 0.00 1.00 1.00
  • active/s: 每秒本地发起的 TCP 连接数,即通过 connect 调用创建的 TCP 连接

  • passive/s: 每秒远程发起的 TCP 连接数,即通过 accept 调用创建的 TCP 连接。TCP 连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接