zoukankan      html  css  js  c++  java
  • pgpoolII的性能缺陷

    pgpool-II在运行在 replication mode的时候,性能低下。

    经过分析,发现无解:这是由pgpool-II的执行方式决定的。
    pgpool-II 刚开始运行的时候,就会开很多子进程,缺省值128。
    但是,每当客户端来一个请求,就会有一个子进程全权负责,别的子进程不插手。

    而在replication mode,该子进程需要和多个DB节点打交道:
    比如把客户端的SQL文,发送给每一个DB节点。
    在给各个节点发送SQL文的时候,如果想要效率高,要么开子进程或线程来并行。要么采用某种非阻塞方式向各个节点发请求。

    然而,pgpool-II的开发者,采用了效率最为低下的做法:顺次执行。就是说对第一个DB节点发SQL文,待第一个DB节点运行此SQL文结束,再向第二个DB节点发SQL文。

    此种做法,如果运行在业务不繁忙的系统里尚可,在繁忙的系统里,那就是致命的缺陷。

    验证如下:先在各个DB节点,作如下的函数:

    CREATE FUNCTION loopforid()
    RETURNS INTEGER LANGUAGE plpgsql AS $$
      DECLARE
         ret INTEGER;
      BEGIN
         PERFORM pg_sleep(30);
         ret:=100;
         
         RETURN ret;
      END; $$;

    然后,在pgpool-II中执行类似:update a8 set id=(select loopforid() ) where id=10; 的操作。

    再来看pgpool-II的log,可以看到:

    在DB1 节点执行完毕后,又过了大约30秒,才开始在DB2节点执行。所以说,它是串行的。

    因此,当后台DB节点增加的时候,通过pgpool-II的replication mode来运行的程序,其insert/update/delete性能将随着节点数目的增加而成比例下降。

  • 相关阅读:
    RabbitMQ
    RabbitMQ
    RabbitMQ
    RabbitMQ
    RabbitMQ
    RabbitMQ
    RabbitMQ
    .net 5.0
    redis
    分布式同步服务中间件
  • 原文地址:https://www.cnblogs.com/gaojian/p/2627868.html
Copyright © 2011-2022 走看看