优化 Ext4 分区格式化后占用空间(通过降低inode数来节省磁盘空间)
2014-12-09 22:48
239 查看
希捷,卧槽泥马!买了不到一年的希捷 1T 硬盘最近两个月一直卡死,症状是访问时 CPU 飙升,文件管理器窗口假死,各种闹心事我已经在 Twitter 上喷过了,非本文重点还是少说了。
数据是宝贵的,为了避免我多年的收藏付诸东流,我入一个西部数据 2T 硬盘,趁希捷那货还能读取赶紧把数据复制西数这个过来。
这个 2T 硬盘的分区方案就是一个 Ext4 分区,当数据仓库盘用,于是我就用 GParted 格式化了,结果这一个过程花了差不多 8 分多钟,而且格式化后就已经使用了差不多 30G,太坑爹了吧。
我第一时间想到是 保留空间,但经过我大胆假设小心求证后,得出结论,这个保留空间依然算在未使用里面的。保留空间意思是给 root 账户保留的空间,比如保留空间是 100M,当一个分区用得差不多后,剩下 100M 了,那么普通用户就无法继续建立新文件了,提示空间不足了。换到 root 账户后,就能继续使用这 100M。而格式化后这 30G,可是实打实的已经被使用掉。
可以知道这已使用空间是分配给索引区的,就是 inode(不清楚 inode 是什么 Google 去)和日志以及各种 Ext4 需要记录的信息。不过 30G,也太巨了吧,格式化一次要 8 分钟,感觉很不好。于是我就去研究一下原理,算不算浪费和有没有得优化空间。
在 STFW 和 RTFM,格式化了 n 次后,现在我格式化这个 2T 只需要半分钟,使用空间只占了 700 多 M,感觉良好。
好了,那么是什么原因导致格式化这个 2T 要 8 分钟,并一下用掉 30G 呢?答案是 inode 数量。在 Linux 的文件系统中,一个文件对应一个 inode。一个 inode 大小现在默认值是 256 字节。当然 256 字节是记录不了大文件所有数据地址的,于是有间接块,间接块就是……呃,总之就是
有多少个 inode 就能存多少个文件,无论文件有多大,而一个 inode 要 256 字节。
而 inode 数量是由格式化程序(这里就是 mkfs.ext4)根据自动算出来的。默认是 16K 一个 inode也就是说,就算你在这个分区全是 16K 小的文件,都有足够数量的 inode 使用。
但问题是,对于我这种拿来当仓库用的分区,不可能全是 16K 的文件呀,高清电影和光盘映像都是上 G 的东西了。上面说过,一个文件要 inode,就算这个分区都塞满了,肯定还有很多 inode 没被使用,明显是浪费掉了。
扯了这么多还是在个实际例子吧,就拿我这个 2T 新硬盘为例。格式化时会输出一些信息
看到有 122101760 个 inodes 吧,一个 inode 占256字节,那么换算成 M 单位是:
警告!警告!严重警告! 上面的命令怎么多了个
但是运行 mkfs.ext4 需要 root 权限,漏了
找
man 一下 mkfs.ext4,发现有两个参数可以制定 inode 数量
默认 16k 一个 inode 相当于
把这个数字加大了就行了,最好是 1024 的倍数。比如 1M,即 1048576 字节。
其实在 /etc/mke2fs.conf 定义了一些默认值,可以用
还有一个 largefile4,4M 一个 inode。不过比 largefile 才少了 300M,对于 2T 来说小意思了,没必要省,万一小文件过多 inode 不够呢?
于是
还有 1907840 个 inode,可以保存 1907840 个文件,真够了,估计也难用满。
格式化也只需半分钟,占用 700M 左右,因为还有日志其它什么的,过度优化没必要了,控制在 1G 内我觉得够了。
数据是宝贵的,为了避免我多年的收藏付诸东流,我入一个西部数据 2T 硬盘,趁希捷那货还能读取赶紧把数据复制西数这个过来。
这个 2T 硬盘的分区方案就是一个 Ext4 分区,当数据仓库盘用,于是我就用 GParted 格式化了,结果这一个过程花了差不多 8 分多钟,而且格式化后就已经使用了差不多 30G,太坑爹了吧。
我第一时间想到是 保留空间,但经过我大胆假设小心求证后,得出结论,这个保留空间依然算在未使用里面的。保留空间意思是给 root 账户保留的空间,比如保留空间是 100M,当一个分区用得差不多后,剩下 100M 了,那么普通用户就无法继续建立新文件了,提示空间不足了。换到 root 账户后,就能继续使用这 100M。而格式化后这 30G,可是实打实的已经被使用掉。
可以知道这已使用空间是分配给索引区的,就是 inode(不清楚 inode 是什么 Google 去)和日志以及各种 Ext4 需要记录的信息。不过 30G,也太巨了吧,格式化一次要 8 分钟,感觉很不好。于是我就去研究一下原理,算不算浪费和有没有得优化空间。
在 STFW 和 RTFM,格式化了 n 次后,现在我格式化这个 2T 只需要半分钟,使用空间只占了 700 多 M,感觉良好。
好了,那么是什么原因导致格式化这个 2T 要 8 分钟,并一下用掉 30G 呢?答案是 inode 数量。在 Linux 的文件系统中,一个文件对应一个 inode。一个 inode 大小现在默认值是 256 字节。当然 256 字节是记录不了大文件所有数据地址的,于是有间接块,间接块就是……呃,总之就是
有多少个 inode 就能存多少个文件,无论文件有多大,而一个 inode 要 256 字节。
而 inode 数量是由格式化程序(这里就是 mkfs.ext4)根据自动算出来的。默认是 16K 一个 inode也就是说,就算你在这个分区全是 16K 小的文件,都有足够数量的 inode 使用。
但问题是,对于我这种拿来当仓库用的分区,不可能全是 16K 的文件呀,高清电影和光盘映像都是上 G 的东西了。上面说过,一个文件要 inode,就算这个分区都塞满了,肯定还有很多 inode 没被使用,明显是浪费掉了。
扯了这么多还是在个实际例子吧,就拿我这个 2T 新硬盘为例。格式化时会输出一些信息
[code]$ sudo mkfs.ext4 -n /dev/sdc1 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=1 blocks, Stripe width=0 blocks 122101760 inodes, 488378368 blocks 24418918 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=4294967296 14905 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848
看到有 122101760 个 inodes 吧,一个 inode 占256字节,那么换算成 M 单位是:
(122101760 * 256) / (1024 ** 20 = 29810M,差不多 30G 啊!
警告!警告!严重警告! 上面的命令怎么多了个
-n参数?
-n参数表示模拟运行,但不格式化,这样可以看不同的格式化参数会有什么效果。如果没有这个参数,那就真的格式化了。所以对有数据的分区测试时千万要记得加上
-n参数!下面我都带上这个参数。
但是运行 mkfs.ext4 需要 root 权限,漏了
-n太危险,可以用 tune2fs 查看文件系统各种信息。
[code]sudo tune2fs -l /dev/sdc1
找
Inode count一行。
man 一下 mkfs.ext4,发现有两个参数可以制定 inode 数量
-i bytes-per-inode:多少个字节一个 inode
-N number-of-inodes:直接制定 inode 数量
默认 16k 一个 inode 相当于
[code]sudo mkfs.ext4 -i 16384 -n /dev/sdc
把这个数字加大了就行了,最好是 1024 的倍数。比如 1M,即 1048576 字节。
[code]sudo mkfs.ext4 -i 1048576 -n /dev/sdc
其实在 /etc/mke2fs.conf 定义了一些默认值,可以用
-T来指定类型,比如 largefile 类型就是 1M 一个 inode,上一个命令相当于
[code]sudo mkfs.ext4 -T largefile -n /dev/sdc
还有一个 largefile4,4M 一个 inode。不过比 largefile 才少了 300M,对于 2T 来说小意思了,没必要省,万一小文件过多 inode 不够呢?
于是
[code]$ sudo mkfs.ext4 -T largefile -n /dev/sdc1 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=1 blocks, Stripe width=0 blocks 1907840 inodes, 488378368 blocks 24418918 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=4294967296 14905 block groups 32768 blocks per group, 32768 fragments per group 128 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848
还有 1907840 个 inode,可以保存 1907840 个文件,真够了,估计也难用满。
(1907840 * 256) / (1024 ** 2) = 465M, 省出
29810 - 465 = 29345M,29G!十来部高清了。
格式化也只需半分钟,占用 700M 左右,因为还有日志其它什么的,过度优化没必要了,控制在 1G 内我觉得够了。
相关文章推荐
- 优化 Ext4 分区格式化后占用空间(通过降低inode数来节省磁盘空间)
- Linux学习笔记_系统分区信息,磁盘空间及inode占用查看(df,fdisk)
- 解决linux系统下分区文件占用总空间比实际分区总容量要小却提示磁盘空间已满的问题
- 通过优化网页页面降低对内存及CPU的占用
- win7通过快捷方式安装字体无需占用c盘空间
- Linux下通过软链接转移mysql目录,解决分区空间不足(转)
- linux磁盘空间不足 和 挂载新硬盘(含磁盘格式化、分区)方法
- 重新启动postgre报错时,解决方案 ( 由备份文件占用空间太大造成 ) (linux 命令 df -h 查看磁盘空间)
- 通过优化CSS代码 减小对系统资源的占用
- RHEL分区与格式化、挂载以及文件系统优化
- 通过View 的android:layout_weight属性占用多余的空间
- nios中优化代码和减少程序占用内存空间的设置方法
- 搜狗输入法通过BUG流程优化,降低BUG修复分歧
- Linux 根分区空间不足,mysql数据占用过大
- Win7系统关闭系统分区还原功能节省磁盘空间的方法教程图解
- Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化
- [华赛面试题] C语言 通过sizeof计算变量占用的存储空间
- 通过文件方式增加swap空间,不用再重新分区
- 通过uuid格式化挂载分区
- 通过DBA_EXTENTS查看占用空间的表--释放表空间