log里報:
1:M 13 Jan 2022 21:00:43.015 * Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
1:M 13 Jan 2022 21:00:52.137 # Fail to fsync the AOF file: Stale file handle
1:M 13 Jan 2022 21:12:24.529 # Error writing to the AOF file: Stale file handle
Stale file handle是一個文件系統的普遍問題,主要是linode變了,但外部沒變。相當於元信息沒了,但外部文件還在,成了野指針。
而特別在nfs里又是個普遍問題。
相關分析:
https://cloud.tencent.com/developer/article/1593914
這個問題通過百度搜索能得出一片的結果,但是其中的結果沒有幾個是有營養的。
使用google能搜到就比百度有用的多,但是也沒有個說是怎么怎么出來的。
因為中工作中遇到了這個問題,也花費了不少的時間去處理 這個問題。希望這篇分析和總結是有用個的。
1.問題描述
這個英文的雖然說的NFS,但是實際上不僅僅NFS系統會遇到這個問題。當然如果你的系統就是NFS的,那么你排查這個問題會簡單很多。本文不是針對NFS系統。
Stale NFS file handle具體是什么意思,為還沒有看到中文是怎么解釋的。英文的意思:文件是變得不可用了。當使用ls, stat,cat等等命令去查看文件的時候會發現無法看到文件的任何信息。
有個問題大家都很熟悉的,就是寫程序的時候經常會避免野指針的問題,這個問題與此類似,只是這個野指針是存在於磁盤上的。
2.復現該問題的方法
要重現這個問題不是一般般的簡單的,光靠運氣會搞死人的。下面給出一種為知道的重現方法:
假設文件系統是/dev/sda2,則可以進行如下操作:
debugfs -w /dev/sda2
這時候會進入到debugfs的命令行中,假設壞掉的文件是/dev/sda2中的file文件,那么使用
stat ./file 命令查看出文件對應的inode,假設是62345
然后使用命令 mi <62345>
修改該文件的Link count數為0
然后quit。
這時候ls去看/dev/sda2的file文件就會出現Stale NFS file handle的報錯了(如果不出現,重啟系統必定出現)。
3.問題分析
從重現方法就大概知道,是Link count計數不對導致的這個問題。這個報錯是系統保持來的。是的沒錯,就是文件的引用計數出現問題了。一般的,對linux系統來說,文件的引用計數為0表示文件被刪除了。這個時候它占用的inode節點要被回收,被它所在目錄要去除改文件的目錄項。(不清楚文件存儲方法的請自行查閱)。
然后,通過debugfs的修改,我們發現,目錄還是有這個文件的目錄項,但是由於文件的引用計數是0,文件系統認為改文件已經被刪除了,那么就意味着根據目錄項的該文件的記錄是找不到該文件的,即這個目錄項是一個野指針。
4.出現的原因
文件系統出問題的原因太復雜了,這里總結兩個大家認為不可能但是又十分可能的原因:
系統正在刪除文件的時候發生斷電,即文件的link count被標記為0,但是對應的目錄項還沒有來得及刪除;
5.解決方法
- 如果文件系統是ext2,那么你會高概率的遇到這個問題,請將系統升級為ext3.(請自行腦補ext2和ext3的對比)
- 使用fsck -y修復文件系統,並且確保系統中啟動的過程中會自行修復,這樣當系統發生這個問題時可以中啟動的時候就自行處理好,而不至於導致系統啟動中斷掉。
ps
從整個的排查過程來說,個人覺得這個報錯信息真的應該改改,有點南轅北轍的意思,如下的鏈接也在吐槽該問題:
