pgpool-II的性能缺陷(二)

简介:

接上文 pgpool-II的性能缺陷:

前文已经说到,pgpool-II在replication mode状态下,是顺次而非并行执行SQL文给各个DB节点。

从Source的角度,可以看到:

    SimpleQuery → pool_send_and_wait  → send_simplequery_message
复制代码
/*                                    
 * Process Query('Q') message                                    
 * Query messages include an SQL string.                                    
 */                                    
POOL_STATUS SimpleQuery(POOL_CONNECTION *frontend, 
                POOL_CONNECTION_POOL *backend, int len, char *contents){
    ……                                
    /* log query to log file if necessary */                                
    if (pool_config->log_statement){                                
        pool_log("statement: %s", contents);                            
    }else{                                
        pool_debug("statement2: %s", contents);                            
    }                                
    ……                                
    string = query_context->original_query; 
    if (!RAW_MODE){                                
        ……                            
        /*                            
         * Query is not commit/rollback                            
         */                            
        if (!commit){                            
            char *rewrite_query;                        
            ……                        
            /*                        
             * Optimization effort: If there's only one session, we do 
             * not need to wait for the master node's response, and 
             * could execute the query concurrently.                        
             */                        
            if (pool_config->num_init_children == 1){                        
                /* Send query to all DB nodes at once */                    
                status = pool_send_and_wait(query_context, 0, 0); 
                /*                    
                free_parser();                    
                */                    
                return status;                    
            }                     
                                    
            /* Send the query to master node */                        
            if (pool_send_and_wait(query_context, 1, MASTER_NODE_ID) 
!= POOL_CONTINUE) { free_parser(); return POOL_END; } } /* * Send the query to other than master node. */ if (pool_send_and_wait(query_context, -1, MASTER_NODE_ID)
!= POOL_CONTINUE{
free_parser();
return POOL_END; } …… }else{ …… } return POOL_CONTINUE; }

/* 
* Send simple query and wait for response
* send_type:
* -1: do not send this node_id
* 0: send to all nodes
* >0: send to this node_id
*/
POOL_STATUS pool_send_and_wait(POOL_QUERY_CONTEXT *query_context,
int send_type, int node_id)
{
  ……
  /* Send query */
  for (i=0;i<NUM_BACKENDS;i++){
     ……
     per_node_statement_log(backend, i, string);

    if ( send_simplequery_message(CONNECTION(backend, i),

           len, string, MAJOR(backend)) != POOL_CONTINUE) { 

          return POOL_END;
    }
  }

  /* Wait for response */
  for (i=0;i<NUM_BACKENDS;i++){
    ……
    if (wait_for_query_response(frontend, CONNECTION(backend, i),

          MAJOR(backend)) != POOL_CONTINUE){
           /* Cancel current transaction */
           CancelPacket cancel_packet;

          cancel_packet.protoVersion = htonl(PROTO_CANCEL);
          cancel_packet.pid = MASTER_CONNECTION(backend)->pid;
          cancel_packet.key= MASTER_CONNECTION(backend)->key;
          cancel_request(&cancel_packet);

          return POOL_END;
    }
    ……
  }
return POOL_CONTINUE;
}

复制代码

经过对程序的进一步分析和试验,可以得出以下的结论:

在 Master Node 和其他各Node之间,对SQL文的执行是串行的。

在 Master Node以外的其他各Node之间,是并行执行的。其实是 

/* Send query */ 一段,无阻塞方式向各节点发送SQL文。
/* Wait for response */ 一段,虽然也是个循环,但是是串行。
不过好在向各节点发SQL文的时候,几乎是同时地发送命令,
所以 Wait for response 对一个节点检查获得SQL文执行结束消息以后,
几乎同时也会获得下一个节点SQL文执行结束的消息。

综合以上:如果对一个节点单独执行一段批处理耗时1小时,那么在replication mode 多个节点运行条件下,执行时间将变成 2小时。

至于为何 pgpool-II把对 Master Node和 其他Node的执行分开,也许有特殊考虑,也许是为了保证Master Node的正确性。







本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/08/09/2630172.html,如需转载请自行联系原作者

目录
相关文章
|
SQL 存储 算法
TPCC测试究竟意味着什么
最近分布式数据库领域可谓非常之火(也可能是非常之卷),特别的,很多人会关注TPCC的测试结果,也有不少产品会投入很多精力在TPCC的优化上。 我们首先需要搞明白的是,我们从TPCC的测试结果,究竟能得出对这个分布式数据库什么样的评价。
3767 3
|
缓存 监控 NoSQL
Redis性能监测与故障排除:保障稳定性与优化性能
本篇深入探讨了如何监测Redis性能、使用性能分析工具优化性能,以及排除常见故障的方法。我们首先介绍了通过Redis的INFO命令获取服务器状态和性能信息,为实时监测提供了手段。进一步地,我们探讨了使用--latency选项的redis-cli工具来检测Redis命令延迟,帮助用户了解性能瓶颈。
658 0
|
6月前
|
安全 测试技术
负载测试和压力测试的区别
负载测试和压力测试的区别
|
关系型数据库 MySQL 数据库
MySQL高可用与复制:确保稳定性与可靠性
本文深入研究了MySQL数据库中的高可用性与复制策略,通过详细的代码示例,介绍了复制的原理与架构,主从复制与读写分离的应用,以及高可用方案中的主备切换和故障转移。复制技术基于主从架构,使数据在多个数据库之间保持一致,提供了高可用性和数据冗余的保障。通过主从复制,数据库不仅能够实现高可用性,还可以通过读写分离来分担主数据库的负载,提升系统的性能。在高可用方案中,主备切换和故障转移是关键策略,可以在主数据库故障时快速切换到备库,确保系统的连续性。
329 0
|
固态存储 关系型数据库 MySQL
|
SQL 索引
RAC中一次混乱的性能诊断过程4
Segments by Logical Reads Total Logical Reads: 584,021,980 Captured Segments account for 99.
895 0
|
Web App开发 移动开发 缓存
客户端稳定性优化实战,Crash率最高下降40%
大促一直是技术和产品的练兵场,每到大促,各种丰富的富媒体,如直播,视频,3D,游戏互动,AR等竞相上线,在淘宝的大航母战略下,都集中在万千宠爱于一身的淘宝App上,在这样的大促场景下,开始触碰到端侧系统资源上限的天花板。在17年双11大促期间,端侧的内存问题尤为突显,OOM的高居所有问题的榜首。内存问题成为了这几年大促端侧稳定性最大的挑战。
2412 0
客户端稳定性优化实战,Crash率最高下降40%
|
SQL 关系型数据库 开发者