作者·2010-05-20 10:54
·

分布式管理:存储、I/O 和 DB2,第 2 部分

字数 7317阅读 2679评论 0赞 0
在我的 前一篇专栏文章 中,我介绍了一些基本的存储概念,并指出网络存储供应会对数据库性能产生显著影响。在这一期中,我将介绍如何设置与存储 I/O 相关的一个重要的注册表变量,以及在把 DB2 数据库部署在网络附加存储 (NAS) 或存储区域网络 (SAN) 环境中时如何对表空间属性进行调优,比如区段大小、预抓取大小、开销和传输速率。
来自 IBM Database Magazine 中文版。

在我的前一篇专栏文章中,我介绍了一些基本的存储概念,并指出网络存储供应会对数据库性能产生显著影响。在这一期中,我将介绍如何设置与存储 I/O 相关的一个重要的注册表变量,以及在把 DB2 数据库部署在网络附加存储 (NAS) 或存储区域网络 (SAN) 环境中时如何对表空间属性进行调优,比如区段大小、预抓取大小、开销和传输速率。

表空间性能

如果您已经读过本系列的第 1 部分,就会知道 RAID(redundant array of independent disks)用来把两个或更多磁盘驱动器组合成一个阵列,然后可以把这个阵列作为单一逻辑磁盘驱动器提供给主机。如果数据库包含的表空间的容器驻留在 RAID 设备上(如果数据库部署在 NAS 或 SAN 上,这种情况是很可能出现的),那么 IBM 的 DB2 专家建议您做以下设置:

  • 如果表空间的容器跨多个物理磁盘,那么应该设置 DB2_PARALLEL_IO 注册表变量,为表空间启用并行 I/O。
  • 如果使用分片化,那么每个表空间的区段大小应该等于 RAID 分片大小或其整倍数。(如果使用 RAID 1,那么默认的区段大小对于大多数情况是合适的)。
  • 确保每个表空间的预抓取大小设置为 AUTOMATIC 值,或者设置为等于 RAID 分片大小乘以使用的 RAID 设备数量(或这个乘积的整倍数),同时是表空间区段大小的整倍数。
  • 确保表空间的开销和传输率适合所用的磁盘驱动器类型。

请记住,在 NAS 或 SAN 环境中,IBM 建议使用以下配置之一:

  • 自动调整大小的数据库管理的空间 (DMS) 表空间,使用文件作为存储容器 (FILE)
  • 存储持久数据的自动存储表空间和系统管理的空间 (SMS)
  • 存储临时数据的自动存储表空间

通过在 CREATE TABLESPACE 或 ALTER TABLESPACE SQL 语句中指定 AUTORESIZE ON 选项,为 DMS FILE 和自动存储表空间启用自动大小调整。

在决策支持和数据仓库环境中,常常有很重的报告生成工作负载,可以使用 DMS FILE 表空间存储临时数据。但是,这些临时表空间不应该启用自动大小调整。





回页首


DB2_PARALLEL_IO 变量

可以使用 DB2_PARALLEL_IO 注册表变量,要求 DB2 对只有一个容器的表空间或者容器驻留在多个物理磁盘上的表空间(如果容器驻留在 RAID 5 或 RAID 6 设备上)使用并行 I/O。如果没有设置这个注册表变量,使用的 I/O 并行度级别就等于表空间使用的容器数量。因此,如果一个表空间有三个容器,而且没有设置 DB2_PARALLEL_IO 注册表变量,那么使用的 I/O 并行度级别就是 3。

另一方面,如果给这个注册表变量设置了值,那么使用的 I/O 并行度级别就等于使用的容器数量乘以 DB2_PARALLEL_IO 注册表变量的值 —— 只要表空间的预抓取大小不是 AUTOMATIC。(换句话说,表空间的并行度等于预抓取大小除以表空间的区段大小)。因此,如果为一个表空间设置了 DB2_PARALLEL_IO 注册表变量,这个表空间的预抓取大小为 160 个页面,区段大小为 32 个页面,那么每个预抓取请求将划分为 5 个区段大小的预抓取请求 (160 / 32 = 5)。

