最近看ext4代码,注意到了 punch hole (打洞)功能,就是可以把文件中间的一部分内容释放掉,但是剩余部分的文件偏移不变。
于是我问马涛同学这个punch hole一般用在什么场合。
马涛:可以用在虚拟机上,比如你从虚拟机里删掉了一个大文件,虚拟机可以用punch hole在虚拟硬盘把这个文件占用的空间释放掉
我:有哪款虚拟机这样做?
马涛:这是文件系统提供给虚拟机的一个feature,虚拟机有了这个feature的支持就可以节省硬盘空间。比如host上装了多台虚拟机,每个虚拟机都通过punch hole的方式来删除自己虚拟的大文件,这样一段时间后,虽然各虚拟硬盘加起来空间很大,但是实际占用的空间就很小。应该有虚拟机是这样做的,这个我没注意。
我:除了虚拟化呢?还有别的应用场景吗?
马涛:嗯....云计算应该也又用的吧
我:虚拟化,云计算,这都是新概念,早期做这个punch hole是干啥用的,就是早期的应用有吗?
马涛:....早期就是因为有了truncate来去掉文件的尾巴,那么出于逻辑完整,就需要一个调用来去掉文件的头或者中间,于是就有了这个punch hole
我:喔
事后我想了想,如果一个大文件,用户决定了文件中间的一段内容以后不需要再用到了可以删除了,在没有punch hole支持的情况下,似乎只能先mmap,然后memove把中间的内容覆盖掉,然后truncate缩短文件内容。而如果有了punch hole的支持,只需一个系统调用没有内存移动的开销,非常高效,虽然文件用 ls 看起来还是那么大,但实际占用空间(用 du -sh 看)已经缩短了。
也许数据库,搜索引擎里的大文件可以用上,我猜。