1 性能诊断的概念
性能诊断用于了解操作系统以及数据库的各项性能指标是否达到要求,以满足系统正常运行需要。通过性能诊断,可以更好地了解系统资源的使用情况、以及数据库的状态,提前避免由于性能不足引发的各种问题。
主要包含如下内容:
- 提前准备工作
- 系统资源诊断
- 动态视图诊断
- 跟踪日志诊断
- AWR 日志诊断
- 相关接口诊断
2 环境信息收集
环境信息收集范围主要包括硬件信息、软件信息和其他信息,分别如表2-1,2-2,2-3:
硬件 | 硬件配置 | 运行情况 |
---|---|---|
CPU | cat /proc/cpuinfo | top\vmstat\sar |
内存 | cat /proc/meminfo | top\vmstat\free |
磁盘 | RAID | iostat |
网络 | ifconfig | ping\route\netstat |
分类 | 说明 |
---|---|
数据库版本 | SELECT * FROM V$VERSION; |
数据库架构 | 单机\主备\读写分离\DSC |
交易类型 | OLTP\OLAP\OLTP 与 OLAP 混合 |
配置参数 | 资源类参数\查询优化参数 |
数据库规模 | 库大小\大表\分区表\索引 |
关注的对象 | 触发器\大字段\物化视图\外部链接 |
会话数 | SELECT COUNT(*) FROM V$SESSIONS; |
事务数 | SELECT COUNT(*) FROM V$TRX; |
等待事件 | SELECT * FROM V$TRXWAIT; |
内存池 | SELECT * FROM V$MEM_POOL; |
热点 | 热点表\热点 SQL |
分类 | 说明 |
---|---|
硬件 | 是否有硬件更换\重启\升级 |
软件 | 是否有新业务上线\新模块适配 |
用户 | 是否有业务用户增加\业务访问时间调整\业务访问模块集中 |
3 系统资源诊断
3.1 系统资源诊断的概念
系统资源诊断用于了解服务器的内存、CPU、磁盘 I/O 和网络的性能情况。系统资源诊断主要分为:
- 内存性能诊断
- CPU 性能诊断
- 磁盘 I/O 性能诊断
- 网络性能诊断
3.2 内存性能诊断
3.2.1 前置知识
Linux 内核给每一个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的,这样进程就可以很方便地访问内存,即虚拟内存。本节介绍常见内存性能分析命令,以及内存性能分析方法。
3.2.2 相关命令
3.2.2.1 top命令
&esmp;top 命令经常用来监控 Linux 系统 CPU、内存的使用情况,关于 top 命令的详细介绍见https://eco.dameng.com/document/dm/zh-cn/ops/system-monitor.html。
输入top
命令之后的返回情况示例如下:
[root@VM-8-6-centos ~]$ top
top - 01:02:39 up 23 days, 13:17, 6 users, load average: 0.13, 0.06, 0.08
Tasks: 331 total, 1 running, 330 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.5 us, 0.7 sy, 0.0 ni, 98.3 id, 0.3 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 7911456 total, 134848 free, 3924472 used, 3852136 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 3629240 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10782 root 20 0 1041692 77384 15076 S 1.3 1.0 43:35.71 YDService
9 root 20 0 0 0 0 S 0.3 0.0 13:15.30 rcu_sched
2286 root 20 0 3968 1668 1360 S 0.3 0.0 0:17.21 startup.sh
2405 mysql 20 0 1793848 384644 5320 S 0.3 4.9 80:53.50 mysqld
2959 root 20 0 754616 16200 2700 S 0.3 0.2 242:33.07 barad_agent
10835 root 20 0 922460 7448 4068 S 0.3 0.1 1:08.06 YDLive
22819 root 20 0 0 0 0 S 0.3 0.0 0:00.71 kworker/1:1
24228 dmdba 20 0 4457600 920660 11084 S 0.3 11.6 30:08.30 java
26772 root 20 0 22420 1856 1284 S 0.3 0.0 0:22.28 tmux
30999 root 20 0 116336 2556 1376 S 0.3 0.0 2:16.09 vncserver_wrapp
31408 root 20 0 716788 12848 5404 S 0.3 0.2 4:36.88 gsd-color
1 root 20 0 126048 4296 2408 S 0.0 0.1 4:43.08 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.42 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 1:13.12 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:49.63 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:05.05 watchdog/0
12 root rt 0 0 0 0 S 0.0 0.0 0:10.59 watchdog/1
13 root rt 0 0 0 0 S 0.0 0.0 0:48.94 migration/1
14 root 20 0 0 0 0 S 0.0 0.0 1:08.57 ksoftirqd/1
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
20 root 20 0 0 0 0 S 0.0 0.0 0:01.30 khungtaskd
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
25 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
26 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
27 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
28 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 edac-poller
从中可以清晰地看到系统内存情况,包括物理内存总量、空闲内存总量、使用的物理内存总量和用作内核缓存的内存量等。
3.2.2.2 vmstat命令
vmstat
是 Virtual Meomory Statistics
(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、IO 读写、CPU 活动等进行监视,在某系统中输入 vmstat 命令之后显示结果如下所示:
[root@VM-8-6-centos ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 141332 192080 3660740 0 0 3 38 9 7 1 1 98 0 0
memory 部分显示切换到内存交换区的内存大小、当前空闲的物理内存大小、用于磁盘缓存的大小、用于页面缓存的内存大小等;
swap 部分显示每秒从交换分区读回到内存的大小、每秒写入交换分区的大小等。
或使用如下命令:
3.2.3 分析方法
使用 vmstat
命令对内存性能进行分析:
[root@VM-8-6-centos ~]# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 152408 192080 3661052 0 0 3 38 9 7 1 1 98 0 0
0 0 0 152060 192080 3661052 0 0 0 0 1119 2041 1 1 99 0 0
0 0 0 152028 192080 3661052 0 0 0 0 1117 2048 1 1 99 0 0
0 0 0 152136 192080 3661052 0 0 0 340 1268 2295 1 1 99 0 0
0 0 0 152276 192080 3661056 0 0 0 0 1146 2179 1 1 99 0 0
这表示使用 vmstat 检测,每隔 1 秒刷新一次,共刷新 5 次。
对上述指标解读如下:
- memory
(1)swpd :如果 swap 的值不为 0,或者比较大,比如超过 100 MB ,但是 si 和 so 的值长期为 0,这种情况不会影响系统性能。
(2)free :空闲内存 (free) 很少或接近于 0 时,并不能认定为内存不够用,Linux 是抢占内存的 OS,还要结合 si 和 so;如果 free 很少,si 和 so 也很少(大多时候是 0),系统性能在这种情况下不会受到影响。
(3)cache :如果 cache 的值大的时候,说明 cache 处的文件数多,如果频繁访问到的文件都能被 cache,那么磁盘读 IO 的 bi 会非常小。 - swap
内存够用的时候,si 和 so 这 2 个值都是 0,如果这两个个值长期大于 0 ,表示存在虚拟内存页频繁换入换出,内存使用到了 swap 系统性能会受到影响。
3.3 CPU性能诊断
3.3.1 相关命令
3.3.1.1 top命令
类似于3.2.2.1中所示:
第三行显示 CPU 相关信息,包括:
- 当前用户空间占用 CPU 百分比
- 内核空间占用 CPU 百分比
- 用户进程空间内改变过优先级的进程占用 CPU 百分比
- 空闲 CPU 百分比
- 等待输入输出的 CPU 时间百分比
- CPU 服务于硬件中断所耗费的时间总额
- CPU 服务软中断所耗费的时间总额
- 虚拟机被 hypervisor 偷去的 CPU 时间
3.3.1.2 vmstat命令
类似于3.2.2.2或3.2.3中所示:
CPU 以百分比显示,包括:
- 用户进程执行时间
- 系统进程执行时间
- 空闲时间
- 等待 IO 时间
- 被偷走的 CPU 时间所占百分比
us + sy + id + wa =100%,近似为 100%。
3.3.2 分析方法
对其中指标解读如下:
- Procs
- r:如果在 procs 中运行的序列 (processr) 是连续的大于在系统中的 CPU 的个数,表示 CPU 比较忙,系统现在运行比较慢,有多数的进程等待 CPU。如果 r 的输出数大于系统中可用 CPU 个数的 4 倍,则系统面临着 CPU 短缺的问题,或者是 CPU 的速率过低,系统中有多数的进程在等待 CPU,造成系统中进程运行过慢。
- b:在 procs 中运行的序列 (processb),即处于不可中断状态的进程数,如果连续为 CPU 的 2~3 倍,就表明 CPU 排队比较严重。
如果 r 连续大于 CPU 的个数,甚至是 CPU 个数的几倍;b 也持续有值,甚至是 CPU 的 2~3 倍,并且 id 也持续小于 50%,wa 也比较小,这就表明 CPU 负荷很严重。
- SYSTEM
- in:每秒产生的中断次数。
- cs:每秒产生的上下文切换次数。
in
和 cs
这两个值越大,由内核消耗的 CPU 时间会越大。
- CPU
us
:用户进程消耗的 CPU 时间百分比。us 的值比较高时,说明用户进程消耗的 CPU 时间多,在服务高峰期持续大于 50~60,是可以接受的范围,但是如果长期超过 50% ,就需要考虑优化程序算法。sy
:内核进程消耗的 CPU 时间百分比。sy 的值比较高时,说明系统内核消耗的 CPU 资源多,对于这种非良性表现需要检查原因。wa
:IO 等待消耗的 CPU 时间百分比。wa 的值比较高时,说明 IO 等待比较严重,可能是由于磁盘大量做随机访问造成的,也有可能是磁盘出现了瓶颈(块操作)。id
:CPU 处于空闲状态时间百分比,如果空闲时间 (cpu id) 持续为 0 并且系统时间 (cpu sy) 是用户时间的两倍 (cpu us) ,系统则面临着 CPU 资源的短缺,如果在服务高峰期持续小于 50,是可以接受的范围。
除此之外,还可以用以下方法分析 CPU 性能:
观察 CPU 的使用率和 CPU 运行进程队列长度及负载,可以使用命令:sar -u 1 5
、sar -q 1 5
。
查看具体是什么进程在消耗 CPU,可以使用命令:top
、ps -auxw|more
。
知道了某个进程消耗大量的 CPU,想了解该进程详细内容,可以使用命令:strace
。
3.4 磁盘 I/O 性能诊断
3.4.1 相关命令
3.4.1.1 iostat命令
iostat 是 Linux 最常见的磁盘 I/O 监控工具。基本用法如下:
[root@VM-8-6-centos ~]$ iostat -d -x -k 1 5
Linux 3.10.0-1160.119.1.el7.x86_64 (VM-8-6-centos) 2024年09月16日 _x86_64_ (2 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
vda 0.00 8.21 0.12 7.16 5.54 75.54 22.27 0.01 0.78 1.76 0.77 0.50 0.36
scd0 0.00 0.00 0.00 0.00 0.01 0.00 27.44 0.00 0.50 0.50 0.00 0.47 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 1.00 0.00 8.00 0.00 16.00 0.00 1.00 1.00 0.00 1.00 0.10
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 20.00 0.00 9.00 0.00 128.00 28.44 0.01 0.56 0.00 0.56 0.67 0.60
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
参数含义:
- -d:显示设备(磁盘)使用状态。
- -k:某些使用 block 为单位的列强制使用 Kilobytes 为单位。
- 1 5:数据显示每隔 1 秒刷新一次,共显示 5 次。
- -x:获得更多统计信息。
对上述结果的解读:
rrqm/s
:每秒进行 merge(多个 IO 的合并)读操作的数量。wrqm/s
:每秒进行 merge(多个 IO 的合并)写操作的数量。rsec/s
:每秒读取的扇区数。wsec/s
:每秒写入的扇区数。rKB/s
:每秒读多少 k 字节,在 kernel 2.4 以上,rkB/s=2×rsec/s,因为一个扇区为 512 bytes。wKB/s
:每秒写多少 k 字节,在 kernel 2.4 以上,wkB/s=2×wsec/s,因为一个扇区为 512 bytes。avgrq-sz
:平均请求扇区的大小。avgqu-sz
:是平均请求队列的长度,队列长度越短越好。await
:每一个 IO 请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为 IO 的响应时间,一般地系统 IO 响应时间应该低于 5 ms,如果大于 10 ms 就比较大了。这个时间包括了队列时间和服务时间,一般情况下,await 大于 svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。svctm
:表示平均每次设备 I/O 操作的服务时间(以毫秒为单位)。如果 svctm 的值与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好,如果 await 的值远高于 svctm 的值,则表示 I/O 队列等待太长,系统上运行的应用程序将变慢。%util
:在统计时间内所有处理 IO 时间,除以总共统计时间,该参数表示设备的繁忙程度,如果该参数是 100% 表示设备已经接近满负荷运行了(如果是多磁盘,即使 %util 是 100%,因为磁盘的并发能力,所以磁盘使用不一定到了瓶颈)。
3.4.1.2 iotop命令
iotop 是一个用 python 编写的类似 top 界面的磁盘 I/O 监控工具。使用前需要先安装 iotop。安装命令如下:
yum install -y iotop
系统中输入 iotop
命令之后显示结果如下所示:
Total DISK READ : 0.00 B/s | Total DISK WRITE : 22.91 K/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 7.64 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
689 be/4 lighthou 0.00 B/s 3.82 K/s 0.00 % 0.05 % dmserver /opt/dmdbms/data/DAMENG/dm.ini -noconsole [dm_chkpnt_thd]
690 be/4 lighthou 0.00 B/s 3.82 K/s 0.00 % 0.05 % dmserver /opt/dmdbms/data/DAMENG/dm.ini -noconsole [dm_redolog_thd]
8624 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.01 % [kworker/0:0]
845 be/4 lighthou 0.00 B/s 7.64 K/s 0.00 % 0.00 % dmserver /opt/dmdbms/data/DAMENG/dm.ini -noconsole [dm_sched_thd]
2958 be/4 root 0.00 B/s 3.82 K/s 0.00 % 0.00 % barad_agent
13242 be/4 root 0.00 B/s 3.82 K/s 0.00 % 0.00 % dockerd -H fd:// --containerd=/run/containerd/containerd.sock
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 22
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
27307 be/4 postfix 0.00 B/s 0.00 B/s 0.00 % 0.00 % pickup -l -t unix -u
4 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H]
6 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
8 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_bh]
9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched]
10 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [lru-add-drain]
11 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
12 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/1]
13 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1]
14 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/1]
31405 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % gsd-a11y-settings [gdbus]
16 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/1:0H]
18 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kdevtmpfs]
19 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [netns]
20 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khungtaskd]
21 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [writeback]
28694 be/4 dmdba 0.00 B/s 0.00 B/s 0.00 % 0.00 % ibus-engine-libpinyin --ibus [gmain]
23 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bioset]
24 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bioset]
25 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bioset]
26 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kblockd]
27 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [md]
28 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [edac-poller]
29 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdogd]
36 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kswap
结果解读:
- DISK READ 和 DISK WRITE 字段:代表块设备在采样时间内的 I/O 带宽。
- SWAPIN 和 IO 字段:表示当前进程或线程花费在页面换入和等待 I/O 的时间。
- PRIO 字段:表示 I/O 优先级。
- Total DISK READ 和 Total DISK WRITE 字段:表示总的 I/O 读写情况。
3.4.2 分析方法
使用 vmstat 命令对磁盘 I/O 性能进行分析:
[root@VM-8-6-centos ~]$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 210396 191996 3605016 0 0 3 38 10 8 1 1 98 0 0
0 0 0 210016 191996 3605016 0 0 0 116 1278 2273 1 1 98 0 0
0 0 0 209484 191996 3605012 0 0 0 0 1293 2348 1 1 98 0 0
0 0 0 210536 191996 3605012 0 0 0 0 1089 1988 1 1 99 0 0
0 0 0 210596 191996 3605020 0 0 0 0 1469 2949 2 2 96 0 0
如果 b 的值为 2~3 倍 CPU 数量,bi 和 bo 的值很大(有时 bi 和 bo 值很小,但 in 和 cs 很大,也会引起磁盘 IO 负载重),wa 的值持续很高,如高于 40,id 也持续高于 70,这些现象都表明系统的 IO 可能出现性能问题。
可以进一步通过 iostat 命令分析,如下所示:
[root@VM-8-6-centos ~]# iostat -x 1 5
Linux 3.10.0-1160.119.1.el7.x86_64 (VM-8-6-centos) 2024年09月16日 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.74 0.00 0.71 0.13 0.00 98.42
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 8.21 0.12 7.17 5.55 75.54 22.28 0.01 0.78 1.76 0.77 0.50 0.36
scd0 0.00 0.00 0.00 0.00 0.01 0.00 27.44 0.00 0.50 0.50 0.00 0.47 0.00
avg-cpu: %user %nice %system %iowait %steal %idle
0.50 0.00 0.50 0.00 0.00 98.99
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
avg-cpu: %user %nice %system %iowait %steal %idle
0.99 0.00 0.99 0.50 0.00 97.52
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 13.00 0.00 2.00 0.00 60.00 60.00 0.00 1.00 0.00 1.00 1.50 0.30
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
avg-cpu: %user %nice %system %iowait %steal %idle
0.51 0.00 0.00 0.00 0.00 99.49
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 11.00 0.00 9.00 0.00 92.00 20.44 0.01 0.56 0.00 0.56 0.67 0.60
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
avg-cpu: %user %nice %system %iowait %steal %idle
0.50 0.00 1.01 0.00 0.00 98.49
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 1.00 0.00 4.00 8.00 0.00 0.00 0.00 0.00 1.00 0.10
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
结果分析:
- 检查 %util(服务 IO 的时间占总时间的百分比),如果这个值接近 100%,表示 IO 的请求很多(表示任务服务的所有时间几乎都用在 IO 上),这种现象表明磁盘 IO 性能出现瓶颈。
- 检查 await(表示每次 IO 设备等待时间)和 svctm(表示每次 IO 设备服务时间,一般性能越好的磁盘,这个值越小)。
-
- 如果 svctm 接近 await ,说明 IO 几乎没有等待,每个 IO 设备都得到及时的响应。
-
- 如果 svctm 远小于 await ,说明 IO 等待队列可能很长,IO 的得到服务的时间将延长(排队 + 服务时间)。
- avgqu-sz:表示 IO 排队的现象,如果排队过长会影响 IO 的响应时间。
- r/s+w/s:可以计算当前系统的 iops(可以结合硬盘的测试或者硬件参数来衡量是否超过磁盘的 iops 最大值)。
通过 iostat 了解到如果磁盘 I/O 出现性能瓶颈,可以借助 pidstat ,定位出导致瓶颈的进程,分析进程的 I/O 行为,结合应用程序的原理,分析这些 I/O 的来源。
3.5 网络性能诊断
3.5.1 意义
网络性能对数据库也有很大的影响,数据库服务器和 Web 服务器之间会进行网络传输,网络延迟和带宽大小都是影响因素。
3.5.2 相关命令
3.5.2.1 ifconfig命令
ifconfig
是 linux 中用于显示或配置网络设备(网络接口卡)的命令。在某系统中输入此命令后显示结果如下所示:
[root@VM-8-6-centos ~]# ifconfig
br-870c978be774: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.1 netmask 255.255.255.0 broadcast 172.16.1.255
inet6 fe80::42:22ff:fe63:2d86 prefixlen 64 scopeid 0x20<link>
ether 02:42:22:63:2d:86 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-f0c46f65d5ee: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::42:d1ff:fe12:4809 prefixlen 64 scopeid 0x20<link>
ether 02:42:d1:12:48:09 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.2.8.6 netmask 255.255.252.0 broadcast 10.2.11.255
inet6 fe80::5054:ff:fe43:ce25 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:43:ce:25 txqueuelen 1000 (Ethernet)
RX packets 10699769 bytes 2419107627 (2.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9807517 bytes 2090254060 (1.9 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 5102188 bytes 400704536 (382.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5102188 bytes 400704536 (382.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth2cf7fc1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::8428:12ff:fe08:b140 prefixlen 64 scopeid 0x20<link>
ether 86:28:12:08:b1:40 txqueuelen 0 (Ethernet)
RX packets 183317 bytes 11978302 (11.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 183311 bytes 261140845 (249.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:9f:38:bd txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
以随意一个网卡为例解释其中部分信息的含义:
- 第一行中的 “UP” 表示接口已启用
- “RUNNING” 表示接口在工作中
- “mtu 1500” 表示最大传输单元为 1500 字节
- 第二行中的 “inet” 表示 ip 地址
利用 ifconfig
命令可以对网络信息有一个基本的了解,在此基础上可以利用 ethtool
命令查询网络传输速率。
3.5.2.2 ethtool命令
使用 ethtool 命令可以查看指定网口对应的网络传输速率。执行示例:
[root@VM-8-6-centos ~]$ ethtool vethdb38401
Settings for vethdb38401:
Supported ports: [ ]
Supported link modes: Not reported
Supported pause frame use: No
Supports auto-negotiation: No
Supported FEC modes: Not reported
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: 10000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: off
MDI-X: Unknown
Link detected: yes
结果解读:
- Supported link modes 为网卡支持的连接模式。
- speed 和 duplex 字段为当前网络速率和模式。
3.5.3 分析方法
3.5.3.1 使用 ping 命令测试网络的连通性和响应时间。
ping 发送 ICMP echo 数据包来探测网络的连通性,除了能直观地看出网络的连通状况外,还能获得本次连接的往返时间(RTT 时间),丢包情况,以及访问的域名所对应的 IP 地址(使用 DNS 域名解析)。
[root@VM-8-6-centos ~]$ ping -c 4 baidu.com
ping -c 4 baidu.com
PING baidu.com (110.242.68.66): 56 data bytes
64 bytes from 110.242.68.66: icmp_seq=0 ttl=54 time=11.634 ms
64 bytes from 110.242.68.66: icmp_seq=1 ttl=54 time=12.085 ms
64 bytes from 110.242.68.66: icmp_seq=2 ttl=54 time=12.357 ms
64 bytes from 110.242.68.66: icmp_seq=3 ttl=54 time=11.679 ms
--- baidu.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 11.634/11.939/12.357/0.299 ms
解析到 baidu 的一台服务器 IP 地址为 110.242.68.66。RTT 时间的最小、平均、最大和算术平均差分别是 11.634ms、11.939ms、12.357ms 和 0.299ms。
3.5.3.2 使用 sar 命令测试网络带宽
sar
命令使用 -n 选项可以汇报网络相关信息。
[root@VM-8-6-centos ~]# sar -n DEV 1 3
Linux 3.10.0-1160.119.1.el7.x86_64 (VM-8-6-centos) 2024年09月16日 _x86_64_ (2 CPU)
02时00分31秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
02时00分32秒 vethbc88527 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 veth92841cd 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 vethe6bec48 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 vethdb38401 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 vethd524e00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 veth8e5b4f8 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 eth0 3.00 1.00 0.18 0.09 0.00 0.00 0.00
02时00分32秒 lo 14.00 14.00 1.03 1.03 0.00 0.00 0.00
02时00分32秒 virbr0-nic 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 br-870c978be774 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 br-f0c46f65d5ee 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 vethe0e5936 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 veth4d16748 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 docker_gwbridge 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 veth2cf7fc1 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 veth851d8eb 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分32秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
02时00分33秒 vethbc88527 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 veth92841cd 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 vethe6bec48 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 vethdb38401 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 vethd524e00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 veth8e5b4f8 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 eth0 10.00 11.00 0.76 3.69 0.00 0.00 0.00
02时00分33秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 virbr0-nic 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 br-870c978be774 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 br-f0c46f65d5ee 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 vethe0e5936 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 veth4d16748 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 docker_gwbridge 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 veth2cf7fc1 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 veth851d8eb 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分33秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
02时00分34秒 vethbc88527 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 veth92841cd 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 vethe6bec48 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 vethdb38401 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 vethd524e00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 veth8e5b4f8 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 eth0 2.00 3.00 0.14 2.04 0.00 0.00 0.00
02时00分34秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 virbr0-nic 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 br-870c978be774 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 br-f0c46f65d5ee 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 vethe0e5936 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 veth4d16748 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 docker_gwbridge 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 veth2cf7fc1 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 veth851d8eb 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02时00分34秒 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
????: vethbc88527 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: veth92841cd 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: vethe6bec48 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: vethdb38401 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: vethd524e00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: veth8e5b4f8 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: eth0 5.00 5.00 0.36 1.94 0.00 0.00 0.00
????: lo 4.67 4.67 0.34 0.34 0.00 0.00 0.00
????: virbr0-nic 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: br-870c978be774 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: br-f0c46f65d5ee 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: vethe0e5936 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: veth4d16748 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: docker_gwbridge 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: veth2cf7fc1 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: veth851d8eb 0.00 0.00 0.00 0.00 0.00 0.00 0.00
????: docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
在上图中可以看到:
- 每秒钟接收到的包数目
- 每秒钟发送出去的包数目
- 每秒钟接收到的字节数
- 每秒钟发送出去的字节数
- 每秒钟接收到的压缩包数目
- 每秒钟接收到的多播包的包数目
通过这些参数可以对网络带宽有更好的了解。
4 动态视图诊断
利用动态视图可以便捷查询数据库相关信息,并定位数据库性能问题。以下介绍 4 种动态性能视图的诊断方法,分别是查询活动会话数、查询耗时超过 2 秒的 SQL、查询锁和查询阻塞。
- 查询活动会话数,活动会话数量达到一定程度后会对数据库性能造成影响。
select
(select count(*)
from v$sessions
where state='ACTIVE' and sess_id != sessid()
) act_ses,
(select count(*) from v$sessions) tot_ses;
- 查询已执行超过 2 秒的活动 SQL。
select *
from ( SELECT sess_id,
sql_text,
state,
datediff(ss,last_recv_time,sysdate) Y_EXETIME,
to_char(SF_GET_SESSION_SQL(SESS_ID)) fullsql,
clnt_ip
FROM V$SESSIONS
WHERE STATE='ACTIVE')
where Y_EXETIME>=2;
- 查询锁
SELECT O.NAME,L.* FROM V$LOCK L,SYSOBJECTS O WHERE L.TABLE_ID=O.ID AND BLOCKED=1;
- 查询阻塞
WITH LOCKS
AS (SELECT O.NAME,L.*,S.SESS_ID,S.SQL_TEXT,S.CLNT_IP,S.LAST_SEND_TIME
FROM V$LOCK L, SYSOBJECTS O, V$SESSIONS S
WHERE L.TABLE_ID = O.ID AND L.TRX_ID = S.TRX_ID),
LOCK_TR
AS (SELECT TRX_ID WT_TRXID, TID BLK_TRXID
FROM LOCKS
WHERE BLOCKED = 1),
RES
AS (SELECT SYSDATE STATTIME,T1.NAME,T1.SESS_ID WT_SESSID,S.WT_TRXID,
T2.SESS_ID BLK_SESSID,S.BLK_TRXID,T2.CLNT_IP,
SF_GET_SESSION_SQL (T1.SESS_ID) FULSQL,
DATEDIFF (SS, T1.LAST_SEND_TIME, SYSDATE) SS,
T1.SQL_TEXT WT_SQL
FROM LOCK_TR S, LOCKS T1, LOCKS T2
WHERE T1.LTYPE = 'OBJECT'
AND T1.TABLE_ID <> 0
AND T2.LTYPE = 'OBJECT'
AND T2.TABLE_ID <> 0
AND S.WT_TRXID = T1.TRX_ID
AND S.BLK_TRXID = T2.TRX_ID)
SELECT DISTINCT WT_SQL,CLNT_IP,SS,WT_TRXID,BLK_TRXID
FROM RES;
5 跟踪日志诊断
跟踪日志文件是一个纯文本文件,以 ‘dmsql_实例名_日期_时间命名’,默认生成在 DM 安装目录的 log 子目录下。跟踪日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息、执行时间等。跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态进行分析。跟踪日志配置方式如下:
- 配置 dm.ini 文件,设置 SVR_LOG = 1 以启用 sqllog.ini 配置,该参数为动态参数,可通过调用数据库函数直接修改:
SP_SET_PARA_VALUE(1,'SVR_LOG',1);
- 配置数据文件目录下的 sqllog.ini 文件。注意⚠️,为避免记录 SQL log 对服务器产生较大的影响,可以配置异步日志刷新(参数 ASYNC_FLUSH 设置为1)。:
[dmdba@localhost DAMENG]$ cat sqllog.ini
BUF_TOTAL_SIZE = 10240 #SQLs Log Buffer Total Size(K)(1024~1024000)
BUF_SIZE = 1024 #SQLs Log Buffer Size(K)(50~409600)
BUF_KEEP_CNT = 6 #SQLs Log buffer keeped count(1~100)
[SLOG_ALL]
FILE_PATH = ../log
PART_STOR = 0
SWITCH_MODE = 1
SWITCH_LIMIT = 100000
ASYNC_FLUSH = 0
FILE_NUM = 200
ITEMS = 0
SQL_TRACE_MASK = 2:3:23:24:25
MIN_EXEC_TIME = 0
USER_MODE = 0
USERS =
- 如果对 sqllog.ini 进行了修改,可通过调用以下函数即时生效,无需重启数据库:
SP_REFRESH_SVR_LOG_CONFIG();
- sqllog.ini 文件配置成功后可在 dmsql 指定目录下生成 dmsql 开头的 log 日志文件;可以通过正则表达式在 dmsql 日志文件中查找执行时间超过一定阈值的 SQL 语句。例如:查找执行时间超过 10 秒的 SQL 语句。
[1-9][0-9][0-9][0-9][0-9](ms)
如需进行更为系统全面的分析,可使用 DMLOG 工具对 SQL 进行分类汇总。
6 接口日志诊断
达梦提供各种接口日志,包括 DPI/DCI 日志、ODBC 日志和 JDBC 日志。通过这些日志可以查看报错信息,更好地对问题进行诊断,排查错误。接口日志的开启方法请参考实例状态监控-接口日志。
在接口的 URL 连接串中,可以添加日志相关属性。下表所展示的 JDBC 连接串日志相关属性。更多接口连接串属性请参考达梦安装目录下的 doc 文件夹的《DM8 程序员手册》。
属性 | 说明 | 是否必须设置 |
---|---|---|
logDir | 日志等其他一些 JDBC 过程文件生成目录,默认为 jvm 当前工作目录; | 否 |
logLevel | 生成日志的级别,日志从低到高依次如下(off:不记录;error:只记录错误信息;warn:记录警告信息;sql:记录sql 执行信息;info:记录全部执行信息;all:记录全部),高级别同时记录低级别的信息;默认 off; | 否 |
logFlushFreq | 日志刷新盘频率;单位 s,有效值范围 0~2147483647;默认 60; | 否 |
statEnable | 是否启用状态监控;取值 1/0 或 true/false;默认 false; | 否 |
statDir | 状态监控信息以文本文件形式输出的目录,默认为 jvm 当前工作目录; | 否 |
statFlushFreq | 状态监控统计信息写文件刷盘频率;单位 s,有效值范围 0~2147483647;0 表示不写文件;默认 10; | 否 |
statSlowSqlCount | 统计慢 sql top 行数;有效值范围 0~1000;默认 100; | 否 |
statHighFreqSqlCount | 统计高频 sql top 行数;有效值范围 0~1000;默认 100; | 否 |
在 jdbc 日志中可以查看接口连接信息。若接口日志中出现异常,可联系相关技术人员进行错误分析。