Linux內存子系統基礎及常用調優參數

內存調優涉及大量計算機操作系統原理知識,包括存儲器管理中內存分配策略,基於分頁/分段存儲管理方式,請求分頁/分段存儲管理方式,頁面置換算法,系統調用,中斷機制,進程切換等,本文整合梳理了網絡資料及書本知識,對上述問題進行簡單介紹
程序的局部性原理
指程序在執行時呈現出局部性規律,即在一段時間內,整個程序的執行僅限於程序中的某一部分。相應地,執行所訪問的存儲空間也侷限於某個內存區域。局部性原理又表現爲:時間局部性和空間局部性。時間局部性是指被執行過的某條指令在不久以後可能會被再次執行;被訪問的某些數據在不久以後可能再次被訪問(通常在循環中)。空間局部性是指程序在一段時間內訪問的地址,可能集中在一定的範圍之內,例如程序的順序執行。根據程序執行的局部性原理,將主存中一些經常訪問的信息放在高速緩存中,減少訪問主存的次數,可大幅度提高程序執行的速度。

系統調用
通常在OS的核心都設置了一組用於實現各種系統功能的子程序(過程),這些程序和過程是OS本身程序模塊的一部分,爲了保護OS程序不被用戶程序破壞,一般都不允許用戶程序訪問OS的程序和數據,因此內核提供一系列具備預定功能的多內核函數,通過一組稱爲系統調用(system call)的接口呈現給用戶。系統調用把應用程序的請求傳給內核,調用相應的的內核函數完成所需的處理,將處理結果返回給應用程序。
這裏寫圖片描述
處理機狀態
系統上通常運行着兩類程序:系統程序和應用程序,爲了保證系統程序不被應用程序破壞,爲此OS需要兩種CPU狀態:用戶態(目態)與系統態(管態或和心態)。OS在系統態運行,應用程序只能在用戶態運行,在實際運行過程中,處理機會在兩個狀態間切換,相應的CPU的指令集分爲特權指令和非特權指令。特權指令是內核態運行時的指令,例如啓動I/O、設置系統時間、允許或禁止中斷、清主存、修改存儲器、管理寄存器、執行停機、狀態轉換指令等;特權指令只能由操作系統使用,應用程序不能使用。非特權呢指令是在用戶態運行的指令。X86支持4個處理器特權級別,稱爲特權環,不同級別能夠允許的指令集不同。如下圖所示,從R0到R3,特權級別由高到低,R0相當於內核態,R3相當於用戶態;R1運行一些設備驅動程序和I/O處理的歷程,R2運行一些受保護的共享代碼,比如語言編譯環境。目前大多數基於X86處理器的操作系統只使用了R0和R3兩個特權級別。
這裏寫圖片描述
多級存儲體系
理想情況下存儲器應當具備速度快,容量大,價格低的特性,但是這三個條件在目前的技術條件下會有矛盾,於是現代計算機系統中通常採用多級存儲器結構。存儲層次至少應具有3級:最高層爲CPU寄存器,中間爲主存,底層爲輔存。根據具體功能可細分爲寄存器,高速緩存,主存儲器,磁盤緩存,固定磁盤,可移動存儲介質等。進程對輔存的訪問需要通過I/O設備,這一過程涉及到中斷,設備驅動以及物理設備的運行,所需耗費的時間遠高於對寄存器和主存儲器的訪問,一般至少相差3個數量級。
這裏寫圖片描述
Dynamic Random Access Memory
DRAM是個人計算機內存的主要組件,屬於揮發性內存,靠MOS電路中的柵極電容來記憶信息,由於電容上的電荷會泄漏,需要定時給與補充,因此只有在通電時才能記錄和使用,斷電後存於其中的數據就會丟失;但集成度高、功耗低, 從而成本也低,適於作大容量存儲器,內存通常採用動態RAM。

Static Random Access Memory
SRAM靠雙穩態觸發器來記憶信息,不需要刷新電路即可保存其內部存儲的數據,集成度較低,價格較高,且不易做成大容量,但速度快,通常集成到CPU內成爲高速緩存。

主存儲器
簡稱內存或主存,用於保存進程運行時的程序和數據,也稱可執行存儲器,CPU的控制部件只能從主存儲器中取得指令和數據,將它們裝入到寄存器中,或者將它們從寄存器存入到主存儲器。CPU不能與硬盤直接打交道,數據只有被載入到內存中纔可以被CPU調用,內存的運行也決定了計算機的穩定運行,而其性能的好壞直接影響着整個操作系統。 由於主存儲器的訪問速度遠低於CPU執行指令的速度,爲了緩和這一矛盾,在計算機中引入了寄存器和高速緩存。

