使用DB2 Universal Database V8中的连接集中器来增强性能
2009-12-22 14:58:52 来源:WEB开发网连接池与连接集中器
连接池与代理的分配和解除分配相关联。它决定当连接断开时代理是否与连接保持在一起。
连接集中器与代理的上下文切换相关联。它决定当事务结束时代理将服务于哪个应用程序。
连接池的工作取决于连接和断开连接。连接集中器的工作取决于事务边界(提交和回滚)。
连接池有助于减少创建和终止数据库代理方面的开销。连接集中器有助于减少当连接空闲时每个代理分配的资源。
启用连接集中器必须将连接池打开?
是的,由于连接集中器需要利用连接池的功能,因此启用连接集中器必须将连接池打开。
启用了连接集中器之后,一旦到达事务边界,db2agent 就是自由的,可以服务于其他请求。如果没有入站的请求需要服务,分配器就将决定该代理是否可以保留。这时,连接池就要发挥作用了。
如果连接池是禁用的,那么该代理将被终止,因为当连接池是关闭的时,不可以保留空闲代理。如果连接池是打开的,并且保留该代理不会超出 num_poolagents 限制,那么该代理将会被保留。它将等待服务于下一个请求。如果连接池是打开的,并且保留该代理超出了 num_poolagents 限制,那么该代理将被终止。
禁止连接池而启用连接集中器的潜在问题是,一旦达到事务边界,代理就会终止。当事务结束时,大多数代理将被终止。当事务开始时,总是需要分配新的代理。这样会导致到达事务边界时的代理分配和解除分配这一巨大开销,这会影响连接集中器的功能。
调整代理的参数以适应连接集中器
有关连接集中器的一个常见问题是,“将 max_connections 和 max_coordagents 设为多大才最好?”
答案涉及到数据库管理器配置中代理的调整,正确的方法是进行微调。每个参数的设置依赖于您当前运行的系统。
以下是我的建议:
保持您当前的 maxagents、max_coordagents 和 num_poolagents 设置。设置 max_connections = max_coordagents + 1 而打开连接集中器。
现在连接集中器是打开的,服务器的配置仍然保持不变。所以,资源使用和可以连接到系统的用户数量应该不变,但是使用或产生的 db2agent 进程更少。
截取一个数据库管理器快照:db2 get snapshot for dbm
下面来看快照输出的底部部分:
Agents assigned from pool = 0
Agents created from empty pool = 4
Agents stolen from another application = 0
High water mark for coordinating agents = 1
Max agents overflow = 0
Hash joins after heap threshold exceeded = 0
查找 "high water mark for coordinating agents" 一行。这表示自您的实例以启用连接集中器开始以来的所有时间点上存在的最大代理数。
在连接集中器场景中,只有在事务需要时才产生代理。因此,这个最高数字基本上就是在启用连接集中器时您同时需要的最大代理数。
这个数字每天都会改变。在一个星期内每天都截取该快照,直到相应代理的最高数字趋于稳定。这是您的系统应该具有的最小代理数。您可以参照这个数字相应地设置 max_coordagents。
例如,如果您的初始 max_coordagents 是 2000,并且连接集中器是启用的时最高数字是 500,那么为了安全起见,我可以将 max_coordagents 设置为 800。
然后您可以逐渐增大 max_connections 以允许更多的用户使用该实例。同时,继续截取快照,看随着 max_connections 的增大,最高数字是如何增大的。
最后,您应该看到,对于初始的 max_coordagents 设置,您可以允许更多的用户连接到实例。
如果在启用了连接集中器时参数没有设置正确会怎么样呢?
如果有一个新的入站请求,但是所有的代理都被占用了,意味着它们都正处于还没有提交或回滚的事务当中,那么入站的事务将被挂起。这是因为没有可用的代理可以服务于您的请求,甚至没有一个代理可以用一个错误消息返回您的请求。
当您看到这样的情况时,比如在连接集中器打开后用户请求将被挂起,那么您的 max_coordagents 设置可能不够高。
您可以增大 max_coordagents 设置,或者降低 max_connections 设置。如果不管您的 max_coordagents 设置有多高,问题依然如故,那么应该看一下问题是不是涉及到用户应用程序中缺少提交。当应用程序不经常提交事务时,代理会被一直占用。最终,所有的代理都将被占用,导致出现挂起的情况。为了解决这个问题,惟一的解决方案是让您的应用程序在每个事务完成时进行提交。如果您不能纠正这个问题,那么您的环境就不适合于使用连接集中器。
已知的限制
不能在打开连接集中器的情况下启用联邦参数。如果您想要使用连接集中器,就必须在数据库管理配置中指定 Federated=NO。
DB2 UDB V7 客户机不能利用 DB2 UDB V8 连接集中器的优势,它只对 V8 客户机和本地 V8 服务器连接起作用。
更多精彩
赞助商链接