簡體   English   中英

當Linux內核內存負載變高時,對常規文件的讀/寫性能如何變化?

[英]How performance of reads/writes to regular file varies when linux kernel memory load becomes high?

似乎寫入/讀取常規文件不能無阻塞。 我找到了以下參考資料以獲得支持:

來自Linux編程接口:Linux和UNIX系統編程手冊:

“---非阻塞模式可以與設備(例如,終端和偽終端),管道,FIFO和套接字一起使用。(因為管道和套接字的文件描述符不是使用open()獲得的,我們必須使用fcntl啟用此標志()第5.3節中描述的F_SETFL操作。)對於常規文件,O_NONBLOCK通常被忽略,因為內核緩沖區高速緩存確保常規文件上的I / O不會阻塞,如第13.1節所述。但是,O_NONBLOCK確實對常規文件有影響使用強制文件鎖定時的文件(第55.4節).---“

來自UNIX環境中的高級編程第二版:

“---我們還說,與磁盤I / O相關的系統調用不會被認為很慢,即使磁盤文件的讀取或寫入可以暫時阻止調用者.---”

來自http://www.remlab.net/op/nonblock.shtml

“---常規文件總是可讀的,並且它們也總是可寫的。這在相關的POSIX規范中有明確說明。我不能強調這一點。將常規文件放在非阻塞中除了改變一位之外絕對沒有任何影響從常規文件中讀取可能需要很長時間。例如,如果它位於繁忙磁盤上,則I / O調度程序可能需要花費很長時間才能注意到應用程序被凍結。阻塞模式不起作用。它根本不起作用。檢查文件的可讀性或可寫性總是立即成功。如果系統需要時間來執行I / O操作,它將使任務處於不可中斷的睡眠狀態或寫系統調用.---“

當內存足夠可用時,通過內核緩沖執行讀/寫操作。

我的問題是:是否存在內核內存不足以導致緩沖無法立即使用的情況? 如果是的話,內核會做什么? 只是返回一個錯誤或做一些驚人的技巧?

多謝你們!

我對O_NONBLOCK和引用文本的看法:

  • 如果系統調用觸發實際磁盤I / O塊或不等待I / O完成,則O_NONBLOCK絕對沒有效果 O_NONBLCOK僅影響文件系統級別的操作,例如訪問偽文件(如第一次引用提及)和鎖定文件。 O_NONBLOCK不會影響塊設備級別的任何操作。

  • 內存不足與O_NONBLOCK無關。

  • O_NONBLOCK指示訪問鎖定文件是否阻止。 例如,flock()/ lockf()可用於鎖定文件。 如果使用O_NONBLOCK,則read()/ write()將立即返回EGAIN而不是阻塞並等待釋放文件鎖。 請記住,這種同步差異是在文件系統級別實現的,與read()/ write()系統調用是否觸發真正的磁盤I / O無關。

  • 該片段because the kernel buffer cache ensures that I/O on regular files does not block第一個引用,這會產生誤導,我會考慮錯誤。 確實,緩沖降低了文件讀/寫系統調用導致磁盤I / O從而阻塞的可能性,但是,單獨緩沖永遠不能完全避免I / O. 如果文件未緩存,則當您從文件中讀取()時,內核需要執行實際的IO。 如果你對文件寫()並且頁面緩存已經滿了臟頁面,那么內核必須首先將一些數據刷新到存儲設備來騰出空間。 我覺得如果你在心理上跳過這個片段,文字會變得更加清晰。

  • 第二個引用似乎是通用的(這對於某些東西緩慢是什么意思?)並沒有解釋為什么I / O相關的調用不被認為是慢的。 我懷疑周圍的文本中有更多的背景信息,這些信息更符合作者的意圖。

  • 內核中缺少內存可能有兩種形式:(a)緩沖區緩存中缺少空閑頁面;(b)沒有足夠的內存來分配新的數據結構來維護新的系統調用。 對於(a)內核簡單地回收緩沖區高速緩存中的頁面,可能通過將臟頁首先寫入磁盤。 這是一種非常常見的情況。 對於(b)內核需要通過將程序數據分頁到交換分區來釋放內存,或者(如果失敗)甚至通過終止現有進程來釋放內存(調用OOM函數,這會使內存消耗最多的進程被殺掉) 。 這是一種不常見的操作模式,但系統將在用戶進程被終止后繼續運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM