頁面緩存緩存最近從硬碟驅動器訪問的頁面,從而減少後續訪問相同數據的尋道時間。首次從硬碟存取頁面時,頁面快取不會改善效能。因此,如果應用程式要讀取檔一次,那麼繞過頁面緩存是更好的方法。這可以通過使用 O_DIRECT 標誌來實現。這意味著內核不會考慮頁面緩存的此特定數據。減少緩存爭用意味著其他頁面(將被重複訪問)更有可能保留在頁面緩存中。這可改善快取命中率,提供更優異的效能。
void ioReadOnceFile()
{
/* 使用 direct_fd 和 direct_f 會略過核心頁面快取。
*- direct_fd 是一個低級檔描述符
* - direct_f 是一個類似於 fopen()
* 傳回的檔流 注意:使用 getpagesize() 確定最佳大小的緩衝區。
*/
int direct_fd = open(“filename”, O_DIRECT |O_RDWR);
檔 *direct_f = fdopen(direct_fd,“w+”);
/* 直接磁碟 I/O 在此處完成*/
fclose(f);
close(fd);
}
考慮由大量頁面組成的大檔(即資料庫)中的讀取情況。訪問的每個後續頁面都會進入頁面緩存,只是稍後隨著讀取越來越多的頁面而被丟棄。這會嚴重降低快取命中率。在這種情況下,頁面緩存不會提供任何性能提升。因此,在訪問大檔時最好繞過頁面緩存。
void ioLargeFile()
{
/* 使用 direct_fd 和 direct_f 會略過核心頁面快取。
*- direct_fd 是一個低級檔描述符
* - direct_f 是一個類似於 fopen()
* 傳回的檔流 注意:使用 getpagesize() 確定最佳大小的緩衝區。
*/
int direct_fd = open(“largefile.bin”, O_DIRECT |O_RDWR |O_LARGEFILE);
檔 *direct_f = fdopen(direct_fd,“w+”);
/* 直接磁碟 I/O 在此處完成*/
fclose(f);
close(fd);
}
io-scheduler 會最佳化要排入硬碟佇列的 I/O 作業順序。由於尋道時間是硬碟上最重的損失,因此大多數 I/O 調度程式都試圖將尋道時間降至最低。這是作為電梯演演演算法的變體實現的,即將來自眾多進程的隨機排序請求重新排序到數據存在於硬碟驅動器上的順序,需要大量的CPU時間。
某些涉及複雜操作的任務往往會受到CPU處理大量數據的速度的限制。在後台運行的複雜 I/O 調度程式可能會消耗寶貴的 CPU 週期,從而降低系統性能。在這種情況下,切換到更簡單的演演演算法(如 no-op)可減少 CPU 負載並可以提高系統性能。
echo noop > /sys/block//queue/scheduler
雖然這最終會完成工作,但這絕對不是最佳方式。從內核的角度來看,I/O 請求的最佳大小是文件系統塊大小(即頁面大小)。由於文件系統(和內核頁面緩存)中的所有 I/O 都以頁面為單位,因此應用程式以頁面大小的倍數進行傳輸也是有意義的。此外,隨著多段緩存現在進入硬碟驅動器,以塊大小的倍數進行I / O將受益匪淺。
下列命令可用來判斷最佳區塊大小
統計資料 --printf=“bs=%s optimal-bs=%S\n” --file-system /dev/
當應用啟動 SYNC I/O 讀取時,內核會對數據的讀取操作進行排隊,並且僅在讀回整個請求的數據塊後返回。在此期間,內核會將應用程式的進程標記為 I/O 被阻止。其他進程可以使用CPU,從而使系統的整體性能更好。
當應用啟動 SYNC I/O 寫入時,內核會將寫入操作排入佇列,以便將應用程式的進程置於阻止的 I/O 中。不幸的是,這意味著當前應用程式的進程被阻止,並且無法執行任何其他處理(或與此相關的 I/O),直到此寫入操作完成。
當應用啟動異步 I/O 讀取時,read() 函數通常在讀取大型數據塊的子集後返回。應用需要重複調用 read(),剩餘要讀取的數據大小,直到讀入整個必需數據。每次額外的讀取調用都會引入一些開銷,因為它會在用戶空間和內核之間引入上下文切換。實現一個緊密迴圈來重複調用 read() 會浪費其他進程本可以使用的 CPU 週期。因此,通常使用 select() 實現阻塞,直到下一個 read() 返回非零位元組的讀取。即 ASYNC 就像同步讀取一樣被阻止。
當應用啟動異步 I/O 寫入時,內核會更新頁面緩存中的相應頁面並將其標記為髒頁。然後,控件會快速返回到可以繼續運行的應用。資料稍後會在更理想的時間 (低 CPU 負載) 以更最佳的方式 (循序成堆寫入) 排清到硬碟。
因此, SYNC 讀取 和 ASYNC-寫入 通常是一個不錯的方法,因為它們允許內核優化基礎 I/O 請求的順序和時間。