一, 问题来源
半夜钉钉接到告警, 某台机器的磁盘使用率少于 20%, 于是迷糊中爬起来, 咔咔咔 find / -size +1G, 咔咔咔, 把几个只有 4-5G 的日志文件 echo 空值了一下, 然后吓蒙了, 刚刚使用的还有 160G, 怎么把两个日志文件一清空, 就只使用了 25G 了, 是不是刚刚没清醒把数据文件删了, 但是仔细仔细的看了看执行的命令, 没有啊..., 我在梦游吗?
二, 出现的问题
然后就发现了另外一个神奇的现象了, 是有魔法吗? 在这个 / data 目录下的一个文件查看有 60G, 但是为什么使用 df -h 查看的时候 Used 才 25G, 为什么文件使用的大小还大于 Used......
- [root@ip-XXXXXXXX data]# ls -lh test.dat
- -rw------- 1 root root 60G Sep 19 07:22 test.dat
- [root@ip-XXXXXXXX data]# du -sh test.dat
- 4.4G test.dat
三, 排查过程
一点多了, 既然已经把告警解决了, 保留现场具体为什么明天再看吧, 皮肤要紧, 虽然睡得再多皮肤还是不太好. 睡觉不是个好东西, 睡完起来所有的梦想都忘了........, 屁颠屁颠跑到公司, 吃了个早餐, 蒽~~~~,open BaiDu,open Google,Input Why ...., 然而一上午过去了, 咔咔咔, 吃中餐, 10 点吃早餐, 12 点吃中餐~~~, 吃饭过程中带着点罪恶感, 肚肚上的肉肉. 睡完午觉起来, 继续....., 终于有一点点头绪了, 在某个文章里看到了 Sparse file 这个词, 然后使用 du 查看的时候果然...
- [root@ip-172-30-38-68 data]# du -h --apparent-size test.dat
- 60G test.dat
四, Sparse file
既然找到问题了, 就得好好看看这是个啥东西, 看了之后第一反应就是这个文件预分配了 60G, 但实际上只使用了 4.4G..., 蒽~~, 就这么个意思......
1, 定义
什么是 Sparse files?Sparse files 是一个分配了大小但实际上没有填充的文件, 如上面的案例中, 分配了 60G, 实际上只用了 4.4G. 可以看一下下面这两张图
2, 其他使用场景
MySQL,Oracle, 虚拟机等
虚拟机: 在我们平时在自己电脑上创建虚拟机时, 需要指定磁盘容量大小, 这里的最大磁盘大小就是 Sparse file, 指定一个最大使用容量就可以了 (一般为 20G). 指定后, 如果虚拟机只使用了 1G, 那么使用物理磁盘也是 1G, 而不是 20G 都使用了; 并不是我原先的以为分配了 20G 给虚拟机, 这 20G 物理磁盘就只能虚拟机用, 并不是的.
3, 创建命令
dd of=sparse-file bs=7M seek=1120 count=0 # 相当于创建一个 7G 的空文件, 不占磁盘上的存储数据
或者
truncate -s 7G lile # 相当于创建一个 7G 的空文件, 不占磁盘上的存储数据
4, 测试
当我在 / run 目录下创建一个 7G 的 sparse file 时, 磁盘的存储空间是否改变, 是否占用了磁盘存储空间?
- # 可以看到 / run 目录下是 7.7G
- [root@master run]# df -h
- Filesystem Size Used Avail Use% Mounted on
- /dev/nvme0n1p2 200G 6.0G 195G 3% /
- devtmpfs 7.7G 0 7.7G 0% /dev
- tmpfs 7.7G 0 7.7G 0% /dev/shm
- tmpfs 7.7G 428K 7.7G 1% /run
- tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup
- tmpfs 1.6G 0 1.6G 0% /run/user/1000
- # 创建一个 7G 的 sparse file
- [root@master run]# truncate -s 7G lile
- [root@master run]# ls -lh lile
- -rw-r--r-- 1 root root 7.0G Sep 19 08:46 lile
- # lile 这个文件只是一个空的文件, 不占存储空间
- [root@master run]# df -h
- Filesystem Size Used Avail Use% Mounted on
- /dev/nvme0n1p2 200G 6.0G 195G 3% /
- devtmpfs 7.7G 0 7.7G 0% /dev
- tmpfs 7.7G 0 7.7G 0% /dev/shm
- tmpfs 7.7G 428K 7.7G 1% /run
- tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup
- tmpfs 1.6G 0 1.6G 0% /run/user/1000
- # 使用 dd 创建一个大小为 7G 的普通文件
- [root@master run]# dd if=/dev/zero of=output bs=1G count=7
- 7+0 records in
- 7+0 records out
- 7516192768 bytes (7.5 GB) copied, 3.5524 s, 2.1 GB/s
- # 可以看到是成功的, 这就说明 sparse 文件预分配的大小不影响磁盘存储空间, 不影响其他文件使用存储空间
- [root@master run]# df -h
- Filesystem Size Used Avail Use% Mounted on
- /dev/nvme0n1p2 200G 6.0G 195G 3% /
- devtmpfs 7.7G 0 7.7G 0% /dev
- tmpfs 7.7G 0 7.7G 0% /dev/shm
- tmpfs 7.7G 7.1G 704M 92% /run
- tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup
- tmpfs 1.6G 0 1.6G 0% /run/user/1000
5, 总结及注意
1)Sparse files 并不占用磁盘存储空间
2) 平时我们使用 ls -lh 查看文件大小并不一定准确
3)ls 命令和 du 命令在一定程度上可以这样表示
五, 其他
1, 本想看一下跟 sparse file 相关的 unix 系统方面的, 但是感觉自己知识点不太足, 有点难度....
2, 遇到问题一定要深究, 说来惭愧, 做运维 3 年之久了, 还是第一次听说 sparse file...
3, 自己买的那些 Linux 系统书, 是时候搬出来了
来源: https://www.cnblogs.com/lemon-le/p/11551367.html