把資料庫該乾的活交給OS可行嗎

qing_yun發表於2022-12-06

這兩天在思考前幾天一個朋友提到的一個問題,現在的OS越來越強大了,能不能把一些資料庫該乾的事情交給OS去做,這樣資料庫的核心可以大大的簡化。這個觀點讓我想起了十多年前Linux是否需要提供o_direct這個檔案IO選項給開發者的討論。當時Linus Torvalds說了那句十分著名的話—“In short, the whole "let's bypass the OS" notion is just fundamentally broken. It sounds simple, but it sounds simple only to an idiot who writes databases and doesn't even UNDERSTAND what an OS is meant to do”。他甚至認為繞過OS強大的VMM設計去處理IO是傻瓜才會乾的事情,因為Linux已經為資料庫類的應用提供了強大的能力。

實際上早期的資料庫也是十分依賴於作業系統的,我大學畢業後使用過的第一個資料庫RMS就是一個基於openVMS的記錄管理系統,其底層依賴於作業系統的基礎IPC能力構建。後來隨著資料庫變得越來越複雜,需要支援的底層OS平臺越來越多,資料庫產品逐漸把一些以前OS乾的事情由自己獨立來幹。2012年的一次測試,讓我對資料庫與OS融合後的能力有了深刻的體會。當時在一臺Oracle公司的T4-8上,伺服器+Solaris作業系統+Oracle 11g的組合跑出了驚人的高效能。不用做複雜的調優,僅僅裝好資料庫,簡單調整一下資料庫引數,就取得了那次測試最佳的成績。後來我和參加測試的老外聊了聊,他說在這個組合裡,Oracle的一些併發控制相關底層呼叫得到了全面最佳化,作業系統幫助Oracle的閂鎖與鎖操作的併發能力得到了極大的提升。

實際上開頭提的這個問題應該不是問題了,現在的Linux與90年代剛剛進入我們視野的時候已經不可同日而語了,那時候的Linux可以很好的支撐WEB應用,但是對資料庫的底層支援還比較弱。而現在Linux的能力已經得到了巨大的強化,無論是Redis,MongoDB還是ClickHose,這些新生代的資料庫產品無一例外的充分利用了作業系統底層的能力,從而簡化了很多傳統資料庫自己要做的複雜控制。外加在儲存引擎上使用了大量的開源技術,使得資料庫研發的門檻大大降低了。包括我們耳熟能詳的開源資料庫MySQL和Postgresql,它們在儲存引擎上也充分利用了作業系統的能力。充分利用OS FILE CACHE的能力來緩衝資料,從而提升IO效能,透過使用帶日誌的檔案系統來消除資料庫double write的開銷,這一切都是資料庫向OS能力借力的有效例證。

不過通用關係型資料庫面臨的場景十分複雜,在某些特殊的高負載場景下,OS的自動最佳化能力還是無法滿足資料庫的需求。2007年引發的關於o_direct的討論就是一個十分典型的例證。當時資料庫廠商需要自己來控制IO,而不是使用OS提供的能力。

在一個DBA的眼裡,Linus的言論似乎是有些武斷了,針對複雜的通用關係型資料庫來說,資料庫自己管理自己的緩衝,在有些時候比完全依賴於OS提供的檔案緩衝能力,要高效的多。資料庫有自己的一些更為複雜的判斷熱資料的方法,因此在shared buffer中合適AGEOUT頁面,清理哪些頁面,資料庫管理系統可能更清楚。

不過對於大多數業務應用來說,OS提供的FILE CACHE已經能夠很好的幫助我們提升效能了。在目前的Postgresql的官方文件中,還是建議shared buffer只使用20-30%,剩下的記憶體交給OS。有些PG使用者認為這個建議十分好,他們的資料庫按照這個建議設定後效能十分穩定。不過也有些使用者認為把實體記憶體儘可能交給shared buffer具有更好的效能。這是因為業務應用場景的複雜性,導致兩種策略可能在某些場景下會出現相反的效果。

對於一個資料庫應用系統來說,其最佳化是從上到下的。

對於一個複雜的應用系統來說,越往上的最佳化器效果就越好,只不過越往上的最佳化對於前期建設隊伍的能力要求也越高,前期的投入也越大。對於一些較小的,不太複雜的應用系統來說,只需要從下層做好最佳化就可以了,其實施成本也很低。而負載越高,越複雜的系統就越需要更上層的最佳化。對於有些系統來說,僅僅依賴作業系統提供的最佳化能力就不足夠了。就像是開手動擋的車和自動擋的車,在一般路況下,自動擋車就足夠用了,但是在一些特殊的戶外陡坡上,手動擋車可能可以勝任,自動擋車就完全不勝任了。因為自動化的處理能力還是有限的。

不過隨著作業系統的不斷髮展,其能力也越來越強,作業系統對資料庫的支撐能力也在不斷增強。有些以前需要依靠資料庫核心程式碼去最佳化的工作依然可以由作業系統來承擔。一些專用場景的資料庫產品會首先從中受益,有時候資料庫不用做升級,升級一下OS,資料庫效能自然就提升了。不過針對某種資料庫去定製與最佳化作業系統也是一種思路,在一些雲原生的資料庫或者公有云RDS上,可能更容易實現。

來自 “ 白鱔的洞穴 ”, 原文作者:白鱔;原文連結:https://mp.weixin.qq.com/s/EzCj5FaLFaeGa8apKQdypA,如有侵權,請聯絡管理員刪除。

相關文章