接上文 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文。
/*至於為何 pgpool-ii把對 master node和 其他node的執行分開,也許有特殊考慮,也許是為了保證master node的正確性。wait for response
*/ 一段,雖然也是個迴圈,但是是序列。
不過好在向各節點發sql文的時候,幾乎是同時地傳送命令,
所以 wait for response 對乙個節點檢查獲得sql文執行結束訊息以後,
幾乎同時也會獲得下乙個節點sql文執行結束的訊息。
綜合以上:如果對乙個節點單獨執行一段批處理耗時1小時,那麼在replication mode 多個節點執行條件下,執行時間將變成 2小時。
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...