看來我在Linux IO性能方面存在問題。使用一個項目我需要從內核空間整個文件clear
。我用下面的代碼模式:重負載下的IO性能不佳
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調度問題還是我可能錯過了什麼?我該如何解決這個問題?
謝謝。
UPD:
據克里斯托夫的建議,我返工我的代碼,現在它看起來是這樣的:
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活動很大。
無論如何,感謝您的建議。
您確定要在您的內核模塊中擁有文件I/O嗎?它被認爲是[非標準](http://lkml.indiana.edu/hypermail/linux/kernel/0005.3/0061.html)和[bad](http://www.linuxjournal.com/article/8110) 。我無法回答您的問題,但我可以告訴您嘗試將其移至用戶級進程。 – Shahbaz
@Shahbaz:嗯,我有一些理由將其納入內核。此外,我沒有看到任何內容顯示爲什麼內核模式IO不好。 –
此操作顯然需要一段時間。你是否從需要快速的代碼路徑運行它?或者在進入該循環之前是否鎖定了一些鎖,以防止其他任務成功運行? – Peter