Pgbouncer最佳實踐:系列二

作者:王志斌,曾獲得中國PostgreSQL數(shù)據(jù)庫管理工程師(PGCE),是PostgreSQL官方認證講師,盤古云課堂特邀金牌講師。


連接池選擇必須有測試數(shù)據(jù)作為支撐,才能更好來決定如何選擇。通過下面的測試結(jié)果,能夠更加直觀的看到兩者之間的差異(相關(guān)數(shù)據(jù)及測試結(jié)果來源自Percona[3]):


一般來說,PostgreSQL通過將它的主要操作系統(tǒng)進程“分叉”到每個新連接的子進程中來實現(xiàn)連接處理。在操作系統(tǒng)級別上獲得了PostgreSQL中每個連接的資源利用率的完整視圖(以下輸出來自top命令):


表1直連內(nèi)存占用情況

PID USER ?????PR NI VIRT RES ?SHR S %CPU %MEM TIME+ ?COMMAND ????????????

24379 postgres ?20 0 346m 148m 122m R 61.7 ?7.4 0:46.36 postgres: sysbench sysbench ::1(40120)

24381 postgres ?20 0 346m 143m 119m R 62.7 ?7.1 0:46.14 postgres: sysbench sysbench ::1(40124)

24380 postgres ?20 0 338m 137m 121m R 57.7 ?6.8 0:46.04 postgres: sysbench sysbench ::1(40122)

24382 postgres ?20 0 338m 129m 115m R 57.4 ?6.5 0:46.09 postgres: sysbench sysbench ::1(40126)


首先,在時間和內(nèi)存方面,分叉一個操作系統(tǒng)進程要比為一個現(xiàn)有進程生成一個新線程要昂貴得多。隨著時間的推移,考慮變得越來越重要。這可能是為什么在基于PostgreSQL的應(yīng)用程序的擴展生命周期中早期就需要連接池機制的原因之一。


為了說明連接池可能對PostgreSQL服務(wù)器的性能產(chǎn)生的影響,利用在sysbench-tpcc上對PostgreSQL進行的測試,并通過使用PgBouncer作為連接池來部分重復(fù)了這些測試。


當(dāng)?shù)谝淮芜\行測試時,目標(biāo)是針對PostgreSQL的sysbench-tpcc工作負載優(yōu)化PostgreSQL,該工作負載運行56個并發(fā)客戶端(線程),并且服務(wù)器具有相同數(shù)量的可用CPU,運行時間定為30分鐘。這次的目標(biāo)是更改并發(fā)客戶端的數(shù)量(56、150、300和600),以查看服務(wù)器如何應(yīng)對連接的擴展。


使用事務(wù)池進行測試,因為sysbench-tpcc的工作量由幾個短語句和單語句事務(wù)組成。下表為完整使用的配置文件,命名為pgbouncer.ini:


表2pgbouncer.ini文件

[databases]

sbtest = host=127.0.0.1 port=5432 dbname=sbtest


[pgbouncer]

listen_port = 6543

listen_addr = 127.0.0.1

auth_type = md5

auth_file = userslist.txt

logfile = pgbouncer.log

pidfile = pgbouncer.pid

admin_users = postgres

pool_mode = transaction

default_pool_size=56

max_client_conn=600


除了pool_mode以外,其他最重要的變量是:

default_pool_size:每個用戶/數(shù)據(jù)庫對允許多少個服務(wù)器連接。

max_client_conn:允許的最大客戶端連接數(shù)


userslist.txt通過指定文件AUTH_FILE只包含用于連接到PostgreSQL的用戶和口令的信息;該文件中的密碼可以是純文本密碼,也可以是使用MD5或SCRAM加密的密碼,具體取決于要使用的身份驗證方法。


定義用戶的另一種方法是讓PgBouncer在需要時直接查詢PostgreSQL后端。這是通過配置參數(shù)設(shè)置的auth_user,可以在全局或每個數(shù)據(jù)庫中設(shè)置。設(shè)置此選項后,PgBouncer使用該用戶連接到PostgreSQL后端,并運行該設(shè)置定義的查詢auth_query以查找用戶和密碼。如果auth_user本身需要用于該連接的密碼,則需要在user.txt中進行設(shè)置。關(guān)于相關(guān)細節(jié)請參見Pgbouncer官網(wǎng)


使用以下命令將PgBouncer作為守護程序啟動:

$pgbouncer -d pgbouncer.ini


除了僅運行基準(zhǔn)測試30分鐘并每次更改并發(fā)線程數(shù)之外,線程數(shù)=56。下面的示例來自第一次運行:

$ ./tpcc.lua --pgsql-user=postgres --pgsql-db=sbtest --time=1800 --threads=56 --report-interval=1 --tables=10 --scale=100 --use_fk=0 ?--trx_level=RC --pgsql-password=****** --db-driver=pgsql run > /var/lib/postgresql/Nando/56t.txt


對于使用連接池的測試,調(diào)整連接選項,以便與PgBouncer而不是PostgreSQL直接連接。請注意,它仍然是本地連接:

