為什麼當磁碟IO成瓶頸之後資料庫的效能急劇下降

時間 2022-04-24 09:02:02

1樓:愛可生雲資料庫

具體問題具體分析,舉例來說明為什麼磁碟io成瓶頸資料庫的效能急速下降了。

為什麼當磁碟io成瓶頸之後, 資料庫的效能不是達到飽和的平衡狀態,而是急劇下降。為什麼資料庫的效能有非常明顯的分界點,原因是什麼?

相信大部分做資料庫運維的朋友,都遇到這種情況。 資料庫在前一天效能表現的相當穩定,資料庫的響應時間也很正常,但就在今天,在業務人員反饋業務流量沒有任何上公升的情況下,資料庫的變得不穩定了,有時候乙個最簡單的insert操作, 需要幾十秒,但99%的insert卻又可以在幾毫秒完成,這又是為什麼了?

dba此時心中有無限的疑惑,到底是什麼原因呢? 磁碟io效能變差了?還是業務運維人員反饋的流量壓根就不對? 還是資料庫內部出問題?昨天不是還好好的嗎?

如果親之前沒有注意到上述的現象,親對上述的結論也是懷疑。但請看下面的分解。

在寫這個文章之前,作者閱讀了大量跟的io相關的**,如非同步io執行緒的相關的,innodb_buffer池相關的,以及跟讀資料塊最相關的核心函式buf_page_get_gen函式以及其呼叫的相關子函式。為了將文章寫得通俗點,看起來不那麼累,因此不再一行一行的將**解析寫出來。

咱們先來提問題。 buf_page_get_gen函式的作用是從buffer bool裡面讀資料頁,可能存在以下幾種情況。

提問. 資料頁不在buffer bool 裡面該怎麼辦?

buffer_read_page函式棧的頂層是pread64(),呼叫了作業系統的讀函式。

buf_read_page的**

如果去讀檔案,則需要等待物理讀io的完成,如果此時io沒有及時響應,則存在堵塞。這是乙個同步讀的操作,如果不完成該執行緒無法繼續後續的步驟。因為需要的資料頁不再buffer 中,無法直接使用該資料頁,必須等待作業系統完成io .

再接著上面的回答提問:

當第二會話執行緒執行sql的時候,也需要去訪問相同的資料頁,它是等待上面的執行緒將這個資料頁讀入到快取中,還是自己再發起乙個讀磁碟的然後載入到buffer的請求呢?   **告訴我們,是前者,等待第乙個請求該資料頁的執行緒讀入buffer pool。

試想一下,如果第乙個請求該資料頁的執行緒因為磁碟io瓶頸,遲遲沒有將物理資料頁讀入buffer pool, 這個時間區間拖得越長,則造成等待該資料塊的使用者執行緒就越多。對高併發的系統來說,將造成大量的等待。 等待資料頁讀入的函式是buf_wait_for_read,下面是該函式相關的棧。

通過解析buf_wait_for_read函式的下層函式,我們知道其實通過首先自旋加鎖pin的方式,超過設定的自旋次數之後,進入等待,等待io完成被喚醒。這樣節省不停自旋pin時消耗的cpu,但需要付出被喚起時的開銷。

再繼續擴充套件問題: 如果會話執行緒a 經過物理io將資料頁1001讀入buffer之後,他需要修改這個頁,而在會話執行緒a之後的其他的同樣需要訪問資料頁1001的會話執行緒,即使在資料頁1001被入讀buffer pool之後,將仍然處於等待中。因為在資料頁上讀取或者更新的時候,同樣需要上鎖,這樣才能保證資料頁併發讀取/更新的一致性。

由此可見,當乙個高併發的系統,出現了熱點資料頁需要從磁碟上載入到buffer pool中時,造成的延遲,是難以想象的。因此排在等待熱點頁佇列最後的會話執行緒最後才得到需要的頁,響應時間也就越長,這就是造成了乙個簡單的sql需要執行幾十秒的原因。

再回頭來看上面的問題,mysql資料庫出現效能下降時,可以看到作業系統有讀io。 原因是,在資料庫對資料頁的更改,是在記憶體中的,然後通過檢查點執行緒進行非同步寫盤,這個非同步的寫操作是不堵塞執行sql的會話執行緒的。所以,即使看到作業系統上有大量的寫io,資料庫的效能也是很平穩的。

但當使用者執行緒需要查詢的資料頁不在buffer pool中時,則會從磁碟上讀取,在乙個熱點資料頁不是非常多的情況下,我們設定足夠大的innodb_buffer_pool的size, 基本可以快取所有的資料頁,因此一般都不會出現缺頁的情況,也就是在作業系統上基本看不到讀的io。  當出現讀的io時,原因時在執行buf_read_page_low函式,從磁碟上讀取資料頁到buffer pool, 則資料庫的效能則開始下降,當出現大量的讀io,資料庫的效能會非常差。

磁碟io請求過高造成的io瓶頸怎麼解決

2樓:愛可生雲資料庫

具體問題具體分析,舉例來說明為什麼磁碟io成瓶頸資料庫的效能急速下降了。

為什麼當磁碟io成瓶頸之後, 資料庫的效能不是達到飽和的平衡狀態,而是急劇下降。為什麼資料庫的效能有非常明顯的分界點,原因是什麼?

相信大部分做資料庫運維的朋友,都遇到這種情況。 資料庫在前一天效能表現的相當穩定,資料庫的響應時間也很正常,但就在今天,在業務人員反饋業務流量沒有任何上公升的情況下,資料庫的變得不穩定了,有時候乙個最簡單的insert操作, 需要幾十秒,但99%的insert卻又可以在幾毫秒完成,這又是為什麼了?

dba此時心中有無限的疑惑,到底是什麼原因呢? 磁碟io效能變差了?還是業務運維人員反饋的流量壓根就不對? 還是資料庫內部出問題?昨天不是還好好的嗎?

如果親之前沒有注意到上述的現象,親對上述的結論也是懷疑。但請看下面的分解。

在寫這個文章之前,作者閱讀了大量跟的io相關的**,如非同步io執行緒的相關的,innodb_buffer池相關的,以及跟讀資料塊最相關的核心函式buf_page_get_gen函式以及其呼叫的相關子函式。為了將文章寫得通俗點,看起來不那麼累,因此不再一行一行的將**解析寫出來。

咱們先來提問題。 buf_page_get_gen函式的作用是從buffer bool裡面讀資料頁,可能存在以下幾種情況。

提問. 資料頁不在buffer bool 裡面該怎麼辦?

buffer_read_page函式棧的頂層是pread64(),呼叫了作業系統的讀函式。

buf_read_page的**

如果去讀檔案,則需要等待物理讀io的完成,如果此時io沒有及時響應,則存在堵塞。這是乙個同步讀的操作,如果不完成該執行緒無法繼續後續的步驟。因為需要的資料頁不再buffer 中,無法直接使用該資料頁,必須等待作業系統完成io .

再接著上面的回答提問:

當第二會話執行緒執行sql的時候,也需要去訪問相同的資料頁,它是等待上面的執行緒將這個資料頁讀入到快取中,還是自己再發起乙個讀磁碟的然後載入到buffer的請求呢?   **告訴我們,是前者,等待第乙個請求該資料頁的執行緒讀入buffer pool。

試想一下,如果第乙個請求該資料頁的執行緒因為磁碟io瓶頸,遲遲沒有將物理資料頁讀入buffer pool, 這個時間區間拖得越長,則造成等待該資料塊的使用者執行緒就越多。對高併發的系統來說,將造成大量的等待。 等待資料頁讀入的函式是buf_wait_for_read,下面是該函式相關的棧。

通過解析buf_wait_for_read函式的下層函式,我們知道其實通過首先自旋加鎖pin的方式,超過設定的自旋次數之後,進入等待,等待io完成被喚醒。這樣節省不停自旋pin時消耗的cpu,但需要付出被喚起時的開銷。

再繼續擴充套件問題: 如果會話執行緒a 經過物理io將資料頁1001讀入buffer之後,他需要修改這個頁,而在會話執行緒a之後的其他的同樣需要訪問資料頁1001的會話執行緒,即使在資料頁1001被入讀buffer pool之後,將仍然處於等待中。因為在資料頁上讀取或者更新的時候,同樣需要上鎖,這樣才能保證資料頁併發讀取/更新的一致性。

由此可見,當乙個高併發的系統,出現了熱點資料頁需要從磁碟上載入到buffer pool中時,造成的延遲,是難以想象的。因此排在等待熱點頁佇列最後的會話執行緒最後才得到需要的頁,響應時間也就越長,這就是造成了乙個簡單的sql需要執行幾十秒的原因。

再回頭來看上面的問題,mysql資料庫出現效能下降時,可以看到作業系統有讀io。 原因是,在資料庫對資料頁的更改,是在記憶體中的,然後通過檢查點執行緒進行非同步寫盤,這個非同步的寫操作是不堵塞執行sql的會話執行緒的。所以,即使看到作業系統上有大量的寫io,資料庫的效能也是很平穩的。

