精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從一道PG知識的選擇題談起,你悟到了些什么?

數據庫 其他數據庫
稍微懂點PG數據庫的人不難回答,答案是A、B、C。一些Oracle DBA可能會覺得這個答案有點出乎意料。因為在Oracle數據庫中,回寫DB CACHE臟數據的只有DBWR。

昨天一個網友問我一道關于PG的選擇題:Postgresql數據庫中哪些進程可以將shared buffers中的臟數據回寫到數據文件?A) BACKEND B) BGWRITER C)CHECKPOINTER D) WALWRITER。

稍微懂點PG數據庫的人不難回答,答案是A、B、C。一些Oracle DBA可能會覺得這個答案有點出乎意料。因為在Oracle數據庫中,回寫DB CACHE臟數據的只有DBWR。可能這些人不太清楚的CKPT負責回寫部分臟數據是80年代早期關系型數據庫的共同特點,Oracle數據庫中,CKPT也曾經負責過寫臟塊。后來隨著數據庫規模的增大,CKPT的功能被獨立出來了,只負責CKPT的推進工作,不再負責寫臟塊了。在Oracle數據庫中,為了更快的將臟塊回寫,通過將DB CACHE分區,采用多個DBWR進程可以并發寫臟塊,從而滿足大型數據庫的需要。

PG在刷臟塊的算法方面的設計比較傳統,這種設計是從90年代一脈相承的,改起來成本較大,所以就一直沿用下來了。只不過讓backend也去寫臟塊,這未免也有點太出乎一般人的想象了。這會產生幾個比較奇怪的現象,一個是某條SQL語句,可能在執行計劃相同、數據量相同的情況下,不同的時間執行,其執行效率有較大的不同。另外一個奇怪現象是某條SELECT語句可能會產生較多的寫操作。實際上Oracle數據庫中也會存在類似的現象,這種情況是由延遲塊清理產生的。當一個大型事務結束后,ITL的狀態清理可能并沒有完成,如果馬上有SELECT操作訪問這些數據,那么執行SELECT的前臺進程將負責完成這些塊的清理,這時候select操作也會產生大量的寫操作,產生大量的REDO,同時這條SELECT比起平時會慢很多。    

圖片圖片

通過pg_stat_bgwriter系統表中的buffers_backend和buffers_backend_fsync可以查詢到系統中的backend寫臟塊和fsync的計數。

圖片圖片

從我們的一個D-SMART的PG數據庫中看到一個十分神奇的情況,按理說被用來寫臟塊的bgwriter居然很小(buffers_clean),大多數臟塊都是checkpointer和backend寫的 。如果你去檢查一下你們的PG數據庫,可能bgwriter寫臟塊的比例也不是很高。

為什么會出現這種情況,為什么大量的寫臟塊工作不由本應該處理臟塊的 bgwriter去做,而讓Backend去寫臟塊呢?這方面的資料很少,我們只能從 PG的代碼上去找找答案。首先我們看一下src/backend/storage/bufmgr.c,在這里可以看到backend從shared buffers中分配空閑buffer的算法。一般我們都能理解從shared buffers中查找空閑的buffer,如果找不到非臟的空閑塊,那么就有可能找到一個存儲了臟數據的數據塊,這時候才需要backend去寫臟塊。在Oracle數據庫中,前臺進程是順著lru鏈的冷端去查找空閑緩沖塊的,如果前臺進程發現了某個沒有被Pin住的塊是臟塊,就會把這個數據塊移到lru-w中,然后繼續往下搜索,如果連續搜素到了N個臟塊,無法獲得所需要的空閑塊的時候,就會發出一個free buffer requests的事件,讓DBWR加快刷臟塊,然后再去重試。從PG的代碼上看,PG的大體思想類似,不過策略要復雜得多。    

圖片圖片

