guanwei
作者guanwei·2015-12-02 18:58
助理咨询顾问·ETC

DB2的并行和DB2_PARALLEL_IO变量

字数 4228阅读 2832评论 1赞 4

许多人都知道DB2有一个注册变量参数DB2_PARALLEL_IO,但对它的玩法,可能还是懵圈的人多了解的人少,为什么要设置DB2_PARALLEL_IO,好处是啥?设置DB2_PARALLEL_IO会影响DB2对一个表空间的IO并行度(Parallelism)计算,而恰当的使用并行可以提高数据库性能。

让数据库对一个任务并行处理可以提高性能,当你在进行逻辑设计和物理设计时,是否并行,能否并行这些因素就要考虑进来了,所以你必须知道DB2支持的并行类型都有哪些,吼吼,其实就只有三种:

  • Utility并行
  • Query并行
  • IO并行

Utility并行的典型代表是DPF环境下的load工具使用,未来打算专写一篇博文叙述。

比较爱混和难搞的是Query并行,Query并行分为InterQuery和IntraQuery。InterQuery就是我们熟悉的并发查询,数据库要伺候多个应用,每个应用都可能产生查询,并且这些查询和其他查询无关,都是独立的,DB2必须从容应对这些同时发起的查询,这也是商用关系型数据库吃饭的家伙,最基础的功能。

下面这个图画的是InterQuery,InterQuery的特点是为响应时间做出了贡献。


1.png

IntraQuery略复杂些,它是把查询分成多个部分,然后汇总结果形成结果集,其实有一些DB2实用工具就是这么做的。

下面这个图画的是IntraQuery,IntraQuery的特点是为大吞吐量做出了贡献。

2.png

IntraQuery的子查询可以在同一个数据库分区内产生,也可以在不同的数据库分区,在同一个数据库分区内的叫分区内并行(IntraPartitionQuery Parallelism);处于不同数据库分区的叫分区间并行(InterpartitionQuery Parallelism),分区间并行的例子就是DPF。

分区内并行的启用和停用有3种途径:

  • 修改实例参数INTRA_PARALLEL
  • 使用ADMIN_SET_INTRA_PARALLEL存储过程
  • 设置工作负载选项MAXIMUM DEGREE选项值为1

db2inst1@psuse:~>db2 update dbm cfg using intra_parallel yes

DB20000I  The UPDATE DATABASE MANAGER CONFIGURATIONcommand completed successfully.

分区内并行还有一个度(DEGREE)的概念,它分为2种,一个是针对优化器,一个是针对运行时的,对于优化器的,又可以细分为对静态SQL还是动态SQL。这块可以理解为主要用于控制分区内并行的活跃程度,因为得瑟大劲并不是什么好事。

下面这个图或许便于你记忆:

3.png

有关查询并行的内容细节还有许多,这里仅是点到为止,让我们把第三种并行:IO并行再来仔细说下,

设置DB2_PARALLEL_IO会影响DB2对一个表空间的IO并行度计算,而并行IO其实对DB2的预取动作会产生影响,即prefetch会对性能产生影响。我见过好多人都设置DB2_PARALLEL_IO,但原因往往模糊不清,其实我自己也晕,现在开始抛砖,希望能引出美玉。这个参数用于告诉DB2表空间的每个容器可以使用的磁盘个数是多少。磁盘个数,DB2做为操作系统之上的一个软件,它是不能知道用于数据文件的真实磁盘数是有多少个的。DB2就是这样,如果它能确定某件事,比如说CPU主频率,那它决不会去问你。OK,如果每个容器就只有一个物理盘可以用,这没什么好说的,让一个prefetch顺序请求来处理好了,可是如果容器跨了多个物理盘,那么咱们就可以有机会让这些物理盘同时工作起来,多发出几个prefetch请求,然后同时去不同的物理盘上去读数据,即并行IO,这听起来多么美好啊!

如果设置了DB2_PARALLEL_IO,就等于显式地告诉了DB2,启动了并行IO;如果没有设置DB2_PARALLEL_IO,并且表空间容器个数是1个以上的话,就等于隐式地告诉了DB2启动了并行IO。

大家知道DB2_PARALLEL_IO参数的值设定方法有点小变态,在所有操作系统平台下,它的默认值是NULL(pureScale环境下默认值是*),设置的格式是:

db2setDB2_PARALLEL_IO=TablespaceID:[n]

可以把TablespaceID写为*,表示所有表空间,后面的n如果不写,n默认值是6,来看这个示例:

db2setDB2_PARALLEL_IO =*,2:4

表示数据库所有表空间的每个容器使用的物理盘数是6,但只有2号表空间除外,它的容器使用的物理盘数是4。

当某个表空间的prefetchsize设置值为AUTOMATIC时,DB2就依靠DB2_PARALLEL_IO的参数值来计算确定并行度,换句话说:当某表空间的prefetchsize值为AUTOMATIC时,DB2是根据磁盘个数来算出prefetchsize值的大小的。这样一来,prefetchsize是否为AUTOMATIC,DB2_PARALLEL_IO是否已设置,这些组合就出来了,DB2怎么样来确定并行度?下面这个表格说明了这个问题:

