下面指出处于 DB2 调优领域之外的一些潜在的问题,这些问题同样能大大降低数据库的性能。
如果一个系统中 CPU 的总利用率(用户 + 系统)大于 80%,则认为该系统是 CPU 限制的(CPU bound)。经验法则是,保持 CPU 利用率(大部分情况下)低于 80%,这样可以为处理突然增加的大量活动预留 CPU 的处理能力。如果系统是 CPU 限制的,那么就很难总结出问题所在。这可以是从无效率的访问计划到需要更多 CPU 资源的并发连接过多的任何问题。
在 Unix 中,用 vmstat (例如 "vmstat 3")进行监视。在 Windows 中,用 Perfmon.exe 或 Task Manager 进行监视。忽略在遇到短的突发事件(1-3 秒)时 100% 运行的 CPU,而关注长期的平均 CPU 利用情况。
清单 19展示了来自 RedHat 8.0 Linux 的某个输出,其中重要的列用粗体强调。您需要观察的列是用户 CPU 利用率(us)和系统 CPU 利用率(sy)。id 列显示了空闲时间。每次都应该忽略掉第一行。这里我们看到的系统有相当高的用户 CPU 利用率,而系统利用率则一般。
[db2inst1@65658161 db2inst1]$ vmstat 3 procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 0 0 0 0 704388 65460 165592 0 0 0 21 20 9 2 2 6 0 1 1 0 642096 65660 206060 0 0 515 2149 911 1047 18 9 72 2 1 0 0 639712 65668 208292 0 0 139 2287 862 938 30 10 60 1 0 0 0 629772 65692 215496 0 0 0 581 568 422 94 1 4 1 0 0 0 625764 65696 218956 0 0 0 1809 612 423 91 1 8 1 0 0 0 623752 65704 220752 0 0 11 1741 712 549 85 8 7 0 0 0 0 633548 65712 217768 0 0 11 1264 728 700 17 4 79 1 0 0 0 633556 65712 217768 0 0 0 87 621 280 5 7 88 0 0 0 0 633556 65712 217768 0 0 0 0 519 150 0 0 100 1 0 0 0 633556 65712 217768 0 0 0 0 523 154 0 0 100 |
高的 CPU 利用率有时候要归因于对大型表的过度表扫描或索引扫描。通过分析 "rows read"值(在 SQL 快照中)很高的 SQL 语句,寻找建立索引的可能性。
还可以在进程级上进行监视,以更好地了解是什么正在消耗 CPU。在 UNIX 上用 ps (例如 "ps uax")进行监视,在 Windows 则用 Perfmon.exe 或 Task Manager 进行监视。忽略掉突发的(1 到 3 秒)100% 利用率的情况,只关注长期的平均值。
例如,在 RedHat Linux 8.0 上,我们可以通过发出 "ps uax" 查看每个进行占用多少的 CPU:
[db2inst1@65658161 tmp]$ ps uax user PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND db2inst1 9967 0.0 2.5 123416 26620 ? S Feb15 0:00 db2agent (idle) db2inst1 10020 2.1 7.4 435200 76952 ? R Feb15 2:12 db2agent (TEST1) db2inst1 3643 0.1 3.9 249544 41220 ? S 13:17 0:00 db2loggw (TEST1) db2inst1 3649 0.0 4.0 249540 41320 ? S 13:17 0:00 db2pclnr |
如果一个系统中磁盘利用率一般超过 45%,则认为该系统是 I/O 限制的。如果存在磁盘瓶颈,那么应确保表空间的容器分布在所有可用磁盘上。如果磁盘利用率仍然很高,那么很可能就需要更多的磁盘。
不幸的是,取决于所使用的操作系统,iostat 有不同格式的输出。在 UNIX 中,用 iostat (例如 "iostat 3")进行监视,而在 Windows 中则用 Perfmon.exe 进行监视。忽略掉突发(1-3 秒)的利用率 100% 的情况,只关注长期的平均利用率。
如果使用的是 Linux 操作系统,则使用 "iostat –d –x 3" 命令以便支持扩展的磁盘信息,并寻找服务时间大于 50 ms(svctm)的磁盘,以及利用率超过 45% 的磁盘。由于格式的关系,下面的输出中省略了某些数据列。
[db2inst1@65658161 tmp]$ iostat -d -x 3 Linux 2.4.18-14 (65658161.torolab.ibm.com) 02/18/2004 Device: r/s w/s rsec/s wsec/s rkB/s wkB/s await svctm %util /dev/hda 0.01 2.25 0.19 41.81 0.09 20.91 0.60 1.88 0.42 /dev/hda1 0.00 0.00 0.00 0.00 0.00 0.00 277.20 176.86 0.00 /dev/hda2 0.00 0.00 0.00 0.00 0.00 0.00 4.11 4.11 0.00 /dev/hda3 0.01 2.25 0.19 41.81 0.09 20.91 0.58 0.66 0.15 Device: r/s w/s rsec/s wsec/s rkB/s wkB/s await svctm %util /dev/hda 0.00 383.67 0.00 5632.00 0.00 2816.00 8.10 1.35 51.97 /dev/hda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 /dev/hda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 /dev/hda3 0.00 383.67 0.00 5632.00 0.00 2816.00 8.10 2.16 82.93 |
从 DB2 的角度来看,如果一个系统发生了换页,则称该系统是内存限制的(memory bound) 的。一旦开始换页,性能通常就会急剧下降。
在 UNIX 中,使用 "lsps 鈥揳" 列出调页空间的特征,并且用 vmstat (例如 "vmstat 3")进行监视。在 Windows 中,用 Perfmon.exe 或 Task Manager 进行监视。
例如,在 RedHat Linux 8.0 中,您需要注意交换(swap)信息。特别地,换入(si)和换出(so)列显示了从磁盘换入内存的空间大小和从内存换出到磁盘的空间大小,以 KB/sec 为单位(在 AIX 上是以 4K pages/sec 为单位的)。
[db2inst1@65658161 tmp]$ vmstat 3 procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 0 0 0 0 675160 66088 175908 0 0 0 21 22 9 2 2 6 0 0 0 0 675096 66088 175908 0 2 0 37 624 246 5 7 88 2 0 0 0 665376 66088 183408 0 0 11 88 666 826 6 8 85 1 0 0 0 665376 66088 183408 1 0 0 76 623 452 5 8 88 2 0 0 0 654748 66096 191112 0 0 79 48 619 847 2 4 94 3 0 0 0 652760 66096 191192 0 0 15 47 578 791 2 2 96 |
虽然通常网络不是一个重大的瓶颈,但在这方面进行某些调优也可以提高性能。如果一个系统的 CPU 和 I/O 利用率都很低,则认为该系统是网络限制的(Network bound),并且在通过网络与 DB2 服务器进行通信时存在性能问题。在一个分了区的数据库中,如果分区策略产生了一些非合并连接,则可能导致最严重的性能下降。
在 UNIX 中可以用 netpmon (例如 "netpmon -O all -o netpmon.out")进行监视,在 Windows 中可以用 Perfmon.exe 进行监视。