pgpool II的效能缺陷 二

2021-09-22 09:41:39 字數 2157 閱讀 8932

接上文 pgpool-ii的效能缺陷:

前文已經說到,pgpool-ii在replication mode狀態下,是順次而非並行執行sql文給各個db節點。

從source的角度,可以看到:

******query → pool_send_and_wait  → send_******query_message

/*

* process query('q') message

* query messages include an sql string. */

pool_status ******query(pool_connection *frontend,

pool_connection_pool *backend, int len, char *contents)

else

……

string = query_context->original_query;

if (!raw_mode)

/*send the query to master node

*/if (pool_send_and_wait(query_context, 1, master_node_id)

!=pool_continue)

}

/** send the query to other than master node.

*/if (pool_send_and_wait(query_context, -1, master_node_id)

!=pool_continue

……

}else

return

pool_continue;

}

/* 

* send ****** 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) }

/* wait for response */

for (i=0;imajor(backend)) != pool_continue)

…… }

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的正確性。

pgpool II的效能缺陷

pgpool ii在執行在 replication mode的時候,效能低下。經過分析,發現無解 這是由pgpool ii的執行方式決定的。pgpool ii 剛開始執行的時候,就會開很多子程序,預設值128。但是,每當客戶端來乙個請求,就會有乙個子程序全權負責,別的子程序不插手。而在replica...

pgpool II的效能缺陷

pgpool ii在執行在 replication mode的時候,效能低下。經過分析,發現無解 這是由pgpool ii的執行方式決定的。pgpool ii 剛開始執行的時候,就會開很多子程序,預設值128。但是,每當客戶端來乙個請求,就會有乙個子程序全權負責,別的子程序不插手。而在replica...

pgpool II的效能缺陷

pgpool ii在執行在 replication mode的時候,效能低下。經過分析,發現無解 這是由pgpool ii的執行方式決定的。pgpool ii 剛開始執行的時候,就會開很多子程序,預設值128。但是,每當客戶端來乙個請求,就會有乙個子程序全權負責,別的子程序不插手。而在replica...