分区数据库环境下 DB2 LOAD 性能调优
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分区数据库环境下 DB2 LOAD 性能调优
吴磊, 软件工程师, IBM
简介:本文详细阐述了分区数据库环境下 DB2 LOAD 的线程模型,并以 LOAD 线程模型为纲,详细分析每个线程的作用和特点,多方面、多角度地剖析影响其性能的因素,同时对性能的改进提供了参考建议。最后,以实例演示展示了性能调优的效果。DB2 LOAD 实用程序广泛应用于各行业、各领域的数据移动场景中,通过本文,相关读者可以充分理解 DB2 LOAD 的线程模型,影响各相关线程性能的关键参数,文中给出的参考建议与实例场景对读者有借鉴意义。
本文的标签:dpf, 关于产品, 性能, 管理
发布日期:2011 年 12 月 12 日 级别:中级访问情况 :806 次浏览
DB2 LOAD 线程模型
在本文中,除非特别声明,对于 DB2 LOAD 的讨论都是在分区数据库环境下。同时本文专注于讨论分区数据库环境下 DB2 LOAD 的性能调优,不再对分区数据库中的基本概念进行赘述,阅读本文的读者需要对分区数据库概念有基本的了解。LOAD 作为DB2 的实用程序,广泛地应用于各种数据移动场景中,尤其是在数据仓库的 ETL 过程中,LOAD 更是占据了主导地位。因此如何有效地提升 LOAD 性能,在数据移动场景中满足客户的需求和期望,是至关重要的。在对LOAD 性能进行调优之前,首先需要理解 LOAD 中各相关线程的作用和特点,从而有针对性地进行调整、优化。LOAD 线程模型如图 1 所示。
图1. LOAD 线程模型
在 DB2 中,LOAD 操作请求由代理线程 db2agent 受理,该线程负责派生、协调、监视相关LOAD 线程。LOAD 内部
相关线程的处理流程,从预分区代理线程(db2lpprt)开始。预分区代理只存在于 Coordinator 分区节点,读入输入数据源,通过TCP/IP 网络将数据记录分发至各数据库分区的分区代理线程(db2lpart)。分区代理存在于各数据库分区,对数据记录的分区键进行计算从而决定该条记录应去往哪个数据库分区。当分区代理决定了数据记录的去向,即通过TCP/IP 网络将数据记录发送至各对应分区的媒体录入线程(db2lmr)。媒体录入线程对数据记录进行初步处理,通过共享内存将数据记录发送给格式化线程(db2lfrm),该线程对所有数据记录进行格式化,并将格式化后的数据记录发送给Ridder 线程(db2lrid),Ridder 线程为每条记录分配 RID,并创建表空间扩展数据块(EXTENT),随后将扩展数据块发送给缓存处理线程(db2lbm),由该线程将数据最终写入到磁盘上。
在接下来的章节,我们会详细地分析 LOAD 各相关线程的作用,以及可能对其性能造成影响的各方面因素。这些因素包括,系统级参数、网络参数、实例级参数、数据库级参数,LOAD 参数等。造成 LOAD 性能瓶颈的可能原因有很多,如 CPU 受限、内存瓶颈、网络受限、I/O 瓶颈等等。通过以 DB2 LOAD 线程模型为纲,对LOAD 性能调优进行细化,目的是做到有的放矢,让调优更有针对性。
LOAD 线程解析与参数调优
在本章节中,我们将以 LOAD 内部处理流程的顺序逐一解析相关线程的作用,以及影响其性能的因素,并对相关关键参数的设置给出了参考建议。
预分区代理线程 (db2lpprt)
预分区代理只存在于 Coordinator 分区节点中,该线程的数量会因参数设置不同而有所变化。该线程的主要作用是读取输入数据源,并通过TCP/IP 网络以 Round-robin 的方式将数据记录平均分发到各数据库分区的分区代理线程(db2lpart)。
可能对该线程的处理性能造成影响的因素包括网络和 I/O。预分区代理从磁盘读取输入数据源,除存储设计本身的因素外,I/O 相关的参数设置不当,有可能造成 I/O 瓶颈;读取的数据记录需要通过TCP/IP 网络发送至各数据库分区,除了网络本身带宽因素外,网络相关参数设置不当,也会对LOAD 整体性能造成影响。
系统级参数:
l queue_depth 该参数指定磁盘I/O 请求队列的长度,会影响磁盘I/O 性能,尤其是在数据库等 I/O 密集型应用中。将该参数的值设置较大有利于获得更好的性能。
l maxpgahead 该参数指定顺序预读取的最大数据页数,默认值为8,但通常增加该值能够获得更好的顺序读取性能。
网络参数:
l tcp_nodelayack 该参数决定 TCP 接收方是否立即将确认包(ACK)返回给发送方,当开启该参数时(tcp_nodelayack = 1),TCP 接收方立即返回 ACK 包,不产生延迟;当关闭该参数时(tcp_nodelayack = 0)TCP 接收方会最多延迟200ms 才将ACK 包返回给发送方。
l tcp_recvspace 该参数指定 TCP/IP socket 默认数据接收缓存大小。
l tcp_sendspace 该参数指定 TCP/IP socket 默认数据发送缓存大小。
分区数据库环境下,LOAD 的数据流向是单向的,数据接收方不会将接收到的数据发送回发送方,即分区代理线程不会将接收到的数据记录再发送给预分区代理线程。因此,可以通过开启参数tcp_nodelayack(tcp_nodelayack = 1)来消除网络延迟,提升网络性能。对于参数tcp_recvspace 和 tcp_sendspace,通常建议将该值设置较大,以提升网络性能。
LOAD 参数:
l ANYORDER 如果指定该文件类型修饰符,则DB2 会为每一个输入数据源分配一个预分区代理线程,且 LOAD 在向表空间容器中写入格式化的数据记录时,不会维持输入数据源中数据记录的原始顺序;若未指定该参数,则只
分配一个预分区代理来顺序处理各输入数据源。在 I/O 资源没有被充分利用的情况下,建议指定该参数在数据读取阶段提升 I/O 性能。
分区代理线程 (db2lpart)
分区代理线程的数量和所在数据库分区,都可以通过参数来指定,每一个数据库分区并不要求一定要有分区代理线程存在。分区代理通过Round-robin 的方式从预分区代理接收数据记录,对每一条数据记录的分区键(Distribution Key)进行计算,并创建 Distribution Map 项,从而决定该条记录应该去往哪个数据库分区。
分区阶段的 CPU 开销比加载阶段的 CPU 开销要小得多,很难用足所有的 CPU 资源,因而 CPU 基本上不会成为性能瓶颈。这一阶段的性能瓶颈更可能来自网络的限制,因为分区代理需要将分布好的数据记录通过TCP/IP 网络发送到对应的数据库分区上。因此在分区阶段,也需要考虑上述网络参数的设置。
LOAD 参数:
l PARTITIONING_DBPARTNUMS 该选项指定分区代理线程的数量和所在数据库分区,这些因素都会对LOAD 的性能产生影响。通常,在预分区代理未遭遇 CPU 瓶颈、I/O 瓶颈的情况下,适当增加分区代理的数量可以改善 LOAD 整体性能。
媒体录入线程 (db2lmr)
媒体录入线程通过TCP/IP socket 获取分布到本数据库分区上的数据记录,该线程获得缓存空间,存储并解析输入数据。在 LOAD 线程模型中,每个数据库分区只有一个媒体录入线程。该线程的主要作用是对数据记录进行语法解析与检查,如果发现不符合目标表定义的数据列,则将该条数据记录转储到 DUMP 文件中。可以通过指定文件类型修饰符来避免语法检查。
LOAD 参数:
l FASTPARSE 该文件类型修饰符指定媒体录入线程无需对输入数据记录进行语法解析和检查,进而提升 LOAD 性能。当输入数据源本身比较健壮,不存在语法错误时,推荐使用该文件类型修饰符。启用该参数,LOAD 性能可获得一定程度的提升。
格式化线程 (db2lfrm)
格式化线程获取缓存空间,接收来自媒体录入线程解析后的数据记录,将数据记录中的各种数据类型格式化为二进制数据,并创建记录列表,最后将记录列表发送至 Ridder 线程(db2lrid)。该线程的数量可通过参数来设置,通常格式化过程是 LOAD 加载阶段中最消耗 CPU 资源的一项工作,因此合理的配置 CPU 资源至关重要。
LOAD 参数:
l CPU_PARALLELISM 该参数设置 LOAD 格式化线程的数量,默认值为每一个数据库分区中可用 CPU 数量(注意,不是物理机器中可用 CPU 数量),通常默认值已经是最优设置,无需手动更改该参数。需要注意的是,当分配给LOAD 实用程序的内存资源(DATA BUFFER)不能满足请求的 EDU(db2lfrm)数量时,LOAD 内部会降低 CPU 并行度。
l DATA BUFFER 该参数指定 LOAD 用于内部处理的内存容量,默认值为数据库实用程序堆(UTIL_HEAP_SZ)可用值的四分之一。但是该默认值通常情况下过低,不能满足 LOAD 对内存的需求,应手动更改将其设置为更高。该参数对LOAD 性能的影响非常重要,较小的内存空间可能导致 CPU 并行度的下降。
l NOROWWARNINGS 在加载过程中,LOAD 会为每一条被拒绝、未格式化的数据行记录消息,消息文件的写入会对LOAD 性能产生较大影响,有时甚至占据大部分 LOAD 处理时间。如果更加注重 LOAD 性能,而不关心数据行被拒绝的原因,可以启用该文件类型修饰符来避免向消息文件中写入记录级别的警告信息,从而提升 LOAD 性能。
Ridder 线程 (db2lrid)