免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2543 | 回复: 7
打印 上一主题 下一主题

[服务应用] logrotate copytruncate选项如何防止文件变成稀疏文件? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-24 14:31 |只看该作者 |倒序浏览
请教一下copytruncate把日志变成稀疏文件怎么办?

有一些日志文件被程序占用,发现即使用echo -n > logfile这样的方式,ls看到的大小依然是原大小,但是du看到容量已经变0了。

这种文件会带来很多问题,比如vim和cat均无法打开,某些程序读取这样的文件会导致内存溢出等等。

而copytruncate似乎也是用的这种方式截断日志,如果程序没有reload方案的话,应该怎样避免产生稀疏文件呢?

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
2 [报告]
发表于 2015-04-24 17:25 |只看该作者
ls看到的大小依然是原大小,但是du看到容量已经变0了
怎麽可能呢?

ll  set.txt
-rw-r--r--. 1 root root 2759 2月   7 23:14 set.txt

du -sh set.txt
4.0K        set.txt

论坛徽章:
0
3 [报告]
发表于 2015-04-25 22:05 |只看该作者
回复 2# lyhabc


   

会的,对于某些正在打开写入的日志文件,如果不停掉写入程序的话,的确有可能会变稀疏文件,这个我是做过测试的。

比如做这样一个测试

开一个终端,执行ping 127.0.0.1 > ping.log

再开一个终端,执行 > ping.log
结果如下:

~$ ll ping.log
-rw-rw-r-- 1 ok988 ok988 5028  4月 25 22:00 ping.log
~$ > ping.log
~$ ll ping.log
-rw-rw-r-- 1 ok988 ok988 5434  4月 25 22:00 ping.log
~$ du -sh ping.log
16K        ping.log

可以看到在执行> ping.log之后,ls看到的容量并没有减少,实际du看到的已经减少了(文件太小,du显示的容量反而比实际的大)

用hexdump可以看到这样的信息:

~$ hexdump -C ping.log
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000014c0  00 00 00 00 00 00 36 34  20 62 79 74 65 73 20 66  |......64 bytes f|
000014d0  72 6f 6d 20 31 32 37 2e  30 2e 30 2e 31 3a 20 69  |rom 127.0.0.1: i|
000014e0  63 6d 70 5f 72 65 71 3d  39 32 20 74 74 6c 3d 36  |cmp_req=92 ttl=6|
000014f0  34 20 74 69 6d 65 3d 30  2e 30 33 37 20 6d 73 0a  |4 time=0.037 ms.|
00001500  36 34 20 62 79 74 65 73  20 66 72 6f 6d 20 31 32  |64 bytes from 12|
00001510  37 2e 30 2e 30 2e 31 3a  20 69 63 6d 70 5f 72 65  |7.0.0.1: icmp_re|
00001520  71 3d 39 33 20 74 74 6c  3d 36 34 20 74 69 6d 65  |q=93 ttl=64 time|
00001530  3d 30 2e 30 34 35 20 6d  73 0a 36 34 20 62 79 74  |=0.045 ms.64 byt|
00001540  65 73 20 66 72 6f 6d 20  31 32 37 2e 30 2e 30 2e  |es from 127.0.0.|
00001550  31 3a 20 69 63 6d 70 5f  72 65 71 3d 39 34 20 74  |1: icmp_req=94 t|
……
后面略

证明已经变成稀疏文件了,跳过的字节部分被显示为*,跳过的字节全部用\x00填充了。相当于dd seek的效果。猜测文件写入时指针并没有重置,继续接着上次写入的地方继续写入,结果就是跳过了之前写过的字节,导致变成了空洞,形成了稀疏文件。

这种稀疏文件会带来性能问题,比如2G的日志文件如果一下子变成了稀疏文件,用vim打开会巨慢无比,因为跳过的\x00这些字节在vim显示就是一行@^文本,相当于一行2G的文本,打开速度巨慢,跳行也会受到影响。用java打开这样的文本甚至还会造成OOM,一行实在是太大了。

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
4 [报告]
发表于 2015-04-26 12:50 |只看该作者
du显示的容量当然比实际的大,因为你用的参数是-sh,如果你用-sb 就不会了
du -sb  1.txt
以字节的方式显示文件或目录大小

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
5 [报告]
发表于 2015-04-26 14:02 |只看该作者
ls和du读取的元数据不一样
ls读取的是 目录文件的信息
du直接读取文件的inode

2G的日志文件如果一下子变成了稀疏文件,用vim打开会巨慢无比,因为跳过的\x00这些字节在vim显示就是一行@^文本,相当于一行2G的文本,打开速度巨慢,跳行也会受到影响。用java打开这样的文本甚至还会造成OOM,一行实在是太大了。
变成稀疏文件之后,因为这些空洞实际上也是有数据的,只是这些数据全是0,所以打开这麽大的一个文本文件当然会很慢甚至OOM

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
6 [报告]
发表于 2015-04-26 14:04 |只看该作者
我觉得你的程序还是reload吧,这个文件系统的机制我们也不能干预太多

论坛徽章:
0
7 [报告]
发表于 2015-04-26 14:33 |只看该作者
晓得。。。、、、

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
8 [报告]
发表于 2015-04-27 14:40 |只看该作者
建议从应用的角度去解决问题
比如Apache可以用graceful重启
比如Nginx可以发送USR1信号
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP