簡體   English   中英

如何更改 kernel i/o 緩沖區大小

[英]How to change kernel i/o buffer size

我正在對 I/O 密集型應用程序進行一些實驗,並試圖了解改變 kernel i/o 緩沖區大小、不同電梯算法等的影響。

我如何知道 kernel 中 i/o 緩沖區的當前大小? kernel 是否在需要時使用多個緩沖區? 如何更改此緩沖區的大小? 是否有存儲此信息的配置文件?

(需要明確的是,我不是在談論處理器或磁盤緩存,我是在談論 kernel 內部使用的緩沖區,該緩沖區在不時將讀取/寫入刷新到磁盤之前緩沖讀取/寫入)。

提前致謝。

kernel 不會像您想象的那樣緩沖讀取和寫入...它維護一個“頁面緩存”來保存磁盤中的頁面。 你不能操縱它的大小(好吧,不是直接的,反正); kernel 將始終使用所有可用的免費 memory 作為頁面緩存。

你需要解釋你真正想要做什么。 如果您想控制 kernel 從磁盤預取多少數據,請嘗試搜索“linux readahead”。 (提示: blockdev --setra XXX

如果您想控制 kernel 在將臟頁刷新到磁盤之前將其保留多長時間,請嘗試搜索“linux dirty_ratio”。

特定應用程序還可以使用O_DIRECT完全繞過頁面緩存,並且可以使用fsyncsync_file_rangeposix_fadviseposix_madvise對其進行一些控制。 O_DIRECTsync_file_range是特定於 Linux 的;rest 是 POSIX。)

如果您首先了解 Linux VM 子系統,尤其是頁面緩存,您將能夠提出更好的問題。

我認為您的意思是磁盤 IO 隊列。 例如:

$ cat /sys/block/sda/queue/nr_requests
128

如何使用此隊列取決於正在使用的 IO 調度程序。

$ cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]

cfq是最常見的選擇,盡管在具有高級磁盤控制器的系統和虛擬客戶系統中noop也是一個非常好的選擇。

我知道沒有此信息的配置文件。 在需要更改隊列設置的系統上,我將更改放入 /etc/rc.local,盡管您可以使用完整的 init 腳本並將其放入 RPM 或 DEB 中,以便大規模分發到許多系統。

暫無
暫無

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

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