BufferAlloc里包含了backend查找某個buffer的頂層邏輯。不閱讀一下還真沒發現PG這方面的代碼邏輯會搞得如此復雜。要想訪問某個buffer,先要生成一個BUFFER TAG(關于這方面的詳細算法請參考我2021年寫過的一篇8000多字的長篇《PG SHARED BUFFER POOL的優化》)。然后查找這個BUFFER。    

圖片圖片

如果BUFFER存在,還有兩種可能性,一種是成功的PIN住了這個BUFFER,那么就可以返回這個BUFFER了。不過BUFFER存在還有一種可能性是無法PIN住,無法PIN住的原因是可能被其他的會話PIN住了,也可能是一些其他的原因。這種情況,Oracle被稱為read by other session或者buffer busy waits。這個部分不是我們今天分析的重點,我們繼續往下看代碼。    

圖片圖片

GetVictimBuffer函數通過時鐘掃描算法去找一個空閑的buffer。這里就涉及到查找空閑shared buffers了。我們下鉆到這個函數的代碼中去繼續分析。

圖片圖片

首先調用StrategyGetBuffer去找一個BUFFER。    

圖片圖片

如果發現找到的是一個臟塊,那么就把臟塊刷盤,這就是BACKEND也需要刷臟塊的原因之一。作為數據庫緩沖的算法,我們肯定應該盡可能的找到非臟塊來復用,總是讓BACKEND寫臟塊肯定會降低數據庫的整體性能。    

StrategyGetBuffer函數在src/backend/buffer/freelist.c中定義。首先,它會檢查是否有一個策略對象(strategy),如果有,就調用GetBufferFromRing函數,從策略對象的環形緩沖區(ring buffer)中獲取一個緩沖區。如果獲取成功,就返回這個緩沖區,并設置from_ring標志為true。如果沒能正常找到free buffer,它會嘗試喚醒bgwriter,讓它刷新臟的緩沖區到磁盤,以便釋放一些空間。接下來,backend會檢查StrategyControl->firstFreeBuffer變量,如果大于等于0,就表示有空閑的緩沖區,那么就通過一個循環從空閑鏈表中獲取一個緩沖區。這部分算法與Oracle的free buffer requests十分類似。

此時如果空閑鏈表為空,backend會進入另一個循環,嘗試從victim pool中選擇一個緩沖區,victim pool是一個循環隊列,存儲了最近被訪問過的緩沖區的編號。從nextVictimBuffer的當前位置開始,順時針掃描victim pool,尋找一個既不被鎖定,也沒有被引用,也不是臟的緩沖區。如果找到了,就返回這個緩沖區,并將其從victim pool中移除。如果沒有找到合適的緩沖區,它會繼續掃描victim pool,尋找一個既不被鎖定,也沒有被引用,但是是臟塊的緩沖區。如果找到了,就將這個緩沖區的內容寫入磁盤,然后返回這個緩沖區(這是代碼中backend中另外一個寫臟塊的地方),并將其從victim pool中移除,并添加到策略對象的環形緩沖區中。

我們先不去吐槽PG在這塊代碼的質量問題,僅僅從算法來看,backend直接刷臟塊的機會也應該是比較小的。那么為什么我們會在pg_stat_bgwriter中看到如此奇葩的數據呢?這里面其實也有一個十分有意思的邏輯。

首先是關于buffers_backend這個指標,本身這個指標就有一定的誤導性,我們今天看的代碼上包含了處寫臟塊的地方,其實不用看代碼我們都能想到第三處,那就是VACUUM。因為backend中還包含了auto vacuum,vacuum操作等寫臟塊的統計數據,因此我們可能會被這個指標誤導。PG社區中十多年前就有人希望PG代碼中把這些情況區分開來,從而讓buffers_clean更有指向性,不過沒有獲得PG社區核心研發的認同。    

