最近因特殊場(chǎng)景,需要往磁盤(pán)上寫(xiě)入大量小文件,然而在操作過(guò)程中磁盤(pán)空間未滿但是卻提示無(wú)法寫(xiě)入……
錯(cuò)誤分析
在本次操作過(guò)程,需要往磁盤(pán)上寫(xiě)入大概 150w 個(gè)小文件,文件大小約為 1~100kb,大概預(yù)估了一下需要 50g 的磁盤(pán)空間。當(dāng)操作到一半時(shí),磁盤(pán)報(bào)錯(cuò):無(wú)法寫(xiě)入!
通過(guò)df -h查看磁盤(pán),發(fā)現(xiàn)還有剩余空間;通過(guò) du -i 查看磁盤(pán),發(fā)現(xiàn) inode 已經(jīng)使用了 100%;繼續(xù)觀察磁盤(pán)文件系統(tǒng):
dumpe2fs -h /dev/vdc1 這里列出了幾個(gè)比較關(guān)鍵的數(shù)據(jù):
inode count: 3932160 block count: 15728384 block size: 4096 inode size: 256 inodes per group: 8192 inode blocks per group: 512其中,
每個(gè) inode 大小為 256byte,block 大小為 4k byte;根據(jù) block count 和 inode count,我們也可以算出 16k bytes-per-inode(15728384*4096/3932160);也就是文件系統(tǒng)在創(chuàng)建的時(shí)候每16k空間自動(dòng)劃分一個(gè)inode,而我們需要寫(xiě)入大量小文件,雖然磁盤(pán)空間(block)還有剩余,但是 inode 已經(jīng)分配完了。
磁盤(pán)規(guī)劃
因此針對(duì)上面的情況,我們需要?jiǎng)澐指嗟?inode 用于記錄文件。通過(guò)查看文檔:
man mkfs.ext4 一般情況下,?block-size?和?inode-size?我們都不需要去更改;而?number-of-inodes?則應(yīng)該由?bytes-per-inode?自動(dòng)計(jì)算而出,也不應(yīng)該手動(dòng)指定。
因此,我們重新格式化磁盤(pán):
mkfs.ext4 -i 8192 /dev/vdc1 查看磁盤(pán)文件系統(tǒng):
dumpe2fs -h /dev/vdc1inode count: 7864320 block count: 15728384 block size: 4096 inode size: 256 inodes per group: 16384 inode blocks per group: 1024可以看到,inode整體數(shù)量以及在每個(gè)group的數(shù)量都翻了一倍。雖然重新劃分更多 inode 占用了磁盤(pán)空間,不過(guò)這才更符合我們的實(shí)際使用需求。
此外,bytes-per-inode在文件系統(tǒng)創(chuàng)建之后則無(wú)法修改,因此我們需要在使用前格式化的時(shí)候就明確下來(lái),避免導(dǎo)致后期數(shù)據(jù)遷移等麻煩。