寄存器
它是CPU內的組成部分,訪問速度最快,完全能與CPU協調工作,但價格十分昂貴,因此容量不肯能做得很大,寄存器的長度一般以字(word)爲單位。
這裏寫圖片描述
高速緩存
它位於CPU與內存之間,是一個讀寫速度比內存更快的存儲器。其容量遠大於寄存器,而比內存約小兩到三個數量級左右,從幾十KB到幾MB,訪問速度快於主存儲器。由於高速緩存的速度越高價格越貴,所以一般計算機系統設置多級高速緩存。通常進程的程序和數據存放在內存中,每當使用時被臨時複製到一個速度較快的高速緩存中,當CPU讀取數據時,首先在高速緩存中尋找,如果找到(命中)就直接取出使用,如果未能找到(未命中),再從主內存中進行讀取。
這裏寫圖片描述
一級緩存一般分爲一級數據緩存(Data Cache)和一級指令緩存(Instruction Cache),不同CPU的L1高速緩存各不相同。L1高速緩存對CPU的性能影響較大,其容量越大,CPU的性能也就越高。

二級緩存主要用於存放電腦運行時操作系統的指令、程序數據和地址指針等。從理論上講,在一顆擁有二級緩存的CPU中,讀取一級緩存的命中率爲80%,剩下的20%從二級緩存中讀取,而讀取二級緩存的命中率也在80%左右。

三級緩存是爲讀取二級緩存後未命中的數據設計的—種緩存,在擁有三級緩存的CPU中,只有約5%的數據需要從內存中調用,這進一步提高了CPU的效率。具有較大L3緩存的處理器提供更有效的文件系統緩存行爲及較短消息和處理器隊列長度。

磁盤緩存
它本身並不是一種實際存在的存儲介質,而是依託於固定的磁盤,提供對主存儲器存儲空間的擴充,即利用主存中的存儲空間,將頻繁使用的數據暫存下來,以減少訪問磁盤的次數,從這個角度看,主存也可以理解爲輔存的高速緩存。

Swapping
指把內存中暫時不能運行的進程或暫時不用的程序和數據調出到外存上,以便騰出足夠的內存空間,在把具備運行條件的進程或者進程需要的程序和數據調入內存,以提高內存利用率。

虛擬存儲器
指的是具有請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。基於程序的局部性原理,應用程序在運行前沒有必要全部裝入內存,僅需將那些當前要運行的少數頁面或段先裝入內存便可運行,其餘部分暫留在磁盤上。如果程序運行所要訪問的頁/段尚未調入內存(缺頁/段),應用程序利用OS所提供的請求調頁/段功能,將它們調入內存,以使進程能繼續執行;如果此時內存已滿,無法在裝入新的頁/段,還需要根據一定的置換算法,將內存中暫時不用的頁/段調至磁盤上,騰出足夠的空間將要訪問的頁/段調入內存,使進程進程繼續執行。比如想要在一個內存只有4MB的機器運行一個16MB的程序,OS通過選擇,可以決定各個時刻將哪4M的內容保留在內存中,並在需要時在內存和磁盤間交換程序片段,這樣就可以使得一個較大的應用程序能在較小的內存空間運行,也可在內存中同時裝入更多的進程使它們並非執行。從用戶角度看,系統的內存容量將比實際內存容量大的多,因此稱之爲虛擬存儲器。目前虛擬存儲器的實現方法有請求分頁系統和請求分段系統,這兩種方法都建立在離散分配的存儲管理方式上。

I/O端口&DMA
在操作系統開機的時候,每一個I/O設備都會像CPU申請一些列的隨機端口(I/O端口),以便於CPU與I/O設備進行讀寫交互的過程。在IBM PC體系結構中,I/O地址空間一共提供了65,536個8位的I/O端口。在執行讀寫操作時,CPU使用地址總線選擇所請求的I/O端口,使用數據總線在CPU寄存器和端口之間傳送數據。現代的硬件設備更傾向於映射I/O端口到物理地址空間,這樣處理器和I/O設備之間的通信就可以直接使用對內存進行操作的彙編語言指令(如mov、and、or等),同時與DMA結合起來使用,以釋放CPU。

