Linux中國

如何解決伺服器存儲 inode 耗盡的問題

今天群里一朋友遇到這樣一個問題,明明硬碟只用了 30% 左右的空間,但是卻無法寫入文件。使用 df -iT 命令查看文件系統使用情況時,發現根目錄的 inode 使用率竟然是 100%。後來通過聊天得知,原來他的伺服器主要用於存儲 1KB 左右的小文件,這一下就破案了。

inode 主要用來記錄文件的屬性,及此文件的數據所在的塊編號。每一個文件會佔用一個 inode,因此如果都是小文件的話,那麼就會出現 inode 已經耗盡,但文件系統還有很大的空閑空間,從而無法寫入新文件。

如何獲得更多的 inode

其實在創建 ext4 文件系統時,我們可以使用 -T small 參數來獲得更多的 inode,從而優化對小文件的存儲。接下來我們通過一個示例來看看效果。

這是兩塊相同大小的硬碟:

root@debian:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0    1G  0 disk
└─sdb1   8:17   0 1023M  0 part
sdc      8:32   0    1G  0 disk
└─sdc1   8:33   0 1023M  0 part

首先使用默認參數給 /dev/sdb1 創建文件系統:

root@debian:~# /sbin/mkfs.ext4 /dev/sdb1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 261888 4k blocks and 65536 inodes
Filesystem UUID: 8935c902-df71-4808-b547-c85b6fd37a46
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

從輸出中可見,該文件系統有 261888 個 4KB 大小的塊和 65536 個 inode。

然後使用 -T 參數對 /dev/sdc1 創建文件系統:

root@debian:~# /sbin/mkfs.ext4 -T small /dev/sdc1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 1047552 1k blocks and 262144 inodes
Filesystem UUID: f521096d-a5a1-41c9-bbf7-e6102e74e87a
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409, 663553,
        1024001

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

從輸出中可見,該文件系統有 1047552 個 1KB 大小的塊和 262144 個 inode。

也可以通過以下方式對比兩個文件系統的 inode 數量:

root@debian:~# mkdir default small
root@debian:~# mount /dev/sdb1 default/
root@debian:~# mount /dev/sdc1 small/
root@debian:~# df -iT
Filesystem     Type      Inodes IUsed   IFree IUse% Mounted on
/dev/sdb1      ext4       65536    11   65525    1% /root/default
/dev/sdc1      ext4      262144    11  262133    1% /root/small

從以上示例中我們可以看出,在使用 -T small 參數後,inode 數量多了近 20 萬個!

注意: 這樣做也是有代價的。在使用默認參數創建 ext4 文件系統時,默認數據塊大小為 4KB,而使用 -T small 參數後,數據塊大小為 1KB。這就意味著我們存儲一個同樣大小的文件,使用 -T small 參數創建的文件系統存儲該數據時,佔用的數據塊更多,數據更分散,如果文件較大,會直接影響文件的讀取速度

mke2fsmkfs.ext4)的 -T 參數指定了如何使用該文件系統,以便 mke2fs 可以為該用途選擇最佳的文件系統參數,其支持的使用類型在配置文件 /etc/mke2fs.conf 中定義,可以使用逗號分隔指定一個或多個使用類型

inode 不足的解決方法

當你已有的文件系統上出現 inode 不足的問題時,除了備份數據、重建分區並恢復分區數據外,還有兩種臨時解決方案:

1、刪除文件大小為 0 的空文件,可以使用如下命令查找:

find PATH -name "*" -type f -size 0c 

注意: 使用 -size 參數時,不要用 -size 1k,這個表示佔用空間為 1KB,而不是文件大小為 1KB,應該使用 -size 1024c 才表示文件大小為 1KB。

2、可以定期對歷史小文件進行打包、歸檔,以減少文件數量。

作者簡介:一個喜歡瞎折騰的 IT 技術人員,懂得不多,但是喜歡和有共同興趣愛好的朋友交流、學習

(題圖:MJ/9a66155a-772e-41f1-b29d-c3d4161f7853)

via: http://www.yanjun.pro/?p=128 作者:老顏隨筆 編輯:wxy

本文由貢獻者投稿至 Linux 中國公開投稿計劃,採用 CC-BY-SA 協議 發布,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國