另外一點是PG數據庫的策略是盡可能讓數據在內存中多存放一段時間,而不急著把臟數據寫盤。因此在PG數據庫中,還是將檢查點進程作為寫臟塊的主力,如果你的系統中的buffers_alloc增長很緩慢的話,那么只要按照checkpointer的節奏慢慢寫臟塊就可以了,backend總是能夠找到所需要的buffer,因此也就沒必要讓bgwriter去寫臟塊了。這種算法對于早些年比較緩慢的IO子系統來說是十分友好的,不過對于當今高性能的IO系統來說,不夠高效,比較適合目前IO性能一般的云上小型數據庫,而對于采用高性能IO設備的大型數據庫來說,并不一定是很優化的。

基于上面的分析我們可以了解到,如果你看到你的系統中的buffers_clean總是為0或者總是慢速增長,那么并不說明系統存在問題,而是說明你的系統寫負載還不算太高,bgwriter還犯不著去幫你刷盤而已。對于IO性能還不錯的系統,或者說規模不算太大的數據庫來說,PG的這種刷臟塊的方法還是可以勝任的,在一些超大型系統中,可能這方面會成為瓶頸。我看到Polardb-PG、openGauss等基于PG代碼的數據庫產品中,對這方面都做了一些優化,引入了專門的機制來替換BGWRITER。目前還沒有對這些代碼進行分析,因此不知道這方面的改善如何。

今天分析PG這方面源代碼的另外一個收獲是從中學到一些PG的SHARED BUFFERS相關的優化策略的。首先shared buffers不能設置得太少,否則backend真正開始大量刷臟塊了,那么SQL的性能是會受到很大的影響的。其次是CHECKPOINTER的相關參數設置要合理,根據底層IO的能力配置合適的參數,讓CHECKPOINTER刷盤的速度能夠跟得上buffers_alloc的速度。如果我們發現buffers_clean的增長比較快了,那么說明目前系統的負載對shared buffers 有一定的壓力了,那么我們就需要考慮調整bgwriter相關的參數了。       

最后的源碼鏈接是我兩年多前寫的一篇關于PG SHARED BUFFERS的內部結構的分析文章,文章很長,有8000多字,有興趣的朋友可以閱讀一下。文中有些觀點可能和今天的文章有些不大一致了,如果存在這方面的觀點,那么就以今天的文章為準吧。對PG數據庫的理解都是一點一點的從模糊到清晰,從不大準確到相對準確的。認知的提升是從一個個案例,一段段源碼的分析中逐漸完成的。

責任編輯:武曉燕 來源: 白鱔的洞穴
相關推薦

2021-04-29 21:06:49

有序數組算法

2018-03-13 16:04:45

Promise執行順序

2024-02-07 01:32:48

頁面前端項目

2022-08-02 07:57:54

RAC故障運維

2022-01-19 11:39:15

數據治理大數據數據

2023-04-26 01:25:05

案例故障模型

2021-03-27 10:59:45

JavaScript開發代碼

2024-08-12 15:44:06

2018-01-29 15:25:05

前端JSDate對象

2018-04-26 11:23:01

Linuxfork程序

2021-04-13 08:50:21

JS作用域面試題

2015-01-14 19:48:06

移動CRM

2024-03-18 13:32:11

2020-03-26 15:29:35

全球關注涉密會議

2021-03-02 11:29:50

算法算法分析前端

2023-11-29 12:12:24

Oceanbase數據庫

2021-10-28 11:40:58

回文鏈表面試題數據結構

2010-08-18 10:27:56

2009-01-08 21:21:45

程序員筆記

2016-01-04 09:27:56

TCP網絡協議
點贊
收藏

51CTO技術棧公眾號

