Linux伺服器重啟(有可能是異常斷電)導致用戶數據損壞的原因是什麼?
伺服器環境:
學校的伺服器,一個20幾個node的cluster,共用同一個RAID。操作系統是CentOS。/home 在RAID上。在node之間切換訪問的是相同的home每個node都有獨立的 /tmp。
其他的文件夾具體位置不詳。問題描述:一個月前,我在伺服器上非root許可權安裝了(裝在$HOME下的)Python2.7,Szh,oh-my-zsh,和一些vim的插件。配置完畢,使用正常。
半個月前,伺服器重啟過一次,原因不詳 who -b 查看啟動時間是發現重啟了,聽說好像是學校停了2個小時的電。我覺得服務應該有備用電源什麼的,但是學校的伺服器不好說,而且那一段時間學校確實停電了。重啟之後我登陸伺服器,zsh,python還有vim的那些插件全掛了。這些程序的文件都在,但是就是無法啟動,應該是破損了。重新安裝之後就可以使用。哦,我之前下載的zsh安裝程序的壓縮包裝完之後並沒有刪除,本來想直接使用重裝的,但是發現那個壓縮包不能解壓縮了,所以才想到是之前安裝的程序文件應該也一同破損了。上周這破伺服器又重啟了一次,這次原因就更不詳了,這也是查看啟動時間才知道的。這次還好,僅僅是python和oh-my-zsh的theme破損了。
這並不是個例,我有很多同學近期安裝的程序也都在這兩次事件中掛了,有的是文件直接消失了。我一開始以為是重啟後還原數據了,但是我的那些文件並沒有消失,只是損壞了。值得一提的是,我半年前在伺服器上安裝的Java,Scala等程序都沒有受到影響。重啟的時候我並沒有什麼程序在執行,也就不存在正在修改的時候異常中斷導致文件破損的問題。難道用戶文件都在緩存裡面?這不可能啊,緩存兩周的嗎?還是設備老突然斷電導致磁碟壞道了?先不說伺服器會不會喪失的只是使用了RAID 0,就算是,也不能兩次都破壞了近期安裝的文件吧。還是管理員配置了什麼奇葩的腳本,沒次重啟都隨機破壞近期的文件(這怎麼像是病毒呢)?我實在是想不明白是什麼原因,請問各位大神有沒有什麼看法?
更新:感謝 @js li ,之前回答的時候忘了其實 flusher 是可以被定期喚醒,然後把 expired dirty pages 寫掉。這兩個 timeout 都是可以設置的,之前工作的地方由於各種原因設置得都很長,所以留下了 dirty pages 可以留很久的印象。其實這兩個 timeout 默認都是分鐘級別的,所以如果系統 load 不高、臟頁不多的話,應該一小時內肯定會被 writeback 。
看描述損壞的文件主要是在 HOME 下面。如果題主在安裝了 oh-my-zsh 以及各種 vim 插件後伺服器並沒有重啟過,然後一段時間後斷電了,這些都是解釋得通的。
不要驚訝於「竟然緩存兩周」。 Linux 的 IO 緩存寫入機制和時間並沒有直接關係。簡單來說可以理解為緩存是某個固定大小或固定比例的內存,在緩存使用比例高於某個閾值時開始在後台 flush 寫入磁碟,如果繼續高於另一個警告閾值,就會阻塞接下來的 IO 操作來 flush 。所以如果你的這台伺服器新寫入的數據不多、或者內存極大(間接導致緩存大),那麼兩周後當時在 HOME 里下載、安裝的那些東西其實並沒有 flush 也是很有可能的。
RAID 0 其實還進一步增加了複雜性,要看你是什麼 RAID 、怎樣配置。有些硬體 RAID 卡即使是 RAID 0 下也是會使用板載內存來緩存 IO 的,根據緩存策略的不同,很有可能沒有及時 writeback 。(雖然大部分伺服器 RAID 卡默認在沒有後備電源時不會使用這麼激進的緩存策略。)
怎麼解決呢?如果伺服器上 IO 不高,你可以在安裝好之後來一發 sync 命令,強制 flush 到磁碟。不過小心如果在高 IO 、高緩存的伺服器上 sync 時很可能會假死。
Linux disk cache 或者 RAID cache.
一個是系統緩存,另一個是RAID緩存。如果RAID的寫策略是write back並且BBU(備用電源)掛了的話,一旦斷電所有在RAID卡緩存中的數據就會丟失。
北二的伺服器?
環境變數……export PATH=$PATH:~/bin
推薦閱讀:
※把「robust」翻譯為「擼棒」最早起源於哪裡?
※計算機數值模擬方法的局限?
※你對計算機科學與技術(CS)專業的認識是怎樣的?
※非計算機專業,有一點計算機基礎需要一個學習路線求推薦?