DMA(Directional Memory Access)是指一種高速的數據傳輸操作,在DMA控制器的控制下具有獨立於CPU的後臺批量數據傳輸能力,能夠滿足實時圖像處理中高速數據傳輸要求。CPU除了在數據傳輸開始和結束時做一些處理外,在數據傳輸過程中CPU可以進行其他的工作。這樣在大部分時間裏,CPU和輸入輸出都處於並行操作,因此使整個計算機系統的效率大大提高。

中斷控制器
CPU外圍有一種設備,這個設備叫做可編程中斷控制器。每一個硬件設備爲了給CPU通信,在剛開機的時候,在BIOS實現檢測的時候,這個設備就要到可編程中斷控制器上去註冊一個所謂的中斷號。那麼這個號碼就歸這個硬件使用了。當前主機上可能有多個硬件,每一個硬件都有自己的號碼,CPU在收到中斷號以後,就能夠通過中斷相量表查找到那個硬件設備進行中斷。並且就由對應的IO端口過來處理了。

內存域
程序能夠運行的地址範圍大小由CPU的位數決定,這個地址範圍稱爲虛擬地址空間,該空間中的某一個地址稱之爲虛擬地址。CPU是32位還是64位主要是依據CPU的字組大小(每次能夠處理的數據量)而來。例如32位CPU可以支持的地址範圍是0~0xFFFFFFFF (2^32=4G),而64位CPU可以支持的地址範圍爲0~0xFFFFFFFFFFFFFFFF (2^32個4G)。

一般而言在32位系統中,較低地址空間的1GB(虛地址0xC0000000到0xFFFFFFFF)供內核使用,稱爲內核空間。而較高地址空間的3GB(虛地址0x00000000到0xBFFFFFFF)供各個進程使用,稱爲用戶空間;因爲每個進程可以通過系統調用進入內核,因此,內核空間由系統內的所有進程共享;從單個進程的角度來看,每個進程都可以擁有4GB的虛擬地址空間(也叫做虛擬內存)。再深入內核空間看,其低地址位置有16MB給DMA(ZONE_DMA),從16M到896M纔是內核可以直接訪問的地址空間(ZONE_NORMAL),從896M到1G這段空間是預留的物理地址空間(Reserved)。內核不能直接訪問用戶空間,要想訪問必須把其中的一段內容映射到Reserved來,在Reserved中保存即將要訪問那段內存的地址編碼,內核才能去訪問,所以在32位系統上內核不能直接訪問大於1G的內存地址。

在Linux64位系統中,低地址空間的1G內存都給了DMA,這個時候DMA的尋址能力就大大加強了;1G以上的地址空間給劃分了ZONE_NORMAL,這段空間都可以被內核直接訪問。所以在64位上,內核可以直接訪問大於1G的內存地址,不再需要額外的步驟,效率和性能上也大大增加。
這裏寫圖片描述
在現在的PC架構上,AMD,INTEL都支持PEA(物理地址擴展)。所謂PAE指的是在32位系統的地址總線上,又擴展了4位,使得32位系統上的地址空間可以達到64G。在32爲系統上,不管物理內存有多大,單個進程所使用的空間是無法擴展的。因爲在32位的系統上,線性地址空間只有4個G,而單個進程能夠識別的訪問也只有3個G。

linux的虛擬內存子系統包含了以下幾個功能模塊:

  • Slab Allocator
  • zoned buddy allocator
  • MMU
  • kswapd
  • bdflush

buddy system是工作在MMU之上的,而slab allocator又是工作在buddy system之上的。
這裏寫圖片描述
MMU(Memory Management Unit)

  • 物理地址(Physical Address):指的是CPU外部地址總線上尋址物理內存的地址信號,是地址變換的最終結果。
  • 虛擬地址(Virtual Address):也稱爲邏輯地址,由段選擇符和段內偏移地址兩個部分組成。
  • 線性地址(Linear Address):是VA到PA變換的中間層。程序代碼會產生LA(段中的偏移地址),加上相應段的基地址就生成了一個線性地址。如果啓用了分頁機制,那麼線性地址可以再經變換以產生一個PA。若沒有啓用分頁機制,那麼線性地址直接就是PA。

