文章目錄
記憶體4.1 虛擬記憶體
Linux kernel使用虛擬記憶體機制來利用磁碟對記憶體的空間進行擴充。Kernel將暫時不用的記憶體寫入到磁碟從而釋放出更多的可用記憶體。當這些資料再次被使用時,會被重新載入到記憶體當中。用作虛擬記憶體的磁碟空間被稱作swap space。
對硬碟的讀寫,相對於記憶體來說速度要慢許多,因此使用了虛擬記憶體的程式,速度也會相應變慢。
對虛擬記憶體的使用,往往被認為是記憶體出現瓶頸的標誌。
問題n:swap空間被使用是否意味著出現了記憶體瓶頸?
Kswapd和Page Frame Reclaim Algorithm
當系統的可用記憶體低於閾值時(page_low,page_high),kswpad服務比那開始掃描可以被swap out的空間,並試圖一次swap out 32個記憶體頁。該過程不斷重複知道可用記憶體達到page_high水平線位置。被swap out的記憶體也被放在swap spae當中。
Kswapd回收記憶體的演算法被稱作Page Frame Reclaim Algorithm,一下類型的記憶體也是可以被回收的:
- ? Swappable – anonymous memory pages
- ? Syncable – pages backed by a disk file
- ? Discardable – static pages, discarded pages
記憶體的回收採用LRU策略,最近不被經常使用的記憶體頁,應該首先被回收。
現在來回答上面的問題:
swap空間被利用恰恰說明了Linux的記憶體使用量的合理性,並不能表示記憶體出現了瓶頸。
對Swap空間的換入換出的速率是表徵記憶體出現瓶頸的重要標誌。
5 IO
IO 子系統架構圖
5.1 頁快取
頁快取是Linux kernel使用的主要的磁碟緩衝技術。磁碟快取是一種軟體機制,它允許系統把存放在磁碟上的一些資料保留在記憶體中,以便對那些資料的再次訪問不再需要訪問磁碟。
Kernel在讀取磁碟時,如果資料頁不再快取當中,就會將讀出的磁碟資料填充到頁快取當中。通過將資料頁在快取當中駐留,從而使進程再使用該頁時不再需要訪問磁碟。
Kernel在把一頁資料寫到磁碟之前,首先檢查頁是否已經在快取當中,如果不在,首先會將頁資料填充到快取當中。更新到磁碟I/O的動作不是立即進行的,而是會有一點延時,從而使進程有機會對寫入的資料進一步修改,這就是核心的延遲寫操作。
髒資料的同步
進程對頁高速緩衝區中的資料修改之後,資料頁被標記為”髒資料”,即把PG_Dirty標誌置位。Linux系統允許對髒資料寫入磁碟塊裝置的延遲操作,被認為是顯著增加了系統I/O能力的一種機制。
在下列條件下,髒資料寫入磁碟:
- 頁快取空間不足
- 變髒以來,太久沒有過更新
- 進程通過系統調用(sync(),fsync(),fdataasync())來強行對將對快裝置的更新同步到磁碟。Msync系統調用用來將記憶體映射狀態下的髒資料重新整理到磁碟。
Pdflush
Pdflush核心線程負責丁奇掃描緩衝中的髒資料,並在合適的時候將其更新到磁碟。定時器一般是500分之一秒,可以通過/proc/sys/vm/dirty_writeback_centisecs檔案調整這個值。
Pdflush線程的個數是根據情況動態調整的:
- 至少有2個,最多有8個pdflush線程。(通過/proc/sys/vm/nr_pdflush_threads參數)可以修改這些變數的值。
- 如果最近1s內,沒有閒置pdflush線程,就建立新的。
- 如果pdflush的空閑時間超過了1s,就刪除一個pdflush。
Buffer/cache
Cache - 全稱page cache。當進程發起對磁碟的讀寫操作時,主要用來在記憶體中緩衝磁碟中的資料,與磁碟的同步有pdflush負責。
Buffer – 全稱block buffer。Block buffer中存放的是bio結構體資料。BIO 結構體是VFS和 block layer之間的借口。通俗的理解,Block buffer是page cache和磁碟機之間打交道的一層緩衝。
系統頁快取的使用方式可以通過buffer/cache的監控資料來分析。
從檔案讀寫角度來看,buffer多用於快取檔案的管資訊,如目錄位置,inode資訊等。Cache緩衝的是檔案內容。
由於CPU不能直接處理外設上的資料,buffer用來標記那些檔案的位置等描述資訊。Cache主要目的是增加傳輸效能,用於快取檔案內容。
從作業系統的工作原理來講,buffer/cache的目的主要是為了減少MPFs,增加MnPFs。
MPF
Kernel要讀取資料的時候,首先會尋找CPU 的cache然後是實體記憶體,如果沒有會發出一個major page fault(MPF)。一個MPF可以看做是kernel發送的一個請求,將磁碟資料載入到記憶體。
MnPF
當磁碟資料被載入到記憶體當中,kernel再次讀取時,會發出一個minor page fault(MnPF)。
下面的例子展示了第一次訪問一個程式和第二次訪問同樣的程式所產生的MPF和MnPF。
/usr/bin/time -v java
Major (requiring I/O) page faults: 103
Minor (reclaiming a frame) page faults: 2356
第二次訪問:
/usr/bin/time -v java
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 2581
展示了磁碟快取過程
頁快取是Linux kernel使用的主要的磁碟緩衝技術。磁碟快取是一種軟體機制,它允許系統把存放在磁碟上的一些資料保留在記憶體中,以便對那些資料的再次訪問不再需要訪問磁碟。
Kernel在讀取磁碟時,如果資料頁不再快取當中,就會將讀出的磁碟資料填充到頁快取當中。通過將資料頁在快取當中駐留,從而使進程再使用該頁時不再需要訪問磁碟。
Kernel在把一頁資料寫到磁碟之前,首先檢查頁是否已經在快取當中,如果不在,首先會將頁資料填充到快取當中。更新到磁碟I/O的動作不是立即進行的,而是會有一點延時,從而使進程有機會對寫入的資料進一步修改,這就是核心的延遲寫操作。
髒資料的同步
進程對頁高速緩衝區中的資料修改之後,資料頁被標記為”髒資料”,即把PG_Dirty標誌置位。Linux系統允許對髒資料寫入磁碟塊裝置的延遲操作,被認為是顯著增加了系統I/O能力的一種機制。
在下列條件下,髒資料寫入磁碟:
- 頁快取空間不足
- 變髒以來,太久沒有過更新
- 進程通過系統調用(sync(),fsync(),fdataasync())來強行對將對快裝置的更新同步到磁碟。Msync系統調用用來將記憶體映射狀態下的髒資料重新整理到磁碟。
Pdflush
Pdflush核心線程負責丁奇掃描緩衝中的髒資料,並在合適的時候將其更新到磁碟。定時器一般是500分之一秒,可以通過/proc/sys/vm/dirty_writeback_centisecs檔案調整這個值。
Pdflush線程的個數是根據情況動態調整的:
- 至少有2個,最多有8個pdflush線程。(通過/proc/sys/vm/nr_pdflush_threads參數)可以修改這些變數的值。
- 如果最近1s內,沒有閒置pdflush線程,就建立新的。
- 如果pdflush的空閑時間超過了1s,就刪除一個pdflush。
Buffer/cache
Cache - 全稱page cache。當進程發起對磁碟的讀寫操作時,主要用來在記憶體中緩衝磁碟中的資料,與磁碟的同步有pdflush負責。
Buffer – 全稱block buffer。Block buffer中存放的是bio結構體資料。BIO 結構體是VFS和 block layer之間的借口。通俗的理解,Block buffer是page cache和磁碟機之間打交道的一層緩衝。
系統頁快取的使用方式可以通過buffer/cache的監控資料來分析。
從檔案讀寫角度來看,buffer多用於快取檔案的管資訊,如目錄位置,inode資訊等。Cache緩衝的是檔案內容。
由於CPU不能直接處理外設上的資料,buffer用來標記那些檔案的位置等描述資訊。Cache主要目的是增加傳輸效能,用於快取檔案內容。
從作業系統的工作原理來講,buffer/cache的目的主要是為了減少MPFs,增加MnPFs。
MPF
Kernel要讀取資料的時候,首先會尋找CPU 的cache然後是實體記憶體,如果沒有會發出一個major page fault(MPF)。一個MPF可以看做是kernel發送的一個請求,將磁碟資料載入到記憶體。
MnPF
當磁碟資料被載入到記憶體當中,kernel再次讀取時,會發出一個minor page fault(MnPF)。
下面的例子展示了第一次訪問一個程式和第二次訪問同樣的程式所產生的MPF和MnPF。
/usr/bin/time -v java
Major (requiring I/O) page faults: 103
Minor (reclaiming a frame) page faults: 2356
第二次訪問:
/usr/bin/time -v java
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 2581
展示了磁碟快取過程
強行同步全部頁快取
此處介紹強行將所有記憶體快取資料同步到磁碟,並示範釋放後的free輸出結果
Free pagecache
Echo 1 > /proc/sys/vm/drop_caches;
Free dentries and inodes
Echo 2 > /proc/sys/vm/drop_caches;
Free pagecache and dentries and inodes
Echo 3 > /proc/sys/vm/drop_caches;
Direct I/O
有一些更複雜的程式(通常稱為自緩衝應用程式),更願意自己控制I/O的傳輸過程(),通過將O_DIRECT標誌位置位,I/O資料的傳送便繞過了頁快取。
出於以下原因,系統頁快取技術是有害的:
- 處理頁快取的多餘指令,降低了read(),write()的效率
- Read(),write()系統調用不是在磁碟和使用者空間直接傳送,而是分成兩步:在磁碟和核心空間,在核心空間到使用者空間。
與頁快取相關的系統參數
- /proc/sys/vm/dirty_background_ratio
表示系統可用記憶體中,最高可用於儲存 dirty 資料的百分比。The maximum of percentage of((cache+free)-mapped)。預設10%。
- /proc/sys/vm/dirty_ratio
表示進程產生的髒資料到達系統整體記憶體的百分比,此時觸發pdflush進程把資料回寫到磁碟。預設設定40.
- /proc/sys/vm/dirty_expire_centisecs
表示髒資料在記憶體中駐留超過該值,pdflush會將該資料回寫到磁碟。預設是3000。
- /proc/sys/vm/dirty_writeback_centisecs
表示pdflush周期性間隔多久處理髒資料回寫。
強行同步全部頁快取
此處介紹強行將所有記憶體快取資料同步到磁碟,並示範釋放後的free輸出結果
Free pagecache
Echo 1 > /proc/sys/vm/drop_caches;
Free dentries and inodes
Echo 2 > /proc/sys/vm/drop_caches;
Free pagecache and dentries and inodes
Echo 3 > /proc/sys/vm/drop_caches;
Direct I/O
有一些更複雜的程式(通常稱為自緩衝應用程式),更願意自己控制I/O的傳輸過程(),通過將O_DIRECT標誌位置位,I/O資料的傳送便繞過了頁快取。
出於以下原因,系統頁快取技術是有害的:
- 處理頁快取的多餘指令,降低了read(),write()的效率
- Read(),write()系統調用不是在磁碟和使用者空間直接傳送,而是分成兩步:在磁碟和核心空間,在核心空間到使用者空間。
與頁快取相關的系統參數
- /proc/sys/vm/dirty_background_ratio
表示系統可用記憶體中,最高可用於儲存 dirty 資料的百分比。The maximum of percentage of((cache+free)-mapped)。預設10%。
- /proc/sys/vm/dirty_ratio
表示進程產生的髒資料到達系統整體記憶體的百分比,此時觸發pdflush進程把資料回寫到磁碟。預設設定40.
- /proc/sys/vm/dirty_expire_centisecs
表示髒資料在記憶體中駐留超過該值,pdflush會將該資料回寫到磁碟。預設是3000。
- /proc/sys/vm/dirty_writeback_centisecs
表示pdflush周期性間隔多久處理髒資料回寫。