优化文件缓冲区配置,提升日志写入效率

更新:10-28 民间故事 我要投稿 纠错 投诉

其实优化文件缓冲区配置,提升日志写入效率的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享优化文件缓冲区配置,提升日志写入效率的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

*测试1.c

* gcc test1.c -o test1

*/

#include#include#include#define BUF_SIZE 40960

#defineLOOP_CNT 1000000

int main()

{

整数i=0;

struct timeval 开始、结束; //计时结构

浮动时间使用; //耗时,单位为s

字符test_fmt[4108];

for(i=0; i 4108; i++){

test_fmt[i]="A";

} //总共4108 字节。

printf("循环%d条,总数据量%ld:n", LOOP_CNT, (long)LOOP_CNT* 4108);

文件*pFile;

struct stat sysbuf;

stat("1.txt", sysbuf);

printf("系统默认文件缓冲区大小=%d 字节,总共%d 个块n", (int)sysbuf.st_blksize, (int)sysbuf.st_blocks);

pFile=fopen("1.txt","w");

gettimeofday(开始,NULL); //开始计时

for (i=0; i LOOP_CNT; i++){

fprintf(pFile, test_fmt, i); //128 As 每行,总共4096 As,再加上末尾不到10 个字节的i 和换行符。

}

fclose(pFile);

gettimeofday(结束,NULL); //结束定时器

//计算时间

timeuse=1000000*(end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;

时间使用/=1000000;

printf("默认缓冲区写入文件,占用:%fn", timeuse);

返回0;

}

/**

*测试2.c

* gcc test2.c -o test2

*/

#include#include#include#define BUF_SIZE 40960

#defineLOOP_CNT 1000000

int main()

{

整数i=0;

struct timeval 开始、结束; //计时结构

浮动时间使用; //耗时,单位为s

字符test_fmt[4108];

for(i=0; i 4108; i++){

test_fmt[i]="A";

} //总共4108 字节。

printf("循环%d条,总数据量%ld:n", LOOP_CNT, (long)LOOP_CNT* 4108);

文件*pFile1;

pFile1=fopen("2.txt","w");

字符buf[BUF_SIZE];

setvbuf(pFile1, buf, _IOFBF, BUF_SIZE);

printf("自定义缓冲区=%d 字节n", BUF_SIZE);

gettimeofday(开始,NULL); //开始计时

for (i=0; i LOOP_CNT; i++){

fprintf(pFile1, test_fmt, i);

}

fclose(pFile1);

gettimeofday(结束,NULL); //结束定时器

//计算时间

timeuse=1000000*(end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;

时间使用/=1000000;

printf("自定义写入文件的缓冲区,时间:%fn", timeuse);

返回0;

在5400转硬盘的虚拟机上,分别编译运行并查看结果,其中st_blocks代表文件使用了多少个块。

我在测试之初就犯了一个严重的错误,就是把两个编译好的程序一起运行,或者两次运行的间隔时间不长。后来通过在Windows资源管理器中查看实时磁盘IO,发现虽然写1.txt的程序已经退出,但是磁盘还在写,说明内核正在写磁盘。这时我启动另一个测试程序写入2.txt,来测试1.txt的效果。我应该等到1.txt完全写入并且磁盘IO不再进行时才开始对2.txt的操作。

有10,000个循环,总数据量为41,080,000:

系统默认文件缓冲区大小=4096 字节,总共802344 个块

在默认缓冲区中写入文件需要:0.468300

有10,000个循环,总数据量为41,080,000:

自定义缓冲区=40960 字节

在自定义缓冲区中写入文件需要:0.155844

有100,000个循环,总数据量为410,800,000:

系统默认文件缓冲区大小=4096 字节,总共8023438 个块

在默认缓冲区中写入文件需要:4.686463

有100,000个循环,总数据量为410,800,000:

自定义缓冲区=40960 字节

在自定义缓冲区中写入文件需要:1.543402 秒

有1,000,000个循环,总数据量为4108,000,000:

系统默认文件缓冲区大小=4096 字节,总共2642816 个块

在默认缓冲区中写入文件需要:47.181843

有1,000,000个循环,总数据量为4108,000,000:

自定义缓冲区=40960 字节

在自定义缓冲区中写入文件需要:28.394735。之前写入100000条,速度相差2倍以上。

当写入次数达到1,000,000时,两者的时间差缩小到1倍以内,此时的日志文件为4.16G。如果进一步扩大测试,内核的IO队列可能不够用。

我检查了Windows下虚拟机的写入速率,发现自定义缓存方式还是比较快的。下面是峰值速率的截图。

1.使用系统默认缓存

在这里写下图片描述

高达74M/秒

2.自定义缓存峰值

在这里写下图片描述

高达115M/s

从每次测试的结果来看,自定义缓冲区后,向自定义缓冲区写入相同的字节内容显然需要比系统默认的两倍多的时间。当然,这是一个测试。实际项目中可以根据情况调整缓冲区大小。

然而,这样做的缺点也是显而易见的。如果断电,你就蒙蔽了,大量的缓存还没有写入磁盘!

调等缓冲区

当然我们还需要测试一下,将其设置为系统默认的4096,这是页面大小的单位。

有1,000,000个循环,总数据量为4108,000,000:

系统默认文件缓冲区大小=4096 字节,总共79633800 个块

在默认缓冲区中写入文件需要:48.648003

有1,000,000个循环,总数据量为4108,000,000:

自定义缓冲区=4096 字节

自定义缓冲区写一个文件的时间是:49.252640,差不多,多了1秒,哈哈。

调小缓冲区

再看一下,减少缓冲区的结果设置为1024字节。

有1,000,000个循环,总数据量为4108,000,000:

系统默认文件缓冲区大小=4096 字节,总共8023438 个块

在默认缓冲区中写入文件需要:49.945450

有1,000,000个循环,总数据量为4108,000,000:

自定义缓冲区=1024 字节

在自定义缓冲区中写入文件需要:102.239960。看到这次缓冲区减少了,显然需要更多的时间,多了一倍的时间。

思考

FILE 结构本身有一个缓冲区。内核在操作IO的时候也会有一个缓冲区。内核将缓冲区写入磁盘时,并不是直接写入,而是放入自己的IO队列中等待写入。增加文件缓冲区只是增加用户模式缓冲区,但内核模式缓冲区不会改变。因此,当用户模式缓冲区超过4096页的大小时,就会从用户地址空间复制到内核地址。当空间可用时,应该将几个页分成几个页,分别添加到内核IO队列中,准备写入磁盘。

创建于2014-03-04深圳腾讯,更新于2016-07-06杭州。

用户评论

弃我者亡

原来记录日志会影响系统速度!

    有7位网友表示赞同!

雁過藍天

不知道调整缓冲区大小会有什么效果,会不会太复杂?

    有19位网友表示赞同!

呆檬

我最近一直遭遇文件写入缓慢的问题,也许这篇文章有可以借鉴的方案。

    有9位网友表示赞同!

毒舌妖后

FILE 类型的缓冲区设置我一直没太关注过,今天来学习一下。

    有20位网友表示赞同!

摩天轮的依恋

写日志性能这么重要吗?感觉平时也没太在意这个问题...

    有13位网友表示赞同!

一笑傾城゛

希望这篇帖子能讲解清楚修改方法,免得一头雾水!

    有6位网友表示赞同!

莫失莫忘

我感觉系统经常提示硬盘占用率很高,可能是日志文件太大导致的吧

    有5位网友表示赞同!

尘埃落定

以前没想过可以调整FILE缓冲区大小,感谢分享这方面的知识!

    有7位网友表示赞同!

怪咖

如果能提高写日志性能,那么日常操作速度应该也会更快吧?

    有6位网友表示赞同!

那伤。眞美

感觉这个技巧可以提升系统的整体运行效率。

    有19位网友表示赞同!

孤城暮雨

我最近在尝试一些优化系统的方法,这篇文章正好对我的需求很适用。

    有12位网友表示赞同!

把孤独喂饱

看起来这是一个很有用的调整建议,需要尝试一下了!

    有12位网友表示赞同!

不浪漫罪名

不知道这个方法适用于所有 FILE 文件类型吗?有点好奇...

    有10位网友表示赞同!

惯例

修改缓冲区大小会不会影响到系统的稳定性?需谨慎操作...

    有18位网友表示赞同!

慑人的傲气

分享一些具体的案例和注意事项会更实用一些。

    有19位网友表示赞同!

空谷幽兰

期待看到更多关于日志性能优化的文章!

    有17位网友表示赞同!

繁华若梦

这个方法是不是需要重启系统生效呢?

    有9位网友表示赞同!

風景綫つ

有没有什么工具可以用来帮助调整缓冲区大小?

    有18位网友表示赞同!

半梦半醒i

如果对新手不太友好,希望作者能详细解释每个步骤。

    有12位网友表示赞同!

爱你的小笨蛋

写日志优化确实是一个很有必要的改进措施!

    有16位网友表示赞同!

【优化文件缓冲区配置,提升日志写入效率】相关文章:

1.动物故事精选:寓教于乐的儿童故事宝库

2.《寓教于乐:精选动物故事助力儿童成长》

3.探索动物旅行的奇幻冒险:专为儿童打造的童话故事

4.《趣味动物刷牙小故事》

5.探索坚韧之旅:小蜗牛的勇敢冒险

6.传统风味烤小猪,美食探索之旅

7.探索奇幻故事:大熊的精彩篇章

8.狮子与猫咪的奇妙邂逅:一场跨界的友谊故事

9.揭秘情感的力量:如何影响我们的生活与决策

10.跨越两岸:探索彼此的独特世界

上一篇:探索自然奇迹:生命之桥的秘密 下一篇:揭秘网拍模特真实收入:月入2万是否真的可能?深度解析分享