在前文《新建一個空檔案是否占用磁盤空間?占用多少》中我們了解到了一個空檔案的磁盤開銷,
今天我們再思考另外一個問題,假如我們給檔案里只寫入1個位元組,那么這個檔案實際的磁盤占用也是1個位元組嗎?
查看1個位元組的檔案
和前文一樣,先不談原理,直接動手操作,
# mkdir tempDir
# cd tempDir
# du -h
0 .
# touch test
# du -h
0 .
在一個目錄中創建了一個空的檔案以后,通過du命令看到的該檔案夾的占用空間并沒有發生變化,這倒是符合我們之前的認識,因為空檔案只占用inode,好,那讓我們修改檔案,添加一個字母
echo "a" > test
# du -h
4.0K .
保存后再次查看該目錄的空間占用,我們發現由原來的0增加到了4K,
所以說,檔案里的內容不論多小,哪怕是一個位元組,其實作業系統也會給你分配4K的,哦,當然了還得再算前文中說到的inode和檔案夾資料結構中存盤的檔案名等所用的空間,
所以,不要在你的系統里維護一大堆的碎檔案,檔案再小,占用磁盤其實一點都不少!
注意我的實驗環境是在ext檔案系統下進行的,如果是xfs可能表現會有些許出入,
繼續討論這個4K
再把linux源代碼檔案fs/ext2/ext2.h里關于inode的定義翻出來,我們找到結構體中定義的指向資料節點用的block陣列:
struct ext2_inode {
......
__le32 i_block[EXT2_N_BLOCKS]; # 指向存盤檔案資料的塊的陣列
......
當檔案沒有資料需要存盤的時候,這個陣列都是空值,而當我們寫入了1個位元組以后,檔案系統就需要申請block去存盤了,申請完后,指標放在這個陣列里,哪怕檔案內容只有一個位元組,仍然會分配一個整的Block,因為這是檔案系統的最小作業單位,那么這個block大小是多大呢,ext下可以通過dumpe2fs查看,
#dumpe2fs -h /dev/mapper/vgroot-lvroot
......
Block size: 4096
在我的機器上,一個Block是4KB,
檔案內容再大了怎么辦
不知道你留意沒,inode中定義的block陣列大小呢,只有EXT2_N_BLOCKS個,我們再查看一下這個常量的定義,發現它是15,相關內核中定義如下:
#define EXT2_NDIR_BLOCKS 12
#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
就按4K的block size來看,15個block只夠存的下15*4=60K的檔案, 這個檔案大小相信你一定不滿意,你存一個avi大片都得上G了,那Linux是怎么實作大檔案存盤的呢?嗯,其實上面宏的定義程序已經告訴你了,就是只有12個陣列直接存block指標,其余的用來做間接索引(EXT2_IND_BLOCK),二級間接索引(EXT2_DIND_BLOCK)和三級索引(EXT2_TIND_BLOCK),

這樣,一個檔案可以使用的空間就指數倍的擴展了, 檔案小的時候,都用直接索引,磁盤IO少,性能好,檔案大的時候,訪問一個block可能得先進行三次的IO,性能略慢,不過有OS層面的頁快取、目錄項快取的加持,也還好,
結論
檔案系統是按照塊來管理的,所以不管你的檔案多小,哪怕只有一個位元組,都會消耗掉整整一個塊,這個塊大小可以通過dumpe2fs等命令來查看,如果想改變這個塊大小怎么辦?對不起,只能重新格式化,

開發內功修煉之硬碟篇專輯:
- 1.磁盤開篇:扒開機械硬碟堅硬的外衣!
- 2.磁盤磁區也是隱含了技術技巧的
- 3.我們怎么解決機械硬碟既慢又容易壞的問題?
- 4.拆解固態硬碟結構
- 5.新建一個空檔案占用多少磁盤空間?
- 6.只有1個位元組的檔案實際占用多少磁盤空間
- 7.檔案過多時ls命令為什么會卡住?
- 8.理解格式化原理
- 9.read檔案一個位元組實際會發生多大的磁盤IO?
- 10.write檔案一個位元組后何時發起寫磁盤IO?
- 11.機械硬碟隨機IO慢的超乎你的想象
- 12.搭載固態硬碟的服務器究竟比搭機械硬碟快多少?
我的公眾號是「開發內功修煉」,在這里我不是單純介紹技術理論,也不只介紹實踐經驗,而是把理論與實踐結合起來,用實踐加深對理論的理解、用理論提高你的技術實踐能力,歡迎你來關注我的公眾號,也請分享給你的好友~~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/203577.html
標籤:PHP
上一篇:新建一個空檔案占用多少磁盤空間?
下一篇:檔案過多時ls命令為什么會卡住?