這裏寫圖片描述
內存管理單元是CPU中用來管理虛擬存儲器、物理存儲器的控制線路的組件,同時也負責將虛擬地址映射爲物理地址,以及提供硬件機制的內存訪問授權。ARM出品的CPU,MMU作爲一個協處理器存在。ARM MMU提供的分頁機制有1K/4K/64K 3種模式;INTEL出品的80386CPU或者更新的CPU中都集成有MMU,X86 MMU提供的尋址模式有4K/2M/4M的page模式(根據不同的CPU,提供不同的能力)。

TLB
爲了提高地址變換速度,可在地址變換機構中增設一個具有並行查詢能力的特殊告訴緩存存儲器,又稱爲聯想寄存器(Associative Memory)或塊表,在IBM系統中取名爲(Translation Look-aside Buffer)用來存放 當前訪問的那些頁表項。這裏關鍵的一點是:如果操作系統更改了頁表內容,它必須相應的刷新TLB以使CPU不誤用過時的表項。

Buddy Allocator
夥伴系統是一種適合於二進制計算機使用的動態存儲分配方式,其規定無論是已分配分區還是空閒分區,其大小均爲2^k,k爲整數,1<=K<=n。假設系統可用的空間容量爲2^n,最初始整個2^n空間都是可用的,由於運行過程中不斷劃分,可能會形成若干不連續的空閒分區,將這些空閒分區根據大小進行分類,對於每一類具有相同大小的空閒分區,單獨設立一個空閒分區雙向鏈表,即保持每個大小爲2^k(0<= k <= n) 的空閒分區鏈表。當要分配存儲空間時,首先計算i值,根據i值在對應大小爲2^i的空閒分區鏈表中查找,如果找到即分配,找不到則將其向上擴在2^(i+1)鏈表中查找,把一個空閒分區分成兩個相等的部分,這兩個大小相等的分區就稱爲夥伴,其中一個用於分配,另一個加入2^i的空閒分區鏈表,此過程可循環向上擴展,直到最終出現一個大小正好爲2^i的分區。當內存釋放進行回收時,如果它的夥伴也是空閒的,可能也會進行多次遞歸合併成更大的分區,直到無法再合併爲止。夥伴算法的每次調用都會“弄髒”硬件高速緩存,因此,這就增加了對內存的平均訪問次數。
這裏寫圖片描述
Slab Allocator
Linux slab 分配器組織結構的最高層是 cache_chain,是一個 slab緩存的鏈接列表。cache_chain 的每個元素都是一個 kmem_cache 結構的引用(稱爲一個 cache)。它定義了一個要管理的給定大小的對象池。因爲緩衝區的組織和管理與硬件高速緩存的命中率密切相關,Slab分配模式把對象分組放進緩衝區(指的是內存中的一片區域),把這片區域劃分爲多個塊,每塊就是一個Slab,每個Slab由一個或多個頁面組成,每個Slab中存放的就是對象。這些對象是從特定緩存中進行分配和釋放的基本元素。這些對象或已被分配,或空閒。一般而言,對象分兩種,一種是大對象,一種是小對象。所謂小對象,是指小於512字節的對象。例如,一個inode結構大約佔300多個字節,因此,一個頁面中可以容納8個以上的inode結構,inode結構就爲小對象。
這裏寫圖片描述
每個緩存都包含了一個slabs列表,這是一段連續的內存塊(通常都是頁面)。存在3種slab:

  • slabs_full 所有對象被分配的slab
  • slabs_partial 部分對象唄分配的slab
  • slabs_empty 沒有對象被分配的slab

這裏寫圖片描述
由於對象是從slab中進行分配和釋放的,因此單個slab可以在slab列表之間進行移動。例如,當一個slab中的所有對象都被使用完時,就從 slabs_partial 列表中移動到 slabs_full 列表中。當一個 slab 完全被分配並且有對象被釋放後,就從slabs_full列表中移動到 slabs_partial 列表中。當所有對象都被釋放之後,就從 slabs_partial 列表移動到 slabs_empty 列表中。slabs_empty列表中的slab是進行回收(reaping)
的主要備選對象。正是通過此過程,slab 所使用的內存被返回給操作系統供其他用戶使用。注意 slab 是 slab 分配器進行操作的最小分配單位,因此如果需要對slab進行擴展,這也就是所擴展的最小值。

髒頁的概念
因爲硬盤的讀寫速度遠趕不上內存的速度,系統就把讀寫比較頻繁的數據事先放到內存中,以提高讀寫速度,這就叫高速緩存,linux是以頁作爲高速緩存的單位,當進程修改了高速緩存裏的數據時,該頁就被內核標記爲髒頁,內核將會在合適的時間把髒頁的數據寫到磁盤中去,以保持高速緩存中的數據和磁盤中的數據是一致的。

