本篇內(nèi)容介紹了“PostgreSQL中與AUTOVACUUM IO相關(guān)的參數(shù)是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
攸縣網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),攸縣網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為攸縣數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的攸縣做網(wǎng)站的公司定做!
PG的MVCC要求“過(guò)期”的數(shù)據(jù)不能馬上被物理清除,而是標(biāo)記為dead rows,這些dead rows后續(xù)會(huì)通過(guò)vacuuming過(guò)程清理。
vacuuming通過(guò)以下方式讓數(shù)據(jù)庫(kù)保持“健康”:
1.標(biāo)記dead rows可用于存儲(chǔ)新數(shù)據(jù),這樣可以避免不必要的磁盤(pán)浪費(fèi)以及可以跳過(guò)dead rows以提升順序掃描的性能;
2.更新vm(用于跟蹤過(guò)期或已廢棄的數(shù)據(jù),反應(yīng)在pages上)。這可以提升index-only scans的性能;
3.避免出現(xiàn)事務(wù)ID回卷而導(dǎo)致的數(shù)據(jù)庫(kù)宕機(jī)。
PG提供了autovacuum機(jī)制,通過(guò)周期性的運(yùn)行ANALYZE來(lái)收集最近頻繁更新的數(shù)據(jù)表統(tǒng)計(jì)信息,基于這些統(tǒng)計(jì)信息autovacuum進(jìn)行調(diào)度清理dead rows。
autovacuum逐張表進(jìn)行處理,從磁盤(pán)或者memory讀取pages,如這些pages需清理dead rows則需要執(zhí)行更新/寫(xiě)入pages操作,因此涉及到IO。為了讓IO更為平滑而不影響正常的數(shù)據(jù)庫(kù)操作,PG提供了相關(guān)的參數(shù)用于控制autovacuum的執(zhí)行頻繁程度,以免在數(shù)據(jù)庫(kù)壓力很大的情況下出現(xiàn)IO問(wèn)題。
autovacuum_vacuum_cost_limit : total cost limit autovacuum could reach (combined by all autovacuum jobs).執(zhí)行autovacuum的成本上限。
autovacuum_vacuum_cost_delay : autovacuum will sleep for these many milliseconds when a cleanup reaching autovacuum_vacuum_cost_limit cost is done.達(dá)到成本上限后,autovacuum需要休息多久,以毫秒為單位。
vacuum_cost_page_hit : Cost of reading a page that is already in shared buffers and doesn’t need a disk read.在緩存中命中pages時(shí)的成本。
vacuum_cost_page_miss : Cost of fetching a page that is not in shared buffers.沒(méi)有在緩存中命中時(shí)的成本。
vvacuum_cost_page_dirty : Cost of writing to each page when dead tuples are found in it.如pages中存在dead rows時(shí)的處理成本。
上述參數(shù)的默認(rèn)值為:
autovacuum_vacuum_cost_limit = -1 ### 如為-1,則默認(rèn)為vacuum_cost_limit,即200 autovacuum_vacuum_cost_delay = 20ms vacuum_cost_page_hit = 1 vacuum_cost_page_miss = 10 vacuum_cost_page_dirty = 20
根據(jù)上述參數(shù),下面我們來(lái)推算下每秒autovacuum會(huì)產(chǎn)生的IO。
autovacuum_vacuum_cost_delay設(shè)定為20ms,那么每秒可以有50輪的autovacuum:50=1s/20ms。
內(nèi)存讀:假設(shè)全部在緩存中命中,意味著讀取200個(gè)pages,200=autovacuum_vacuum_cost_limit/vacuum_cost_page_hit=200/1,可以推算出Read IO Rate=50*200*8K/s≈80MB/s;
OS讀:假設(shè)全部沒(méi)有命中,意味著要從OS(page cache或者disk)中讀取20個(gè)pages,20=autovacuum_vacuum_cost_limit/vacuum_cost_page_miss=200/10,Read IO Rate=50*20*8K/s≈8MB/s;
寫(xiě):假設(shè)讀出來(lái)的page都有dead rows需要處理,那么需要寫(xiě)入10個(gè)pages,10=autovacuum_vacuum_cost_limit/vacuum_cost_page_dirty=200/20,Write IO Rate=50*10*8K/s≈5MB/s;
相對(duì)于現(xiàn)在的硬件設(shè)備,這樣的吞吐顯得過(guò)于“低調(diào)”,可通過(guò)提高autovacuum_vacuum_cost_limit來(lái)提升總體吞吐,比如把a(bǔ)utovacuum_vacuum_cost_limit設(shè)置為2000,可以讓上述吞吐量有10x的提升。
“PostgreSQL中與AUTOVACUUM IO相關(guān)的參數(shù)是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!