从 IBM® DB2® for Linux®, UNIX®, and Windows® 9 开始,DB2 有了一个新的内存调优特性 —— 自调优内存管理器(Self-tuning Memory Manager,STMM),它会自动设置几个重要的内存配置参数,从而简化内存配置任务。本文介绍一个用来分析 STMM 日志文件的简单工具,从而帮助监视内存管理器做出的决策。本文已经更新以反映日志分析器的重要改进。
要点:在阅读本文之前,请先阅读 免责声明。
简介
在启用时,内存调优器会动态地把可用的内存资源分配给多个内存消耗者,包括排序堆、包缓存、锁列表和缓冲区池。此特性会反复地小幅修改内存配置,以改进系统的总体性能。
STMM 所做的所有修改会记录在两个位置:db2diag.log 和 STMM 日志文件。下面讨论这两个日志文件的内容,以及如何使用 db2diag 工具和 parseStmmLogFile.pl 工具监视 STMM 所做的修改。
![]() ![]() |
STMM 的工作方式
STMM 在新的内部指标的帮助下做出决策,这些指标预测增加内存对给定的堆的影响。通过与 STMM 的高级调优算法结合使用,在大多数情况下,这些指标可以在一小时内把系统从开箱即用配置调整到接近最优的内存使用状态。但是,在系统调优过程中,STMM 可能做出数百个调优决策,每个决策都会导致修改配置参数或缓冲区池大小。配置文件只反映最近的修改,所以要想了解配置参数或缓冲区池的修改历史,就需要查看 db2diag.log 和 STMM 日志文件。
![]() ![]() |
通过 db2diag.log 文件监视修改
db2diag.log 文件存储内存管理器所做的每次配置修改的简单信息。在此文件中,可以看到表示配置修改的记录,见清单 1:
清单 1. 表示配置修改的记录
2006-10-17-19.10.00.912218-240 I408210A457 LEVEL: Event PID : 946302 TID : 1 PROC : db2stmm (MYDB1) 1 INSTANCE: ewhhr NODE : 001 DB : MYDB1 APPHDL : 1-52 APPID: *N1.cgarciaa.060809150048 AUTHID : CGARCIAA FUNCTION: DB2 UDB, config/install, sqlfLogUpdateCfgParam, probe:20 CHANGE : STMM CFG DB DEWHR000: "Sheapthres_shr" From: "109306" <automatic> To: "105115" <automatic> |
注意,上面的记录在配置修改前面加上了 “STMM CFG”,这表示这项修改是由 STMM 执行的,而不是用户所做的配置更新。还可以看到表示缓冲区池修改的记录,见清单 2:
清单 2. 表示缓冲区池修改的记录
2006-10-17-19.03.58.672185-240 I395047A488 LEVEL: Event PID : 946302 TID : 1 PROC : db2stmm (MYDB1) 1 INSTANCE: ewhhr NODE : 001 APPHDL : 1-52 APPID: *N1.cgarciaa.060809150048 AUTHID : CGARCIAA FUNCTION: DB2 UDB, buffer pool services, sqlbAlterBufferPoolAct, probe:90 MESSAGE : Altering bufferpool “BUFFERPOOL_16K" From: “117268" <automatic> To: “109666" <automatic> |
可以使用 db2diag 工具过滤出 db2diag.log 中的这些记录。例如,下面的命令查看对缓冲区池大小所做的所有修改:
清单 3. 查看缓冲区池修改的 db2diag 命令
db2diag -g "message:=Altering bufferpool" db2diag.log |
对于通过使用 DB2 的数据分区特性建立多个分区的数据库,可以使用 -node 选项过滤出对每个分区所做的修改。例如,下面的命令过滤出对分区 1 的所有数据库配置更新:
清单 4. 查看配置修改的 db2diag 命令
db2diag -node 1 -g "changeevent:=CFG DB" db2diag.log |
![]() ![]() |
STMM 日志
除了 db2diag.log 文件中的日志项之外,还在 STMM 日志中记录更详细的修改信息。STMM 日志存储在 db2diag.log 文件所在的目录中的 stmmlog 子目录中。STMM 日志的主要用途是供 DB2 支持人员在判断问题时使用。但是,STMM 日志中的一些调优信息可以帮助 DBA 理解 STMM 所做的调优决策。STMM 日志中的每个日志项记录在做出调优决策之前收集的统计数据,以及根据这些统计数据执行的操作。STMM 分割为最多五个文件,每个文件的最大大小为 10MB。按照一种循环方式维护这些日志文件,在创建新文件之前会删除最老的文件。
STMM 日志文件分析器的目的是过滤出重要的调优信息并进行格式化,从而便于了解内存配置的修改过程。
![]() ![]() |
分析 STMM 日志文件
分析工具 parseStmmLogFile.pl 采用以下语法:
清单 5. parseStmmLogFile.pl 语法
parseStmmLogFile.pl <log file> <database name> <options> |
此工具生成的输出采用表格形式。无论用户选择什么选项,表格的前四列都是相同的。前四列是:
- 调优号
- 发生这次调优的时间
- 从日志文件中第一次调优以来的总秒数
- 从前一次调优开始以来的秒数。这个值包含调整内存堆大小花费的时间和收集调优决策所需的统计数据花费的时间。
清单 6 给出前四列的一个示例,其中包含两次调优。
清单 6. parseStmmLogFile.pl 示例输出
[ MEMORY TUNER - LOG ENTRIES ] [ Interv ] [ Date ] [ totSec ] [ secDif ] [ ] [ ] [ ] [ ] [ 1 ] [ 02/01/2006 09:45:02 ] [ 76 ] [ 76 ] [ 2 ] [ 02/01/2006 09:46:03 ] [ 137 ] [ 61 ] |
根据选择的选项不同,此工具会分析 STMM 日志文件并收集相关的详细信息。下面是可以选用的四个选项:
- (s) — 显示所有内存消耗者的新大小(默认选项)。
- (m) — 显示所有内存消耗者的最小大小。
- (b) — 显示所有内存消耗者的收益数据。收益数据表示增加内存给所有内存消耗者带来了多大好处。
- (o) — 显示 DATABASE_MEMORY 调优信息。
另外,还有两个用来调整输出的可选标志(必须与上面的选项之一一起使用):
- (4) — 把所有内存消耗者转换为以 4KB 页面作为大小单位。
- (d) — 生成以分号分隔的输出。此选项有助于把分析器输出导入到电子表格中。
示例 1. 调整堆大小的历史
此示例显示 STMM 执行的配置参数和缓冲区池修改。
在清单 7 中,parserStmmLogfile.pl 命令显示两次调优的信息。第一次调优开始于创建这个 STMM 日志文件后 76 秒,调整的两个参数是 SHEAPTHRES_SHR 和 PCKCACHESZ。第二行显示的第二次调优开始于 61 秒之后,它把 1000 个页面从 PCKCACHESZ 转移到 SHEAPTHRES_SHR。
清单 7. 调优的示例输出
$ parseStmmLogFile.pl stmm.0.log mydbname s [ MEMORY TUNER - LOG ENTRIES ] [ Interv ] [ Date ] [ totSec ] [ secDif ] [ newSz ] [ ] [ ] [ ] [ ] [ SHEAPTHRES_SHR PCKCACHESZ ] [ 1 ] [ 02/01/2006 09:45:02 ] [ 76 ] [ 76 ] [ 31482 19438 ] [ 2 ] [ 02/01/2006 09:46:03 ] [ 137 ] [ 61 ] [ 32482 18438 ] |
示例 2. 调整数据库内存大小的历史
下面的命令输出数据库内存调优决策的基本信息。输出的信息包括内存调优器判断出的系统内存总量 (configMem)、DB2 可以使用的物理内存量 DB2 (memAvail) 以及由 DATABASE_MEMORY 配置参数指定的当前数据库共享内存量 (setConfSz)。
清单 8. 数据库内存调优的示例输出
$ parseStmmLogFile.pl stmm.0.log mydbname o [ MEMORY TUNER - DATABASE MEMORY AND OVERFLOW BUFFER TUNING - OG ENTRIES ] [ Interv ][ Date ][ totSec ][ secDif ][ configMem ][ memAvail ][ setCfgSz ] [ 1 ][ 02/01/2006 09:45:02 ][ 76 ][ 76 ][ N/A ][ N/A ][ N/A ] [ 2 ][ 02/01/2006 09:46:03 ][ 137 ][ 61 ][ 4194304 ][ 1559966 ][ 62224 ] |
示例 3. 调整 SORTHEAP 大小的历史
下面的命令输出 SORTHEAP 配置参数值的调优信息。每行表示对 SORTHEAP 值的一次成功的自动更新。输出的信息包括 SORTHEAP 配置参数以前的值 (OLD)、当前值 (NEW) 以及内存调优器计算出的最小值和最大值 (min 和 max)。
清单 9. SORTHEAP 调优的示例输出
$ parseStmmLogFile.pl stmm.0.log mydbname v [ SORTHEAP TUNING - SORTHEAP CHANGE VALIDATION RECORDS ] [ Date ][ totSec ][ secDif ][ SHEAPTHRES_SHR ][ OLD ][ NEW ][ min ][ max ] [ 02/01/2006 14:51:01 ][ 184 ][ 184 ][ 11212 ][ 373 ][ 560 ][ 224 ][ 2243 ] |
![]() ![]() |
提示和技巧
- 在运行此工具时指定的数据库名必须在 STMM 日志文件中存在。
- 为了获得最佳结果,在每次运行此工具时只指定一个选项(m、s 或 o),这可以确保结果便于理解。
- 如果在运行时不指定选项,那么默认显示新的大小,相当于使用 s 选项。
- 脚本中包含选项的详细列表,包括上面给出的示例。
- 在运行此工具的系统上,要求安装 Perl 解释器。如果系统上没有 Perl 解释器,可以从 http://www.perl.org 下载。在下载并安装此软件之前,一定要检查您的单位对使用第三方软件的管理策略,确保不会违反规定。
- 此工具是用 Perl 脚本语言开发的,所以 DBA 可以根据自己的需要修改它。例如,可以改为使用另一种能够导入其他工具的输出格式,从而允许绘制历史数据图。 (责任编辑:A6)