bdflush
用來啓動核心守護進程將內存中的dirty緩存寫到磁盤上。真正清潔工作是一個核心程序完成的, bdflush會派生出一個新的進程調用這個永遠不會返回的核心程序。bdflush實際上也會派生出第二個類似於傳統更新程序的守護進程,除非那些緩存在變化了一個位前,否則不會被考慮用來進行寫操作。當緩存的dirty位被置位時,時鐘開始計時。當經過一定的時間間隔後,緩存將會被寫回到磁盤上。對於數據緩存和位元數據緩存(比如目錄,位圖,間接區塊等等)來說,時間間隔是不同的。當你在運行bdflush時使用了一些命令行參數的時候,當前一些配置會顯示在屏幕上。數據緩存刷新間隔的默認值是30秒,位元數據是5秒。

kswapd
從原理上說,kswapd是一個頁面交換守護進程,它有自己的進程控制塊task_struct結構。與其它進程一樣受內核的調度。而正因爲內核將它按進程來調度,就可以讓它在系統相對空閒的時候來運行。不過,與普通進程相比,kswapd有其特殊性。首先,它沒有自己獨立的地址空間,所以在近代操作系統理論中把它稱爲“線程”以與進程相區別。那麼,kswapd的地址空間是什麼?實際上,內核空間就是它的地址空間。在這一點上,它與中斷服務例程相似。其次,它的代碼是靜態地鏈接在內核中的,因此,可以直接調用內核中的各種子程序和函數。

內存使用策略

  • 降低微型內存對象的系統開銷

與傳統的內存管理模式相比, slab緩存分配器提供了很多優點。首先,內核通常依賴於對小對象的分配,它們會在系統生命週期內進行無數次分配。slab 緩存分配器通過對類似大小的對象進行緩存而提供這種功能,從而避免了常見的碎片問題。slab 分配器還支持通用對象的初始化,從而避免了爲同一目而對一個對象重複進行初始化。最後,slab 分配器還可以支持硬件緩存對齊和着色,這允許不同緩存中的對象佔用相同的緩存行,從而提高緩存的利用率並獲得更好的性能。

  • 縮減慢速子系統的服務時間

使用buffer cache緩存文件元數據(metadata)以及寫操作;
使用page cache緩存DISK IO(文件內容);
使用shm完成進程間通信;
使用buffer cache、arp cache和connetion tracking提升網絡IO性能;
這裏寫圖片描述
該參數定義最小內存空閒空間(保留不分配出去),以便某些進程隨時使用。在磁盤太慢或者CPU性能比較差的情況下可將該參數的值調小

與物理內存過量使用有關的調優參數:
這裏寫圖片描述
swappiness={0..100}:使用交換分區的傾向性,系統默認爲 60
overcommit_memory可用參數有3個,規定是否能夠過量使用內存:

  • 0:默認設置,內核執行啓發式的過量使用處理
  • 1:內核執行總是過量使用處理,使用這個值會增大內存超載的可能性
  • 2:設置內存使用量等於swap的大小+RAM*overcommit_ratio的值。如果希望減小內存的過度使用,這個值是最安全的

overcommit_ratio: 將overcommit_memory指定爲2時候,定義可以超出物理內存的百分比,默認爲50 。假如設定swap爲2G,內存爲8G,overcommit_memory=2,
overcommit_ratio=50,那麼可以使用的物理內存爲2G+8G*50%=6G 。在很多場景下不建議使用swap,上述的例子中設定的參數告訴內核可以使用6G的內存空間,但實際的物理空間有8G,這樣內存使用一旦超出6G,系統可能開始使用swap,甚至產生oom,不利於性能提升,一般來說swap設爲RAM的50%就可以保證RAM是可以全部使用的
可通過以下兩個方法充分使用物理內存

  • swap跟RAM一樣大;swappiness=0;
  • overcommit_memory=2, overcommit_ratio=100:swappiness=0;

內存耗盡時候的相關調優參數
當Linux內存耗盡的時候,它會殺死那些佔用內存最多的進程,以下三種情況會殺死進程:

  • 在ZONE_NORMAL中沒有可用的page頁
  • 所有的進程都是活動進程,這個時候想交換出去都沒有空閒的進程
  • 有其它新進程啓動,申請內存空間的時候,要找一個空閒內存給做映射,但是這個時候找不到了