DB2_PARALLEL_IO 注册表变量常常设置为星号 (*) 值,这表示数据库中的每个表空间都使用并行 I/O。(星号值意味着使用的每个表空间容器跨六个物理数据磁盘轴)。

但是,在大多数情况下,这个设置并不合适;对于驻留在 RAID 5 6+1 阵列之外的任何设备上的表空间容器,使用这个值会导致 DB2 试图采用的 I/O 并行方式与数据跨磁盘分片的实际方式不匹配,这会损害性能。应该通过执行下面的 db2set 命令设置 DB2_PARALLEL_IO 注册表变量:

db2set DB2_PARALLEL_IO=[TS_ID]:[ DisksPerContainer] ,?

其中:

  • TS_ID 通过数字式表空间 ID 指定一个或多个表空间。(可以使用星号表示所有表空间)。
  • DisksPerContainer 表示分配给指定表空间的每个表空间容器使用的物理数据磁盘数量。

因此,如果要为一个表空间设置 DB2_PARALLEL_IO 注册表变量,它的数字 ID 为 1,它的存储容器驻留在 RAID 5 3+1 阵列上(三个数据磁盘轴),那么应该执行下面的 db2set 命令:

db2set DB2_PARALLEL_IO=1:3

如果数据库中每个表空间的存储容器驻留在 RAID 5 4+1 阵列上(四个数据磁盘轴),那么应该执行下面的 db2set 命令:

db2set DB2_PARALLEL_IO=*:4





回页首


num_ioservers 配置参数

I/O 服务器(也称为预抓取器)代表数据库代理执行预抓取 I/O 和异步 I/O,从而支持备份和其他实用程序。num_ioservers 数据库配置参数指定在任意时间数据库可以使用的 I/O 服务器的最大数量。非预抓取的 I/O 由数据库代理直接发起,因此不受 num_ioservers 数据库配置参数值的限制。

在使用自动存储的数据库中,为了充分利用所有 I/O 设备,应该把这个配置参数设置为 AUTOMATIC。如果不使用自动存储,或者数据库不认识 AUTOMATIC 值(DB2 的早期版本中的情况),那么应该把这个配置参数设置为驻留数据库的物理设备数量加上一或二。与配置的 I/O 服务器不足相比,多配置几个 I/O 服务器但并不使用它们是更好的方式;I/O 服务器的开销并不大。





回页首


表空间区段大小

数据按 4K、8K、16K 或 32K 的块传输,这种数据块称为页面。当一个表空间跨多个容器时,数据按页面组(称为区段)以循环方式写到每个容器。因此,如果使用多个容器,表空间的区段大小实际上就是它的分片大小。

表空间的区段大小是在创建表空间时定义的,要想修改它,就必须删除并重新创建表空间。因此,一定要在填充数据之前为表空间选择适当的区段大小。

合适的区段大小是多少?理想情况下,指定的区段大小应该足以包含一个完整的 RAID 分片,这样当预抓取器执行大块读时,每个 LUN 中的每个物理磁盘轴将一起旋转。因此,需要按以下公式计算合适的区段大小:

区段大小 = (RAID 分片大小 * 数据磁盘数量) / 表空间页面大小

假设一个表空间跨三个容器,每个容器驻留在一个 RAID 5 4+1 阵列上。如果 RAID 分片大小是 8K,表空间页面大小是 8K,那么合适的区段大小是 4 个页面(8K * 4 = 32K;32K / 8K = 4 个页面)。





回页首


表空间预抓取大小

在只从 DB2 数据库获取一个页面或很少几个连续页面时,每次从存储向内存传输一个页面的数据。但是,当需要大量数据时,DB2 会预测不久后将需要的数据并从磁盘获取这些额外的页面。这种做法称为预抓取;把索引和数据页面预抓取到内存中有助于减少 I/O 等待时间,从而提高性能。

与区段大小一样,表空间的预抓取大小也是在创建表空间时定义的。但是,与区段大小不同,可以修改表空间的预抓取大小,而不需要删除并重新创建表空间。