PrefetchSize值

DB2_PARALLEL_IO值

并行度结果

AUTOMATIC

NULL

容器个数

AUTOMATIC

TABLE SPACE ID

容器个数乘以6

AUTOMATIC

TABLE SPACE ID:n

容器个数乘以n

指定值

NULL

容器个数

指定值

TABLE SPACE ID

PrefetchSize/ExtentSize

指定值

TABLE SPACE ID:n

PrefetchSize/ExtentSize

根据这个表格举3个例子:

第1个例子是表格的最后一行,假设表空间有2个容器,每个容器有2个物理盘给它使用,设置DB2_PARALLEL_IO=*:2,prefetchsize被设置成extentsize的4倍,那么当prefetch请求发生时,并行度的结果是PrefetchSize/ExtentSize=4,即prefetch将被分解为并行的4个请求。所以可以看出,如果prefetchsize指定了固定值,设置DB2_PARALLEL_IO与否和并行度无关。

第2个例子是表格的第1行,假设表空间有3个容器,prefetchsize被设置成AUTOMATIC,DB2_PARALLEL_IO=NULL,那么当prefetch请求发生时,并行度的结果是容器个数,即prefetch将被分解为并行的3个请求。

第3个例子是表格的第3行,假设表空间有2个容器,每个容器有3个物理盘给它使用,prefetchsize被设置成AUTOMATIC,设置DB2_PARALLEL_IO =*:3,则并行度为2X3=6。

上面这3个例子都超简单,设置合理的并行度有利于提高性能,但是胡乱设置DB2_PARALLEL_IO的话则会有可能引起磁盘争用问题,反尔对性能不利,这个问题从2个场景来考虑,即容器是否创建在RAID上。

第1个场景,容器直接放在物理盘上,没有使用RAID。有一个表空间,有4个容器,每个容器单独放在一块物理盘上,PrefetchSize被设置为AUTOMATIC,如果不设置DB2_PARALLEL_IO,DB2会隐式启用IO并行,根据上面那个表,并行度等于容器个数,即是4。当表空间prefetch被触发时,DB2发出并行的4个IO请求,假设是P1至P4,它们分别访问不同的物理盘,P1至P4各司其职,工作状态良好,见下面这个图:

4.png

如果DBA对DB2_PARALLEL_IO参数理解的不好,误设置为*:4,看看这个时候会发生什么,根据并行度计算原则,并行度等于4X4=16,这个时候prefetch动作会变成下面这个图描绘的样子:

5.png

每个容器有4个并行的prefetch动作被招呼,由于每个容器都是对应一个物理盘,这个时候就会掐架发生磁盘争用,所以在容器直接放在物理盘上,没有使用RAID的情况下,干脆别设置DB2_PARALLEL_IO。

第2个场景,容器被放置在RAID上。有一个表空间,有2个容器,2个RAID组可用,每个容器单独放在1个RAID组上,假设这个RAID组是4D+1P的RAID5,PrefetchSize被设置为AUTOMATIC,设置DB2_PARALLEL_IO=*:4,DB2显示启用IO并行,并行度为2X4=8,2个RAID组一共8块物理盘可用,P1至P8都能找到自己干活的地方,所以这个不再画图了。如果不设置DB2_PARALLEL_IO,并行度为隐式起用为2,显然在这种情况下,prefetch没有全力以赴去干活,DB2在IO并行上还有可优化的空间。如果随随便便设置了DB2_PARALLEL_IO为*,并行度则为12,这仍然有引起磁盘争用的风险存在。

说了这么多prefetch的事儿,它的工作原理或许会被熟悉操作系统的童鞋看着眼熟,没错,有些操作系统的文件系统也有预取功能,比方说AIX的日志型文件系统Journaled File System。当表空间容器基于这样的文件系统时,操作系统预取动作比数据库还积极,这是不是说明如果用文件类型容器比用device类型容器吞吐量会更大?真实情况并不是这样的,很简单,当数据库发生预取时,如果操作系统已经替它干了,DB2可能将直接坐享其成。

最后要注意一点的是prefetch请求的效率还与页清除程序有关,页清除动作必须足够快,才能保证脏页可以被迅速从缓冲池写出,从而prefetch动作不至于发生降速去等待。有关页清除程序,可以见俺以前写过的一篇《Page的更新过程》。

以上理解,纯粹个人学习后的观点,欢迎交流和板砖招呼!

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

4

添加新评论1 条评论

landcruiser5700landcruiser5700数据库管理员nari
2015-12-04 17:26
正解!!!
Ctrl+Enter 发表

作者其他文章

  • RR隔离级别下的行锁分析
    评论 0 · 赞 2
  • 数据文件误删除的解决办法
    评论 2 · 赞 3
  • 工作负载概念
    评论 6 · 赞 3
  • DB2的SMP和EMP
    评论 2 · 赞 1
  • Page的更新过程
    评论 2 · 赞 1
  • 相关文章

    相关问题

    相关资料

    X社区推广