一旦內存耗盡的時候,操作系統就會啓用oom-kill機制。 如果想禁止oom-kill功能的使用可以使用設置panic_on_oom=1即可。
這裏寫圖片描述
在/proc/PID/目錄下的oom_score文件就是用來指定oom的壞蛋評分指數。 如果要手動啓用oom-kill機制的話,只需要執行以下命令即可,它會自動殺掉我們指定的壞蛋指數評分最高的那個進程

echo f> /proc/sysrq-trigger

可以通過下命令來調整一個進程的壞蛋評分指數。最終的評分指數就是2^n。假如我們的一個進程的oom_adj的值是5,那麼它的壞蛋評分指數就是2的5次方。

echo n > /proc/PID/oom_adj

實時顯示內核緩存信息
這裏寫圖片描述
dentry:目錄項,通過每一個目錄可找到的文件路徑映射關係
這裏寫圖片描述
tunables < limit > < batchcount > < sharedfactor >
這裏寫圖片描述
tunables 爲可調參數
limit:CPU可緩存的最大對象個數
batchcount:一次最多能傳送到CPU中的全局緩存對象個數
sharedfactor:在SMP架構中各CPU間可共享的slab cache個數
調大slab cache可以提高CPU訪問內存小對象時的性能

echo  "cache_name  limit   batchcount  shared"> /proc/slabinfo

調整網絡I/O的ARP緩存
這裏寫圖片描述
默認最大緩存條目的軟限制爲512個,硬限制爲1024個,默認緩存時間爲5分鐘,過期後由Garbage collection移除。如果ARP緩存不夠用會導致解析結果頻繁被刷新,因此當處於一個非常大的物理網絡中的時候主機,即同一個網段中主機數量非常多則可能需要調大ARP緩存。
顯示緩存條目
這裏寫圖片描述

ip neighbor flush dev ethX  ##Flush cache

Adjust where the gc will leave arp table alone
net.ipv4.neigh.default.gc_thresh1
default 128
Soft upper limit
net.ipv4.neigh.default.gc_thresh2
defalut 512
Becomes hard limit after 5 seconds
Hard upper limit
net.ipv4.neigh.default.gc_thresh3
Garbage collection frequency in seconds
net.ipv4.neigh.default.gc_interval
Tuning page cache
View page cache allocation in /proc/meminfo
Tune length/size of memory
vm.lowmem_reserve_ratio
vm.vfs_cache_pressure

  • 0:不回收dentries和inodes;
  • 1-99: 傾向於不回收;
  • 100: 傾向性與page cache和swap cache相同;
  • 100+:傾向於回收;

Tune arrival/completion rate
vm.page-cluster:一次清到swap上的頁面數量,作爲冪指數的值,默認爲3,意味着可轉移2^3=8個頁面到swap;在系統需要大量使用交換分區(例如虛擬化場景中在一個物理機上運行多個虛擬機,多個虛擬機的使用內存很肯能會超出物理內存)時可以適當調大該值,不要超過4
這裏寫圖片描述
vm.zone_reclaim_mode
與通信相關的調優參數
常見同一個主機中進程間通信的方式:

  • 通過消息message
  • 通過signal信號量進行通信
  • 通過共享內存進行通信

跨主機常見的通信方式是rpc

shm:以共享內存方式實現進程通信的可調優參數
shmmni :系統級別,所允許使用的共享內存段上限
Specifies the maximum number of shared memory segments system-wide, default = 4096
shmall:系統級別,以字節爲單位規定一次在該系統中能夠爲共享內存分配使用的最大頁面數;
Specifies the total amount of shared memory, in pages, that can be used at one time on the system, default = 2097152 This should be at least kernel.shmmax/PAGE_SIZE
shmmax :單個共享內存段的上限;
Specifies the maximum size of a shared memory segment that can be created

messages:以消息的方式實現進程通信的可調優參數
msgmnb:單個消息隊列的長度上限,單位爲字節;
Specifies the maximum number of bytes in a single message queue, default = 16384
msgmni:系統級別,消息隊列識別符的個數上限;
Specifies the maximum number of message queue identifiers, default = 16
msgmax :單個消息大小的上限,這個值一定不能超過該隊列的大小(msgmnb),單位爲字節;
Specifies the maximum size of a message that can be passed between processes This memory cannot be swapped, default = 8192