在决定最佳预抓取大小方面,IBM 建议您让 DB2 自己做出选择。为此,在创建新的表空间时应该使用默认值,从而把表空间的预抓取大小设置为 AUTOMATIC,或者把 AUTOMATIC 值赋值给 dft_prefetch_sz 数据库配置参数。

对于以这种方式创建的表空间,DB2 自己决定最佳的预抓取大小(并定期更新这个值),采用的公式如下:

预抓取大小 = 表空间容器的数量 * 每个容器的数据磁盘数量 * 区段大小

每个容器的物理磁盘数量默认为 1,除非通过 DB2_PARALLEL_IO 注册表变量指定了另一个值(所以 DB2_PARALLEL_IO 注册表变量一定要设置为正确的值)。





回页首


开销

“开销” 这个词是指 I/O 控制器开销和磁盘延迟时间(包括磁盘寻道时间),以毫秒 (ms) 为单位。在查询优化期间,DB2 优化器使用开销判断 I/O 的成本。可以在创建表空间时定义表空间的开销,还可以在创建表空间之后修改它。

对于使用 DB2 9 或更高版本创建的数据库,使用的默认开销值是 7.5 ms。但是,默认值对于您的存储平台可能并不合适。按以下公式估算实际的开销:

开销 = 使用的磁盘的平均寻道时间 + (0.5 * 旋转延迟)

其中的 0.5 代表旋转半圈的平均开销,旋转延迟是旋转一整圈的毫秒数,计算公式如下:

(1 / 磁盘转速 rpm) * 60 * 1000

计算每分钟圈数的倒数,得出旋转一圈的分钟数,再乘以每分钟 60 秒,最后乘以每秒 1000 毫秒。

例如,如果磁盘驱动器的转速是 7,200 RPM,那么它的旋转延迟是:

(1 / 7200) * 60 * 1000 = 8.328 ms

如果磁盘的平均寻道时间为 11 ms,那么开销为:

开销 = 11 + (0.5 * 8.328) = 15.164 ms





回页首


传输速率

传输速率是把一个页面读取到内存中花费的时间(毫秒数)。在查询优化期间,DB2 优化器使用这个值判断 I/O 的成本。与开销一样,可以在创建表空间时定义表空间的传输速率,还可以在创建表空间之后修改它。

对于使用 DB2 9 或更高版本创建的数据库,把一个 4K 页面读取到内存中花费的默认时间是 0.06 ms。同样,默认值对于您的存储平台可能并不合适。如果每个表空间容器驻留在单一物理磁盘上,可以使用以下公式估算每个页面的实际传输速率(毫秒数):

传输速率 = (1 / specification_rate) * 1000 / 1024000 * 页面大小

其中的 specification_rate 代表磁盘规格传输速率(每秒 MB 数)。

在这个公式中,计算磁盘规格传输速率的倒数,得出每 MB 的秒数,再乘以每秒 1000 毫秒,再除以每 MB 1,024,000 字节,最后乘以页面大小(字节数)。

例如,如果磁盘驱动器的规格传输速率是每秒 3MB,页面大小为 4K,那么传输速率是:

传输速率 = (1 / 3) * 1000 / 1024000 * 4096 = 每页面 1.333248 ms

但是,如果表空间的容器不是单一物理磁盘,而是磁盘阵列(换句话说,是 RAID 阵列),那么在决定适当的传输速率时就需要考虑其他因素。如果阵列相当小,那么可以假设瓶颈出现在磁盘级上,可以用磁盘规格传输速率 (specification_rate) 乘以使用的磁盘数量。

但是,如果阵列中的磁盘数量很大,瓶颈可能不在磁盘级上,而是出现在其他 I/O 子系统组件上(比如磁盘控制器、I/O 总线或系统总线)。在这种情况下,不能假设 I/O 吞吐能力是磁盘规格传输速率与磁盘数量的乘积。相反,必须在连续扫描期间度量实际的 I/O 速率(每秒 MB 数),然后把结果除以组成表空间的容器数量。

例如,假设度量出的一个表的连续 I/O 速率为每秒 100MB,这个表所在的表空间有四个容器,那么每个容器的速率为 25MB,每个页面的传输速率为 (1/25) * 1000 / 1024000 * 4096 = 0.16 ms。





