DB2 9.5 中多线程架构的工作原理
来源:互联网 发布:淘宝上下架查询小助手 编辑:程序博客网 时间:2024/06/04 18:25
DB2® 9.5 for Linux®, UNIX®, and Windows®(代号为 “Viper 2”)中引入了新的多线程功能。了解当您需要经常性地监视进程或线程、需要理解数据库正在使用多少内存,或者当您需要简化备份、恢复和前滚等任务关键型工作时,DB2 9.5 中的新功能如何提供帮助。您将了解到这些新特性如何影响配置参数,并学习 DB2 9.5 中的新技术。
简介
为了理解 DB2 9.5 中新的多线程功能,本文首先讨论 DB2 进程模型。整个 DB2 进程模型是由 Base System Utilities(BSUs)控制的。BSU 为实例和数据库分配内存,拦截和处理信号,并处理发送到 DB2 的异常。图 1显示了用于 Linux 和 UNIX 平台的旧的 DB2 进程模型。
图 1. Linux 和 UNIX 上旧的 DB2 进程模型
图 2 显示了 Linux 和 UNIX 上新的进程模型。
图 2. Linux 和 UNIX 上新的 DB2 进程模型
数据库服务器、客户机与应用程序之间的通信由一个框架来处理。这种框架正是所有 DB2 服务器都使用的进程模型。它确保内部使用的数据库文件不会干扰用户或数据库应用程序。
引擎分派单元(engine dispatchable units,EDU)负责执行各种任务,例如处理数据库应用程序请求、读取数据库日志文件以及将日志记录从日志缓冲区刷新到磁盘上的日志文件。通常,DB2 服务器将每个任务作为一个单独的 EDU 进行处理。在 DB2 9.5 之前,大多数这样的 EDU 在 UNIX 和 Linux 环境中是进程,而在 Windows 环境中是线程。而在 9.5 中,DB2 的进程模型得到统一,现在 EDU 在 Linux、 UNIX 和 Windows 环境中都是线程。
下面是这种新的内存模型的一些优点:
这种新的内存模型更加简单,而且更易于配置。请参阅 DB2 Information Center 中的以下内容:
配置内存和内存堆
内存配置简化
这种模型可以节省资源:
使用的系统文件描述符明显减少。进程与线程之间最明显的区别就是,一个进程的所有线程都共享相同的内存空间和系统定义的设施。这些设施包括打开文件句柄(文件描述符)、共享内存、进程同步原语和当前目录。一个进程中的所有线程可以共享相同的文件描述符。这里不需要让每个代理维护它自己的文件描述符表。
性能得到提高:
操作系统通常可以在相同进程中的不同线程之间更快速地切换(上下文切换),而不是在不同进程之间切换。这种切换不需要切换地址空间。由于全局内存是共享的,几乎不必分配新的内存,因此创建一个线程比创建一个进程更简单、更快捷。就处理器周期和使用的内存而言,创建进程的代价较高。
有更高的自动化程度和动态的可配置参数,因此 DBA 更轻松。
本文的 进程模型配置简化 小节中将对此加以阐述。
现在,进程模型在所有三个平台上是一样的:Linux、UNIX 和 Windows。
用 db2pd 监视线程,并用 ps 输出与之映射
在 DB2 9.5 之前,在 UNIX 和 Linux 环境中,通过 ps 系统命令或 db2_local_ps 命令,可以列出所有活动的 DB2 EDU。然而,在 DB2 9.5 中,这些命令不再列出 db2sysc 进程中的任何 EDU 线程。因此,当 DB2 用户和 DBA 使用一个 OS 命令查看系统上正在运行的进程时,一个变化是,他们只能看到一个进程,而不是多个进程。从 DBA 的角度来看,这正是您期望的管理方面的变化。
$ ps -fu db2ins10 UID PID PPID C STIME TTY TIME CMDdb2ins10 1237176 2109662 0 Feb 28 - 0:12 db2acd 0db2ins10 1921136 2109662 0 Feb 28 - 0:14 db2sysc 0db2ins10 2101494 1941686 0 14:22:34 pts/1 0:00 -kshdb2ins10 2420958 2101494 0 15:25:33 pts/1 0:00 ps -fu db2ins10
在 AIX 上:
查看 db2sysc 进程(PID = 1921136)中的所有线程:
清单 1. 在 AIX 系统上查看 db2sysc 进程的所有线程
$ ps -mo THREAD -p 1921136 USER PID PPID TID ST CP PRI SC WCHAN F TT BND COMMANDdb2ins10 1921136 2109662 - A 0 60 26 * 40401 - - db2sysc 0 - - - 1273899 S 0 60 1 f1000100403674b0 410400 - - - - - - 1327331 Z 0 60 1 - c00001 - - - - - - 1392805 Z 0 60 1 - c00001 - - - - - - 1601705 Z 0 60 1 - c00001 - - - - - - 1814627 Z 0 60 1 - c00001 - - - - - - 1851457 S 0 60 1 f1000004f010de00 410400 - - - - - - 1961987 Z 0 60 1 - c00001 - - - - - - 1974311 Z 0 60 1 - c00001 - - - - - - 2023571 S 0 60 1 f100010041b401b0 410400 - - - - - - 2068591 Z 0 60 1 - c00001 - - - - - - 2179161 Z 0 60 1 - c00001 - - - - - - 2187515 Z 0 60 1 - c00001 - - - - - - 2216003 S 0 60 1 - 400400 - - - - - - 2412647 Z 0 60 1 - c00001 - - - - - - 2551911 Z 0 60 1 - c00001 - - - - - - 2592969 Z 0 60 1 - c00001 - - - - - - 2621455 S 0 60 1 f1000100407f7e30 410400 - - - - - - 2658531 S 0 60 1 - 418400 - - - - - - 3031171 Z 0 60 1 - c00001 - - - - - - 3457047 Z 0 60 1 - c00001 - - - - - - 3899477 Z 0 60 1 - c00001 - - - - - - 4157609 Z 0 60 1 - c00001 - - - - - - 4390991 S 0 60 1 - 400400 - - - - - - 4636819 Z 0 60 1 - c00001 - - - - - - 5628153 S 0 60 1 - 400400 - - - - - - 6783009 Z 0 60 1 - c00001 - - -
在 Linux 上:
查看 db2sysc 进程(PID = 1921136)的所有线程: ps -lLfp 1921136
DBA 现在变得更轻松了。db2pd 也得到增强,可以列出进程和线程。现在可以使用 db2pd 命令和 -edu 选项列出所有活动的 EDU 线程。该命令在 UNIX、Linux 和 Windows 系统上都可以使用。
清单 2. 在 Linux 系统上查看 db2sysc 进程的所有线程
$ db2pd -eduDatabase Partition 0 -- Active -- Up 1 days 01:05:54List of all EDUs for database partition 0db2sysc PID: 1921136db2wdog PID: 2109662db2acd PID: 1237176EDU ID TID Kernel TID EDU Name USR SYS===================================================================================1801 1801 2216003 db2agent (idle) 0 0.706935 1.0717371543 1543 5628153 db2resync 0 0.002641 0.0042711286 1286 1851457 db2ipccm 0 0.082388 0.0440371029 1029 2023571 db2licc 0 0.000211 0.001055772 772 4390991 db2thcln 0 0.000244 0.000105515 515 2621455 db2aiothr 0 2.740874 6.2875622 2 1273899 db2alarm 0 0.274076 0.408226258 258 2658531 db2sysc 0 2.085981 1.379128
DB2 使用多少内存?
下面是查看内存使用情况的一些方法:
db2pd -dbptnmem
使用 db2 get 按样获得应用程序快照
select * from table(admin_get_dbp_mem_usage())
db2mtrk -a 和 db2mtrk -p
注意以下信息:
db2pd 显示共享内存分级结构的准确表示
db2pd 仍不能报告私有内存的分配情况
db2mtrk 可以报告私有内存的分配情况,但在其他方面比较弱
私有内存的使用情况不再那么值得关心
db2pd -dbpntmem 高级报告可能已经足够
使用 db2pd
清单 3. db2pd 示例
$ db2pd -dbptnmemDatabase Partition 0 -- Active -- Up 1 days 01:11:27Database Partition Memory Controller StatisticsController Automatic: YMemory Limit: 13994636 KBCurrent usage: 76608 KBHWM usage: 332736 KBCached memory: 16064 KBIndividual Memory Consumers:Name Mem Used(KB) HWM Used(KB) Cached(KB)========================================================DBMS-db2ins10 46784 46784 10048FMP_RESOURCES 22528 22528 0PRIVATE 7296 7296 6016
字段信息:
如果 INSTANCE_MEMORY 配置参数被设为 AUTOMATIC,则 Controller Automatic 被设为 Y。这意味着数据库管理器自动确定内存使用的上限。
Memory Limit 是 DB2 服务器可使用内存的上限。它是 INSTANCE_MEMORY 配置参数的值。
Current usage 是服务器当前使用的内存量。
HWM usage 是当 db2start 命令在运行时,自数据库分区激活以来的最高水位标记(high water mark,HWM)或峰值内存使用量。
Cached memory 是当前使用量(current usage)当中目前没有被使用,而是由于性能原因缓存起来用于将来的内存请求的内存。
Individual Memory Consumers 部分:
列出了 DB2 服务器中所有注册的内存 “消耗者”,以及它们消耗的总内存量。
Name:内存 “消耗者” 的一个简洁、易于辨别的名称。例如:
对于用于数据库 <dbname> 的应用程序内存,名称为:APPL-<dbname>
对于全局数据库管理器内存需求,名称为:DBMS-xxx
对于与 db2fmps 通信所需的内存,名称为 FMP_RESOURCES
对于各种私有内存需求,名称为 PRIVATE
对于 Fast Communication Manager 资源,名称为 FCM_RESOURCES
对于用于与本地应用程序通信的内存段,名称为:LCL-<pid>
对于用于数据库 <dbname> 的数据库内存,名称为 DB-<dbname>
Mem Used(KB):当前有多少内存被分配给某个消耗者。
HWM Used(KB):该消耗者曾使用的内存的高水位标记或峰值。
Cached(KB):在 Mem Used(KB)当中,当前没有使用,而是备用于将来内存分配的内存量。
使用 db2 get 快照
清单 4. db2 get 快照示例
$ db2 get snapshot for applications on sampleMemory usage for application: Memory Pool Type = Application Heap Current size (bytes) = 65536 High water mark (bytes) = 65536 Configured size (bytes) = 1048576Agent process/thread ID = 6463 Agent Lock timeout (seconds) = -1 Memory usage for agent: Memory Pool Type = Other Memory Current size (bytes) = 196608 High water mark (bytes) = 196608 Configured size (bytes) = 16710107136
使用 SQL
清单 5. 使用 SQL 示例
$ db2 "select * from table(admin_get_dbp_mem_usage())"DBPARTITIONNUM MAX_PARTITION_MEM CURRENT_PARTITION_MEM PEAK_PARTITION_MEM-------------- -------------------- --------------------- -------------------- 0 14330507264 340590592 340852736 1 record(s) selected.
使用 db2mtrk
清单 6. db2mtrk -a 示例
$ db2mtrk -aTracking Memory on: 2008/02/29 at 15:51:00Application Memory for database: SAMPLE appshrh 128.0K Memory for application 546 apph other 64.0K 192.0K Memory for application 545 apph other 64.0K 192.0K Memory for application 544 apph other 64.0K 320.0K Memory for application 543 apph other 64.0K 576.0K Memory for application 547 apph other 64.0K 192.0K
清单 7. db2mtrk -p 示例
$ db2mtrk -pTracking Memory on: 2008/02/29 at 15:51:37Memory for agent 6463 other 192.0KMemory for agent 6206 other 192.0KMemory for agent 5949 other 320.0KMemory for agent 2094 other 576.0KMemory for agent 6720 other 192.0K
注意:默认情况下,INSTANCE_MEMORY 被设为 AUTOMATIC,这意味着实例被允许使用 RAM 的一个最大百分值(对于较小的系统,范围是 75%,对于较大的系统,范围是 95%)。这包括一个单独的实例的所有本地分区。
db2 get dbm cfg show detail|grep INSTANCE_MEMORYSize of instance shared memory(4KB)(INSTANCE_MEMORY)=AUTOMATIC(3498659)AUTOMATIC(3498659)
不能永久地为不同的数据库分区设置不同的 INSTANCE_MEMORY 值。对于一个 DB2 Express 许可,INSTANCE_MEMORY 的上限被进一步限制为至多 4GB 内存(1,048,576 * 4KB 页)。DB2 Workgroup 许可被限制为至多 16GB 内存(4,194,304 * 4KB 页)。如果尝试将 INSTANCE_MEMORY 配置参数更新为大于这些限制的值,那么会遭到失败,并收到 SQL5130N 返回码,指定该许可允许的限制范围。其他许可类型没有附加的限制。不能将 INSTANCE_MEMORY 设为大于 RAM。
解决 DPF 备份和恢复问题
每个分区获得一个不同的时间戳
在之前的 DB2 版本上:
$ db2_all " db2 backup db test"Backup successful. The timestamp for this backup image is : 20080304124529eva88: db2 backup db test completed okBackup successful. The timestamp for this backup image is : 20080304124544eva88: db2 backup db test completed okBackup successful. The timestamp for this backup image is : 20080304124554eva88: db2 backup db test completed ok
然而,在 DB2 9.5 中,BACKUP 命令得到增强,现在可以接收一组数据库分区,并提供一个单独的系统视图。
$ db2 backup db test on all dbpartitionnumsPart Result---- -------------------------------0000 DB20000I The BACKUP DATABASE command completed successfully.0010 DB20000I The BACKUP DATABASE command completed successfully.Backup successful. The timestamp for this backup image is : 20080304135942
如何确定前滚期间需要什么日志文件?
http://tech.ddvip.com/program/
- DB2 9.5 中多线程架构的工作原理
- DB2 9.5 中多线程架构的工作原理
- DB2 9.5 中多线程架构的工作原理及线程监控
- 多线程中join工作原理
- 关于多线程的工作原理
- 计算机工作原理-CPU的内部架构和工作原理
- 计算机工作原理-CPU的内部架构和工作原理
- iptables的工作原理和基础架构
- PhoneGap的工作原理及架构基础
- BlazeDS的架构和工作原理简介
- CPU的内部架构和工作原理
- CPU的内部架构和工作原理
- CPU的内部架构和工作原理
- CPU的内部架构和工作原理
- CPU的内部架构和工作原理
- CPU的内部架构和工作原理
- CPU的内部架构和工作原理
- CPU的内部架构和工作原理
- 内存不足,程序无法分配必须的内存,RPC服务器不可用
- 某公司面试概率题值排列组合基础回忆
- ORACLE数据库查看执行计划的方法
- 利用convertView优化ListView性能
- 基于OpenGL的VS2010开发
- DB2 9.5 中多线程架构的工作原理
- Tab效果之Tabhost
- Oracle学习(五):多表查询
- 大一软件专业实训报告
- 为Linux内核打ARM补丁
- 重建二叉树
- 关于unishare。按钮设置
- 发的回复的好的方法和
- 远程管理 Remote Management