2012-05-21 92 views
0

看來我在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活動很大。

無論如何,感謝您的建議。

+0

您確定要在您的內核模塊中擁有文件I/O嗎?它被認爲是[非標準](http://lkml.indiana.edu/hypermail/linux/kernel/0005.3/0061.html)和[bad](http://www.linuxjournal.com/article/8110) 。我無法回答您的問題,但我可以告訴您嘗試將其移至用戶級進程。 – Shahbaz

+0

@Shahbaz:嗯,我有一些理由將其納入內核。此外,我沒有看到任何內容顯示爲什麼內核模式IO不好。 –

+0

此操作顯然需要一段時間。你是否從需要快速的代碼路徑運行它?或者在進入該循環之前是否鎖定了一些鎖,以防止其他任務成功運行? – Peter

回答

3

實質上,您完全繞過了內核IO調度程序。

如果你看看ext2的實現,你會發現它從來沒有(很好,一次)調用write_one_page()。對於大規模數據傳輸,它使用mpage_writepages()代替。

這使用塊I/O接口,而不是立即訪問硬件。這意味着它通過IO調度程序。大型操作不會阻塞整個系統,因爲調度程序會自動確保其他操作與大寫操作交錯。

+0

感謝您的評論。我認爲IO調度有些問題。我會花一些時間來修改代碼。 –