回页首


文件系统缓存

在大多数文件系统上,典型的读操作会把数据从存储转移到文件系统缓存中,然后把数据从缓存复制到应用程序缓冲区。同样,写操作要把数据从应用程序缓冲区复制到文件系统缓存,然后把数据从缓存复制到存储。

DB2 通过缓冲区池管理自己的数据缓存,如果缓冲区池的大小合适,就不需要文件系统级缓存。而且在某些情况下,同时在文件系统级和 DB2 缓冲区池中进行缓存会降低性能,因为双重缓存需要额外的 CPU 周期。(对于 I/O 密集型的数据库工作负载,原始 I/O 是首选选择,其原因之一是它的性能非常好,性能出色的部分原因是它回避了文件系统使用的缓存和锁机制)。

为了解决这个问题,文件系统厂商开发了另一种称为 Direct I/O (DIO) 的 I/O 机制,它试图通过回避文件系统级缓存来消除性能瓶颈。IBM 在 AIX 5L version 5.2.10 中引入了自己的文件系统特性 Concurrent I/O (CIO),它适用于 Enhanced Journaling File System (JFS2)。(在 Windows 上,在指定 FILE_FLAG_NO_BUFFERING 标志的情况下打开文件,即可提供这种功能)。DIO 和 CIO 通常是在系统级通过挂装点选项实现的。

从 8.2 版开始,DB2 在 AIX 上支持 DIO/CIO,在 HP、Solaris、Linux 和 Windows 上支持 DIO。DB2 还支持在表空间级(而不是文件系统级)回避文件系统缓存,这需要在 CREATE TABLESPACE 语句或 ALTER TABLESPACE 语句中指定 NO FILE SYSTEM CACHING 子句。在 9.5 版之前,在默认情况下启用文件系统缓存,可以使用这个子句禁用它;从 DB2 9.5 开始,当在 AIX JFS2 文件系统、Linux(Linux for System z 除外)、Solaris 和 Windows 上创建 DMS 表空间时,默认禁用文件系统缓存。

IBM 建议避免使用挂装点选项实现 DIO 或 CIO,而是应该使用 NO FILE SYSTEM CACHING 子句在表空间级禁用文件系统缓存。当对表空间应用 NO FILE SYSTEM CACHING 子句时,DB2 会自动地对文件系统使用 DIO 或 CIO。





回页首


供应控制

随着存储信息的需求不断增长,把 DB2 数据库部署在网络存储上的需求也在增长。如何供应网络存储会对数据库性能产生显著影响,所以在请求存储空间时一定要向存储管理员寻求建议。

一定要记住,当在 NAS 或 SAN 环境中部署 DB2 数据库时,应该根据使用的存储硬件和配置设置 DB2_PARALLEL_IO 注册表变量和表空间属性。通过配置 DB2 和存储子系统,可以缓解或消除与 I/O 相关的性能问题。





回页首


鸣谢

特别感谢 IBM Toronto Lab 的资深技术专家 Aamer Sachedina 提供他的演讲稿 “Everything You Ever Wanted to Know about Storage, I/O and DB2 But Were Afraid to Ask” 并审阅了本文的内容。



参考资料

学习
  • 通过访问 developerWorks 中国 Information Management 专区的 DB2 9 技术资源中心,获得更多的文章、教程和多媒体课件等学习资源。

  • 通过访问 developerWorks 中国 Information Management 专区的 DB2 for z/OS 产品专题,获得更多有关 DB2 for z/OS 的文章、教程和多媒体课件等学习资源。


获得产品和技术

讨论
  • 通过访问 alphaWorks获得更多 IBM 的前瞻性技术和资源。

  • 通过访问 IBM Database Magazine 站点 community 专题,获得更多用户体验和交流信息。


关于作者

 

Roger E. Sanders 是 EMC Corp. 的咨询系统工程师,他撰写了 17 本关于 DB2 for Linux, Unix, and Windows 的书,还在许多 DB2 研讨会上讲课。他最近的书是 《DB2 9 for Linux, UNIX, and Windows Advanced Database Administration Certification Study Guide》(MC Press,2008 年)。

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

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广