但當使用者執行緒需要查詢的資料頁不在buffer pool中時,則會從磁碟上讀取,在乙個熱點資料頁不是非常多的情況下,我們設定足夠大的innodb_buffer_pool的size, 基本可以快取所有的資料頁,因此一般都不會出現缺頁的情況,也就是在作業系統上基本看不到讀的io。  當出現讀的io時,原因時在執行buf_read_page_low函式,從磁碟上讀取資料頁到buffer pool, 則資料庫的效能則開始下降,當出現大量的讀io,資料庫的效能會非常差。

3樓:山水阿銳

通過部署更多磁碟提公升io效能,或者部署**昂貴的光纖儲存,甚至是利用ssd硬碟。然而,當前企業購買大容量儲存主要用於效能,而非容量。因此,需要提公升儲存的io。

虛擬化遇到的最大的瓶頸是io瓶頸,進一步導致虛擬環境中儲存成本猛增,虛擬化經應用效能不足等等。如何才能很好的解決這些問題?而不是簡單地用磁碟疊加來解決。

cpu的響應越來越快,然而,從儲存的角度上來看,如果後端銀盤沒有很大的變化的話,哪怕公升級到再高的儲存也沒有用。

fusion—io如何解決虛擬化的io瓶頸?

fusion—io 成立於2006年,去年在納斯達克上市。ibm、hp等都是我們的合作夥伴。

fusion—io 的架構其實很san是一樣的,我們把san架構放到乙個很小的pcie卡上。我們跟獨立的san儲存是沒有任何區別的。並且提供了5個9的可靠性。

fusion—io具有以下三大亮點:30多萬iops,這需要上千塊磁碟進行堆徹;低功耗;支援廣泛的應用平台:包括主流的資料庫、sap等等。

比如上次雙十一,**的**活動,一天成交200億人民幣,他們的核心資料庫全部是架設在我們的卡上,所以我們再高負載的資料庫或應用平台上具有很好的表現。

fusion—io可以支援所有的作業系統,包括vmware、susie、windows等。為虛擬機器無縫提供iops。而且可以支援刀片伺服器,刀片版本的卡可以直接插入到到片中。

fusion—io解決vdi的啟動風暴。在一台server上可以支援6000個桌面。可以把卡插在hypervisor的機器上,然後把os image直接放到卡上就可以。

此外,fusion—io還提供了io sphere管理軟體。

電腦開啟磁碟為什麼很卡很卡,電腦開啟磁碟為什麼很卡很卡。

應該是磁碟有問題了,趕緊把那個分割槽刪掉,不要再用了。我之前就遇到這種狀況,最好的辦法就是把它刪了隱藏起來,這樣不會影響正常的使用 應該是硬碟有壞道或延遲較高的扇區,如果只有乙個碟符是這種情況 如果當前碟符內沒有重要檔案你可以通過磁碟管理將其磁碟刪除試試 如果正常了 就是當前磁碟有損壞 建議更換硬碟...

為什麼當護士,你為什麼選擇當護士

白衣天使救死扶傷。你為什麼選擇當 我老婆就是學護理的,工作是好找,可是相當累,而且不受人尊重,他剛畢業,才剛實習完,就非常不喜歡這個工作,我好多同學都不喜歡。悶悶。一開始是我媽非讓我學的,後來我自己慢慢喜歡上這個職業了。怎樣才能當 我為什麼要去美國當 為什麼要選擇 這個職業怎麼回答?面試問 為什麼要...

為什麼要當保安,你為什麼要當警察?

職言說 當保安又苦又累,賺的還少,為什麼老年人還搶著幹?原因很現實 首先,我選擇保安作為職業,是因為這一行業的神聖。保護他人及公共設施活私人利益不受非法侵害,感覺上很像警察的行業,所以我喜歡。其次,我適合從事保安的工作。我的身高 體格都符合這一行業的要求,是最合適的人選。第三,貴公司需要我這樣有敬業...

磁碟碎片整理怎麼這麼慢,為什麼磁碟碎片整理這麼慢

windows自帶的磁碟碎片整理本來就很慢!建議使用第三方的磁碟碎片整理軟體,比方voptme或speedisk。而且在整理時你最好不要用電腦做任何事,否則windows極可能認為有必要重新整理!一般水平高些的從不整理碎片,過一段時間重新安裝一下作業系統 這對於機器效能的恢復可不是磁碟碎片整理能比的...

什麼是gpt磁碟為什麼需要gpt

樓上一看就是複製黏貼的。這麼說吧,要是你想uefi裝系統,那就必須gpt分割槽。或者你單塊硬碟大小大於2t,那也要gpt。其他情況用mbr分割槽就ok了 磁碟初始化時選mbr還是選gpt,有什麼區別 首先不論是mbr還是gpt,都是檔案系統的分割槽方式,只是表示檔案在硬碟上的儲存方式,這個都由作業系...