Linux:“主要頁面錯誤分頁”和“手動啟用交換”之間的區別
在 Linux 機器上,我們可以通過如下命令啟用交換
sudo fallocate -l 500M /data/swapfile sudo chmod 600 /data/swapfile sudo mkswap /data/swapfile sudo swapon /data/swapfile
但即使未啟用此功能,當頁面不在記憶體中時,核心仍會進行分頁。
我們可以通過
sar -B 1 30
在不設置任何交換文件的機器上執行命令來驗證這一點。03:08:40 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 03:08:41 AM 0.00 0.00 3.00 0.00 44.00 0.00 0.00 0.00 0.00 03:08:42 AM 0.00 0.00 19.00 0.00 30.00 0.00 0.00 0.00 0.00 03:08:43 AM 0.00 0.00 0.00 0.00 3.00 0.00 0.00 0.00 0.00 03:08:44 AM 24.00 0.00 2.00 1.00 7.00 0.00 0.00 0.00 0.00 03:08:45 AM 364.00 60.00 18.00 3.00 4.00 0.00 0.00 0.00 0.00 03:08:46 AM 140.00 0.00 392.00 2.00 243.00 0.00 0.00 0.00 0.00
仍然有majflt會觸發將數據分頁到磁碟。
我的問題是:
- 我們可以說作業系統上有兩種類型的交換嗎?
- 這兩種機制的工作方式有何不同?
- 如果總有分頁機制在工作,為什麼還需要手動啟用交換?
我知道有人說:
交換是指將整個程序地址空間,或者無論如何,不可共享的文本數據段,一次復製到交換設備,或者複製回來(通常是磁碟)。
而分頁是指複製入/出地址空間的一頁或多頁。特別是,這是一個更精細的粒度。例如,在 1 GB RAM 地址空間中有約 250,000 個 4 KB 頁。
但是,在《Understanding the Linux Virtual Memory Manager 》一書中,Linux中似乎並非如此。
嚴格來說,Linux 沒有交換,因為“交換”是指將整個程序地址空間複製到磁碟,而“分頁”是指複製出單個頁面。Linux 實際上實現了分頁,因為現代硬體支持它,但傳統上在討論和文件中將其稱為交換。為了與該詞的 Linux 用法保持一致,我們也將其稱為交換。
有人可以對此有所了解嗎?謝謝!
現代作業系統通常以稱為頁面的小塊來實現其虛擬記憶體,包括換出到磁碟。與早期的 UNIX System V 一樣,需要更換整個程序,這是一個改進。
一些人強調分頁與舊的交換不同,包括在了解 Linux 虛擬記憶體管理器中。但請注意,交換術語仍然存在。
令人困惑的是,交換只是分頁的一個子集。執行檔或記憶體映射文件是頁面錯誤可以獨立於交換空間發生的範例。這些文件映射已經由永久儲存支持。相反,交換空間在匿名頁面周圍移動。
因此,分頁統計資訊是與換入/換出
sar
不同的指標。vmstat
沒有交換空間,就沒有辦法回收匿名頁面。工作負載仍然需要它們的記憶體,因此文件記憶體的壓力更大。 添加一些交換空間也有助於快速移動。它沒有幫助,因為“緊急記憶體”,積極回收緩慢的交換空間對性能來說是可怕的。
打個比方:考慮搬家。記憶體分配的“時間表”可能會迫使核心“移動者”在時間緊迫的情況下匆忙處理並移動所有內容。添加一個外部儲物櫃,不需要立即使用的東西可以提前以較少破壞性的較小負載儲存在那裡。那是有效使用的交換空間。