與容量相關的文件系統可調優參數:
file-max:列出內核分配的文件句柄的最大值
Tune length/size of memory
dirty_background_ratio:定義全局範圍內髒頁佔物理內存的百分比達到多少時啓動清洗進程;默認爲10
Percentage (of total memory) of number of dirty pages at which pdflush starts writing
dirty_ratio :定義某一個進程中髒頁佔據物理內存的百分比到多少時啓動清洗進程pdflush;默認爲20
Percentage (of total memory) of number of dirty pages at which a process itself starts writing out dirty data
Tune wait time
dirty_expire_centisecs:pdflush 週期性啓動清洗操作的時間間隔;默認值爲3000,每隔30秒起來開始刷新髒頁
Interval between pdflush wakeups in 100ths of a second; set to zero to disable writeback
Tune observation period (between pdflush wakeups)
dirty_writeback_centisecs :定義髒頁在內存中存儲多久後變爲過期並啓動清洗進程;默認值爲500,一個髒頁的存在時間達到了5秒,就開始刷新髒
Defines when data is old enough, in 100ths of a second, to be eligible for writeout bye pdflush

swap相關優化策略
在應用服務器上,swap可以設置爲RAM*0.5,當然這個是理論值
如果不的不使用交換內存,應該把交換內存放到最靠外的磁道分區上,因爲最外邊的磁盤的訪問速度最快。所以如果有多塊硬盤,可以把每塊硬盤的最外層的磁道拿一小部分出來作爲交換分區。交換分區可以定義優先級,因此把這些硬盤的交換內存的優先級設置爲一樣,可以實現負載均衡的效果。定義交換分區優先級的方法:

vim /etc/fstab
/dev/sda1 swap swap pri=5 0 0 
/dev/sdb1 swap swap pri=5 0 0 
/dev/sdc1 swap swap pri=5 0 0 
/dev/sdd1 swap swap pri=5 0 0

清理髒頁與緩衝區
Sync command
fsync system call
Alt-SysRq-S magic system request

echo s > /proc/sysrq-trigger

Reclaim clean pages

echo 3 > /proc/sys/vm/drop_caches
  • to free pagecache
  • to free dentries and inodes
  • to free pagecache, dentries and inodes

Eliminate bad data from cache
Reduce memory before laptop hibernate
Benchmark subsystem

linux內存常用的觀察指標命令:
strace:追蹤命令產生的系統調用

  • strace COMMAND:查看命令的syscall
  • strace -p PID:查看已經啓動進程的syscall
    -c:只輸出其概括信息;
    -o FILE:將追蹤結果保存至文件中,以供後續分析使用;

這裏寫圖片描述
Memory activity
sar -r [interval] [count]
這裏寫圖片描述
Rate of change in memory
sar -R [interval] [count]
這裏寫圖片描述

  • frmpg/s:每秒釋放或者分配的內存頁,如果爲正數,則爲釋放的內存頁;如果爲負數,則爲分配的內存頁
  • bufpg/s:每秒buffer中獲得或者釋放的內存頁。如果爲正數則爲獲得的內存頁,爲負數。則爲釋放的內存頁
  • campg/s:每秒cache中獲得或者釋放的內存頁。如果爲正數則爲獲得的內存頁,爲負數。則爲釋放的內存頁

Swap activity
ALL IO
sar -B [interval] [count]
這裏寫圖片描述

  • pgpgin/s:每秒從磁盤寫入到內核的塊數量
  • pgpgout/s:每秒從內核寫入到磁盤的塊數量
  • fault/s:每秒鐘出現的缺頁異常的個數
  • majflt/s:每秒鐘出現的大頁異常的個數
  • pgfree/s:每秒回收回來的頁面個數

主要參考文檔:
http://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/
http://oss.org.cn/kernel-book/ch06/6.3.3.htm
http://oss.org.cn/kernel-book/ch06/6.6.2.htm
http://wiki.dzsc.com/info/6624.html
http://www.cnblogs.com/daoluanxiaozi/archive/2012/03/12/2392281.html
http://os.51cto.com/art/201309/411937.htm
http://www.2cto.com/os/201407/315641.html
http://blog.chinaunix.net/uid-11278770-id-148460.html
http://blog.csdn.net/duqi_2009/article/details/15811693
http://blog.chinaunix.net/uid-28236237-id-3513958.html

發佈了88 篇原創文章 · 獲贊 17 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章