首页 > 编程知识 正文

fsync性能,fsync函数

时间:2023-05-04 02:56:48 阅读:171159 作者:1915

1介绍数据库系统自问世之日起,就面临着棘手的问题,fsync的性能问题。 组提交(group commit )是为了解决fsync的问题。 最近遇到了反映MySQL创建分区表很慢的业务。 通过仔细分析,我们发现InnoDB在创建表时,每个许多fsync——文件都有四个fsync调用。 当然,并不是所有的fsync开销都很大。

这里提出几个问题:

http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /为什么fsync的开销相对较大呢? 你做了什么?

3358 www.Sina.com/http://www.Sina.com/:在第一次打开数据文件后,您会发现第二次fsync的时间远远小于第一次fsync的调用时间。 为什么?

是否可以优化http://www.Sina.com/http://www.Sina.com/http://www.Sina.com/fsync?

这些疑问,一起认识一下fsync吧。

2原因分析首先,通过测试程序学习fsync在块级的基本流程。

2.1测试程序1 (1)

问题1

使用blktrace跟踪的结果如下。

上半部分的红色框内pwrite是块级的流动,下半部分的黄色框内fsync是块级的流动,中间正好相差5秒。

4722712是对应于测试文件第一块的扇区号,590339 (块号)8=4722712 (扇区号)。

无论是pwrite还是fsync,开销都是向驱动程序发送IO请求和完成IO之间的开销,即从设备驱动程序启动。 大约占整个系统调用1/2的开销。

另外,调用fsync时,发生了3次块层IO,开头扇区分别为19240、19248、19256,可知在物理上是3个连续的块。 实际上,这3个块是内核线程kjournald所写的日志,分别记述了块(2405 )、数据块(2406 )、提交块(2407 )。 为了验证,我们来看看这三个块的实际数据。

方框2405 :

(2)

问题2

(3)

前四个字节是JFS_MAGIC_NUMBER,后跟block type:JFS_DESCRIPTOR_BLOCK。

方框2407 :

确实是提交区块。

2.2既然实现fsync的fsync开销很大,那就看看代码吧。

函数ext3_sync_file :

函数log_start_commit负责启动kjounald内核线程,log_wait_commit等待jbd事务提交完成。

从代码的角度看,fsync的主要开销是调用log_wait_commit后的等待。 这意味着,在kjournald提交事务之前,fsync不会返回。

到目前为止,fsync开销的主要产生源是: (1)硬件驱动层的开销; )2)写ext3日志。

此外,如果log_start_commit返回0,则fsync不会等待事务提交完成。 到此为止,我们已经基本上确认了第二次fsync的开销为什么那么小,——是否没有提交wait事务。

验证这个想法。 为了便于调试,打开了内核jbd调试日志。

2.3测试程序2 问题3

Write page 0

Sleep 5

Fsync

#define JFS_MAGIC_NUMBER 0xc03b3998U

#define JFS_DESCRIPTOR_BLOCK 1

#define JFS_COMMIT_BLOCK 2

从第二个红框的日志来看,第二次的fsync的情况下,因为确实没有wait,所以开销这么小,但是其他三次的fsync都调用了log_wait_commit函数。

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /

因为在挂载文件系统时,写data=writeback,即写数据本身不写jbd日志。 第二次pwrite不引起文件扩展,只修改ext3 inode的i_mtime,i_mtime只正确到second。 也就是说,第二次的pwrite不会引起inode信息的变更,所以不生成jbd日志,也没有必要等待事务提交完成。

验证一下这个想法吧。

2.4测试程序3 Write page 0

Fsync

Write page 0

Fsync

Write page 1

Fsync

Write page 2

Fsync

问题4

在第二次pwrite之前,在sleep 1秒钟内保证ext3 inode的i_mtime的修正。

想法得到了证实,第二次fsync的时间回到了正常水平。

可以看到,第二次fsync调用将提交新事务,然后调用log_wait_commit等待事务完成。

3如何优化fsync? 是个很难的问题。

)1)系统减少对fsync的调用。

)2) ext3日志为http://insights.oetiker.ch/Linux/external-journal-on-SSD /

作者: YY哥

资料来源: http://www.cnblogs.com/hustcat/

著作权在作者和博客之间是共享的,所以欢迎转载。 但是,未经作者同意,必须保留本段声明,并在文章页面的明显位置提交原文链接。 否则,保留追究法律责任的权利。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。