元数据日记档如何编写系统调用?

时间:2018-10-12 11:23:44

标签: linux-kernel filesystems system-calls ext4

我将CentOS 7.1.1503与内核linux 3.10.0-229.el7.x86_64,具有排序日志模式的ext4文件系统以及启用了delalloc一起使用。

当我的应用程序将日志连续写入文件(大约6M / s)时,我偶尔会发现写入系统调用停滞了100-700 ms,或者当我禁用ext4的日志功能或将日志模式设置为回写时,或者禁用延迟分配,停顿消失。当我将linux的写回设置得更频繁,脏页的过期时间缩短时,问题就减少了。

我在停顿发生时打印了进程的堆栈,我得到了:

[<ffffffff812e31f4>] call_rwsem_down_read_failed+0x14/0x30
[<ffffffffa0195854>] ext4_da_get_block_prep+0x1a4/0x4b0 [ext4]
[<ffffffff811fbe17>] __block_write_begin+0x1a7/0x490
[<ffffffffa019b71c>] ext4_da_write_begin+0x15c/0x340 [ext4]
[<ffffffff8115685e>] generic_file_buffered_write+0x11e/0x290
[<ffffffff811589c5>] __generic_file_aio_write+0x1d5/0x3e0
[<ffffffff81158c2d>] generic_file_aio_write+0x5d/0xc0
[<ffffffffa0190b75>] ext4_file_write+0xb5/0x460 [ext4]
[<ffffffff811c64cd>] do_sync_write+0x8d/0xd0
[<ffffffff811c6c6d>] vfs_write+0xbd/0x1e0
[<ffffffff811c76b8>] SyS_write+0x58/0xb0
[<ffffffff81614a29>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

我阅读了Linux内核的源代码,发现call_rwsem_down_read_failed将调用rwsem_down_read_failed,这将继续等待rw_semaphore。

我认为原因是元数据日志刷新必须等待相关的脏页被刷新,当脏页刷新花费很长时间时,日志被阻塞,并且日志提交具有此inode的rw_semaphore,对此inode的写系统调用被暂停。 / p>

我真的希望我能找到证据证明这一点。

0 个答案:

没有答案