看来我的 Linux IO 性能有问题。使用一个项目我需要clear
从内核空间中完整的文件。我使用以下代码模式:
for_each_mapping_page(mapping, index) {
page = read_mapping_page(mapping, index);
lock_page(page);
{ kmap // memset // kunmap }
set_page_dirty(page);
write_one_page(page, 1);
page_cache_release(page);
cond_resched();
}
一切正常,但对于大文件(对我来说约为 3Gb+)我发现我的系统以一种奇怪的方式停止:虽然此操作未完成,但我无法运行任何东西。换句话说,在此操作之前存在的所有进程都运行良好,但是如果我在此操作期间尝试运行某些东西,在它完成之前我什么也看不到。
是内核的 IO 调度问题还是我错过了什么?我该如何解决这个问题?
谢谢。
升级版:
根据 Kristof 的建议,我重新编写了代码,现在看起来像这样:
headIndex = soff >> PAGE_CACHE_SHIFT;
tailIndex = eoff >> PAGE_CACHE_SHIFT;
/**
* doing the exact @headIndex .. @tailIndex range
*/
for (index = headIndex; index < tailIndex; index += nr_pages) {
nr_pages = min_t(int, ARRAY_SIZE(pages), tailIndex - index);
for (i = 0; i < nr_pages; i++) {
pages[i] = read_mapping_page(mapping, index + i, NULL);
if (IS_ERR(pages[i])) {
while (i--)
page_cache_release(pages[i]);
goto return_result;
}
}
for (i = 0; i < nr_pages; i++)
zero_page_atomic(pages[i]);
result = filemap_write_and_wait_range(mapping, index << PAGE_CACHE_SHIFT,
((index + nr_pages) << PAGE_CACHE_SHIFT) - 1);
for (i = 0; i < nr_pages; i++)
page_cache_release(pages[i]);
if (result)
goto return_result;
if (fatal_signal_pending(current))
goto return_result;
cond_resched();
}
结果,我获得了更好的 IO 性能,但是在导致操作的同一用户中进行并发磁盘访问时,仍然存在大量 IO 活动的问题。
无论如何,感谢您的建议。