国产日韩精品视频一区| 成人亚洲一区| 黑人巨大精品欧美一区二区| 欧美日韩精品久久| 中文字幕观看视频| 欧美先锋影音| 亚洲午夜久久久久久久| 色黄视频免费看| 国产精品av一区二区三区 | 成人黄色av播放免费| 久久久久人妻一区精品色欧美| 美女福利一区| 欧美一区二区在线观看| 日本免费不卡一区二区| 九七电影韩国女主播在线观看| 成人av网站大全| 国产一区二区丝袜高跟鞋图片| 国产 日韩 欧美 成人| 欧美色爱综合| 亚洲加勒比久久88色综合| 欧美一级特黄a| 亚洲xxxx在线| 日韩三级久久久| 人体久久天天| 欧美电影免费提供在线观看| 天堂av在线网站| h片视频在线观看| 亚洲欧美成人一区二区三区| 欧美午夜精品久久久久免费视| av中文字幕第一页| 日韩高清在线电影| 日本精品久久中文字幕佐佐木| 久一区二区三区| 国产精品久久天天影视| 亚洲午夜久久久影院| 精品无码国产一区二区三区51安| 日韩一区二区三区在线看| 欧美丝袜丝nylons| 人妻丰满熟妇av无码区app| 国产中文在线播放| 午夜精品成人在线视频| 国产一级大片免费看| 国产一区久久精品| 自拍av一区二区三区| 亚洲国产精品久久久久久女王| 日本高清中文字幕二区在线| 波多野结衣视频一区| 国产v亚洲v天堂无码| www.国产欧美| 国产成人精品www牛牛影视| 91免费欧美精品| 成人黄色在线免费观看| 污污内射在线观看一区二区少妇 | 色噜噜狠狠色综合中国| 国产极品尤物在线| 国内激情视频在线观看| 精品久久中文字幕久久av| 日本丰满少妇xxxx| 国产在线精彩视频| 色婷婷亚洲综合| 亚洲男人天堂色| 精品国产美女a久久9999| 欧美系列日韩一区| 色片在线免费观看| 国产免费av国片精品草莓男男| 51午夜精品国产| 黄色一级片免费播放| 在线日韩成人| 亚洲精品久久久久国产| www在线观看免费视频| 国产欧美日韩影院| 久久精品视频网站| 久久综合激情网| 久久久久久黄| 91久久久久久久| 亚洲美女性生活| 久久在线观看免费| 亚洲自拍三区| 丰乳肥臀在线| 欧美在线观看视频在线| 超碰91在线播放| 欧美日韩麻豆| 精品久久久av| 国产乡下妇女做爰视频| 久久人人超碰| 91精品中文在线| 天堂中文网在线| 国产精品久久久久久久第一福利| 国产一级不卡视频| 成人欧美一区二区三区的电影| 欧美优质美女网站| 超碰caoprom| 日本一区二区高清不卡| 欧美大肥婆大肥bbbbb| 亚洲男人第一av| 国精品**一区二区三区在线蜜桃 | 一区二区三区四区不卡在线| xxxx18hd亚洲hd捆绑| 91精品店在线| 亚洲大尺度美女在线| 日本爱爱爱视频| 激情视频一区| 91精品久久久久久久久青青| 狠狠综合久久av一区二区| 中文字幕精品一区二区精品绿巨人| 91大学生片黄在线观看| 偷拍精品精品一区二区三区| 欧美一区二区女人| 91视频免费在观看| 午夜亚洲伦理| 99三级在线| 日本中文在线| 一本到不卡免费一区二区| 熟妇女人妻丰满少妇中文字幕| 亚洲区小说区| 国内成人精品视频| 99国产在线播放| 国产日韩欧美精品在线| 综合136福利视频在线| 亚洲bbw性色大片| 国产极品人妖在线观看| 欧美少妇一区二区| 国产精品一区二区入口九绯色| 亚洲国产一成人久久精品| 国产成人短视频| 色呦呦中文字幕| 亚洲激情成人在线| 亚洲三级在线观看视频| 俺要去色综合狠狠| 日本伊人精品一区二区三区介绍| 色婷婷av一区二区三| 一区二区三区在线免费播放| 亚洲精品久久久久久宅男| 韩日一区二区三区| 日韩美女免费视频| 经典三级在线| 色先锋资源久久综合| 女同性恋一区二区三区| 激情综合在线| 国产精品日韩一区二区三区| 色爱综合区网| 精品国内片67194| 久久国产在线观看| 国产成人三级在线观看| 国产专区在线视频| 亚洲国产精品免费视频| 美女撒尿一区二区三区| 国产视频在线观看免费 | 久草视频在线资源| 国产成人福利片| 日本欧美视频在线观看| 粉嫩久久久久久久极品| 久久久亚洲成人| 特黄视频在线观看| 动漫精品一区二区| 无码熟妇人妻av| 日本午夜精品一区二区三区电影 | 国产在线观看免费播放| 欧美日本中文| 狠狠色综合网站久久久久久久| www成人免费观看| 香蕉久久夜色精品| 国产午夜精品久久久| 国产www在线| 欧美极品aⅴ影院| 亚洲成人手机在线观看| 欧美激情综合色综合啪啪| 国产精品免费一区二区三区四区| 538在线观看| 亚洲欧美日韩国产中文专区| 国产裸体美女永久免费无遮挡| 国产精品久久久久9999吃药| 欧美日韩久久婷婷| 亚洲精选国产| 午夜欧美性电影| 久久视频免费| 欧美亚洲国产另类| 看女生喷水的网站在线观看| 精品久久久网站| 国产午夜精品久久久久| 亚洲欧美在线视频| 黄色网址在线视频| 奇米一区二区三区av| 91亚洲精品国产| 九九亚洲视频| 亚洲一区二区自拍| 一个人www视频在线免费观看| 在线观看日韩欧美| 丰满人妻妇伦又伦精品国产| 色偷偷一区二区三区| 69夜色精品国产69乱| 成人国产精品免费网站| 少妇激情一区二区三区| 国产精品99一区二区| 日韩色妇久久av| 一区二区三区国产好| 国产精品91在线| 免费av不卡在线观看| 国产亚洲精品91在线| 亚洲高清在线观看视频| 欧美亚洲动漫制服丝袜| 国产精品第二十页| 日韩美女久久久| av小说在线观看| 高清视频一区二区| 在线观看av网页| 亚洲永久网站| 真人抽搐一进一出视频| 999国产精品999久久久久久| 精品人伦一区二区三区| 精品国产麻豆| 国产精品久久久久久久一区探花 | 91视频福利网| 日韩黄色一级片| 欧美,日韩,国产在线| 国产精品久久观看| 日韩中文一区| 九九综合九九| 精品无码久久久久国产| 涩爱av色老久久精品偷偷鲁| 国产一区私人高清影院| 国产精品扒开腿做爽爽爽视频软件| 欧美激情三级免费| 黄色动漫在线| 色黄久久久久久| 成黄免费在线| 亚洲人av在线影院| 色吊丝在线永久观看最新版本| 日韩欧美www| 国产三级第一页| 欧美丰满美乳xxx高潮www| 国产成人av免费| 色一区在线观看| 青青青国产在线| 天天做天天摸天天爽国产一区| 九九热国产精品视频| 亚洲毛片av在线| 日韩三级久久久| 亚洲人亚洲人成电影网站色| 欧美日韩生活片| 中国av一区二区三区| 免费网站在线高清观看| 国产亚洲一区二区三区在线观看| 亚洲精品乱码久久久久久不卡| 懂色av一区二区三区免费看| 久久久久99人妻一区二区三区| 国产一区二区三区观看| 99999精品| 成人一区二区三区视频在线观看| xxxx国产视频| 国产91丝袜在线播放| 美女网站视频在线观看| 成人国产精品免费观看动漫| 亚洲一区二区三区四区五区六区| 99久久精品国产毛片| 欧美特级黄色录像| 国产欧美日韩精品a在线观看| 亚洲第一综合网| 国产精品你懂的| 日韩在线观看视频一区二区| 一区二区三区中文字幕电影| 精品少妇一二三区| 精品av在线播放| 狠狠狠狠狠狠狠| 欧美猛男gaygay网站| 国产黄色免费大片| 亚洲第一级黄色片| 国内av免费观看| 精品裸体bbb| 国产精品欧美一区二区| 国产成人免费视频网站视频社区| 51成人做爰www免费看网站| 草草视频在线一区二区| 鲁丝片一区二区三区| 不卡中文一二三区| 日本大胆人体视频| 久久激情网站| 日韩成人av免费| 成人黄色国产精品网站大全在线免费观看 | 在线不卡视频一区二区| 欧美日韩视频一区二区三区| 18禁免费观看网站| 蜜桃av噜噜一区| 好吊操视频这里只有精品| 99精品国产一区二区三区不卡| 人妻aⅴ无码一区二区三区| 亚洲人成在线观看一区二区| 日韩免费视频网站| 欧美丝袜丝交足nylons| 成人久久精品人妻一区二区三区| 亚洲精品在线91| 在线观看中文| 青青草国产精品一区二区| 9999精品免费视频| 久久手机视频| 欧美破处大片在线视频| 日本成人黄色网| 高清不卡一区二区| 五月婷婷六月香| 亚洲国产成人高清精品| 伊人网免费视频| 日韩成人小视频| 国产美女在线观看| 国产成人精品久久| 无码国模国产在线观看| 亚洲第一在线综合在线| 国产精品日韩久久久| 91亚洲一区二区| 国产精品伦理一区二区| www.国产一区二区| 亚洲精品在线免费播放| 欧美日本一道| 国产a级全部精品| 福利欧美精品在线| 大桥未久一区二区三区| 日韩成人一级片| 国产传媒第一页| 亚洲高清视频的网址| 国产精品日韩无码| 99久久精品国产一区| 日本婷婷久久久久久久久一区二区 | 日韩一二在线观看| 91在线视频| 情事1991在线| 日韩精品欧美大片| www.av蜜桃| 成人性生交大片免费看视频在线| 欧美爱爱免费视频| 欧美写真视频网站| 福利视频在线播放| 国产精品 欧美在线| 任你弄精品视频免费观看| 精品丰满人妻无套内射| 粉嫩欧美一区二区三区高清影视| 999精品视频在线观看播放| 在线观看一区二区视频| 亚洲欧美日本在线观看| 午夜精品久久17c| 久久av国产紧身裤| 成年人看的毛片| av一区二区久久| 久久国产精品免费看| 日韩av在线精品| 自拍视频在线看| 欧美精品一区三区在线观看| 国产欧美日本| 日韩乱码人妻无码中文字幕久久 | 中文字幕乱码中文字幕| 亚洲视频在线免费观看| 91精品韩国| 午夜精品视频在线观看一区二区| 日韩一区精品字幕| 五月婷婷婷婷婷| 51久久夜色精品国产麻豆| a黄色片在线观看| 岛国视频一区免费观看| 在线一区欧美| 69视频在线观看免费| 欧美日韩一区三区| 二区三区在线观看| 国产高清在线精品一区二区三区| 亚洲另类自拍| 久久久久久九九九九九| 精品视频一区二区三区免费| 日本在线观看网站| 亚洲一区久久久| 日韩视频一区二区三区在线播放免费观看| 97精品人人妻人人| 日本黄色一区二区| 四虎久久免费| 国产伦理一区二区三区| 亚洲尤物精选| fc2ppv在线播放| 亚洲成人网av| 精品乱码一区二区三区四区| 好色先生视频污| 91视视频在线直接观看在线看网页在线看| а中文在线天堂| 欧美成年人网站| 亚洲图区在线| 亚洲一区二区福利视频| 午夜一区二区三区在线观看| 国产一区二区影视| av噜噜色噜噜久久| 日韩精品一区第一页| 久久久久久久久精| 伊人久久大香线蕉av一区二区| 高清一区二区| 久久美女福利视频| 亚洲丝袜精品丝袜在线| 深夜福利在线看| 91亚洲国产成人久久精品网站| 一区二区三区高清视频在线观看| 欧美日韩生活片| 精品无人区乱码1区2区3区在线| 亚洲男男av| 久久无码高潮喷水| 伊人婷婷欧美激情| 高清中文字幕一区二区三区| 99精品在线直播|