./tpcc.lua --pgsql-user=postgres --pgsql-db=sbtest --time=1800 --threads=56 --report-interval=1 --tables=10 --scale=100 --use_fk=0 ?--trx_level=RC --pgsql-password=****** --pgsql-port=6543 --db-driver=pgsql run > /var/lib/postgresql/Nando/P056t.txt


每次執(zhí)行sysbench-tpcc之后,使用以下命令清除操作系統(tǒng)緩存:

$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'


在default_pool_size=56的情況下,結(jié)果如下:


圖3?連接池相同測試結(jié)果


sysbench-tpcc的TPS:比較與PostgreSQL的直接連接和將PgBouncer作為連接池


在只有56個并發(fā)客戶端的情況下運行sysbench-tpcc時,使用到PostgreSQL的直接連接可以提供比使用PgBouncer時高2.5倍的吞吐量(TPS表示每秒事務(wù))。在這種情況下,使用連接池會極大地影響性能。在如此小的規(guī)模下,連接池沒有任何收益,只有開銷。


但是,當(dāng)使用150個并發(fā)客戶端運行基準(zhǔn)測試時,我們開始看到使用連接池的好處。顯然測試TPS值明顯高于直連方式。


即使并發(fā)客戶端數(shù)量增加一倍然后四倍,PgBouncer仍可以保持這樣的吞吐量,在這種情況下,所發(fā)生的是沒有立即充滿大量請求到服務(wù)器,而是全部停止在PgBouncer外面。一旦釋放了其池中的一個連接,PgBouncer僅允許下一個請求繼續(xù)進行到PostgreSQL。


該策略對于sysbench-tpcc似乎非常有效。對于其他工作負載,平衡點可能位于其他地方。


對于上述測試,在PgBouncer上將default_pool_size設(shè)置為等于此服務(wù)器上可用的CPU內(nèi)核數(shù)(56)。為了探索此參數(shù)的調(diào)整,我使用較大的連接池(150、300、600)和較小的連接池(14)重復(fù)了這些測試。結(jié)果如下:


圖4連接池不同測試結(jié)果


PgBouncer的使用如何影響sysbench-tpcc的吞吐量:首先比較不同池大小的使用


使用較小的連接池(14),其大小僅為可用CPU數(shù)量的1/4,仍然產(chǎn)生幾乎相同的結(jié)果。說明充分利用PgBouncer進行連接處理已經(jīng)有開始有效果。


將連接池池中的連接數(shù)加倍并沒有任何實際的區(qū)別。但是一旦將該數(shù)字推斷為600,此時并發(fā)線程數(shù)大于可用CPU數(shù),吞吐量就變得與不使用連接池時的吞吐量相當(dāng)。即使運行的并發(fā)線程數(shù)與池中可用的連接數(shù)(600)相同,也是這樣。可以預(yù)料的是在PostgreSQL有一個實際的限制。


首先,將連接池大小設(shè)置為等于服務(wù)器中可用CPU的數(shù)量,似乎是個好主意。大約有150個左右的連接池可能有一個硬限制。下表是針對不同視圖總結(jié)了獲得的結(jié)果的表格:


圖5測試匯總結(jié)果


從上述的測試過程可以了解到,使用連接池可以充分提高數(shù)據(jù)庫的處理效率。


了解更多PostgreSQL熱點資訊、新聞動態(tài)、精彩活動,請訪問中國PostgreSQL官方網(wǎng)站

解決更多PostgreSQL相關(guān)知識、技術(shù)、工作問題,請訪問中國PostgreSQL官方問答社區(qū)

下載更多PostgreSQL相關(guān)資料、工具、插件問題,請訪問中國PostgreSQL官方下載網(wǎng)站

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 需要原文的可以留下郵箱我給你發(fā),這里的文章少了很多圖,懶得網(wǎng)上粘啦 1數(shù)據(jù)庫基礎(chǔ) 1.1數(shù)據(jù)庫定義 1)數(shù)據(jù)庫(D...
    極簡純粹_閱讀 7,932評論 0 46
  • 目錄 架構(gòu)圖 部署詳情 postgresql的安裝與配置 pgpool的安裝與配置 寫在安裝前 postgresq...
    OrangeLoveMilan閱讀 28,095評論 4 15
  • 一、MySQL架構(gòu)與歷史 A.并發(fā)控制 1.共享鎖(shared lock,讀鎖):共享的,相互不阻塞的 2.排他...
    ZyBlog閱讀 20,055評論 3 177
  • PL/Proxy可以在CONNECT模式或CLUSTER模式下使用。在“連接”模式下,PL/Proxy充當(dāng)?shù)搅硪粋€...
    只有香如故閱讀 2,825評論 0 1
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)、焦點、注意力、語言聯(lián)想、情景聯(lián)想 觀點: 1.統(tǒng)計學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會...
    Jenaral閱讀 6,037評論 0 5

友情鏈接更多精彩內(nèi)容