1、Buffer 和 cache
Free 指令相對于top 提供了更簡潔的檢視系統記憶體使用情況:
[apptest@vs022 ~]$ free -m ——以MB為機關
total used free shared buffers cached
Mem: 32109 30133 1975 0 472 16881
-/+ buffers/cache: 12780 19328
Swap: 16063 10 16053
Mem:表示實體記憶體統計。
-/+ buffers/cached:表示實體記憶體的緩存統計
Swap:表示硬碟上交換分區的使用情況。隻有mem被目前程序實際占用完,即沒有了buffers和cache時,才會使用到swap。
先看第一行:Mem
total 記憶體總數: 32109MB
used 已經使用的記憶體數: 30133 MB
free 空閑的記憶體數: 1975
shared 目前已經廢棄不用,總是0
buffers Buffer Cache記憶體數: 472MB ——表示系統已經配置設定,但是沒有被使用的buffer大小。
cached Page Cache記憶體數: 16881MB ——系統已經配置設定,但是沒有被使用的cache大小。
關系:total = used + free
第2行:
-/+ buffers/cache的意思相當于:
-buffers/cache 的記憶體數: 12780 MB (等于第1行的 used - buffers - cached)
+buffers/cache 的記憶體數: 19328MB (等于第1行的 free + buffers + cached)
可見-buffers/cache反映的是被程式實實在在吃掉的記憶體,而+buffers/cache反映的是可以挪用的記憶體總數。
已經配置設定的記憶體大小:
Used(Mem) = Used(-/+ buffers/cache)+ buffers(Mem) + Cached(Mem)
30133MB = 12780 MB + 472MB + 16881MB
第三行單獨針對交換分區, 就不用再說了.
為了提高磁盤存取效率, Linux做了一些精心的設計, 除了對dentry進行緩存(用于VFS,加速檔案路徑名到inode的轉換), 還采取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁盤塊的讀寫,後者針對檔案inode的讀寫。這些Cache有效縮短了 I/O系統調用(比如read,write,getdents)的時間。
如果感興趣可以進一步參考檔案/proc/meminfo,free指令就是根據它的資訊生成的。free指令的源碼可從procps-xxx-.src.rpm擷取,xxx為版本号,比如procps-3.2.3-5.3.src.rpm。
在linux的記憶體配置設定機制中,優先使用實體記憶體,當實體記憶體還有空閑時(還夠用),不會釋放其占用記憶體,就算占用記憶體的程式已經被關閉了,該程式所占用的記憶體用來做緩存使用,對于開啟過的程式、或是讀取剛存取過得資料會比較快。
2、swap、虛拟記憶體和page
要明白這個首先要知道什麼是保護模式和實模式。
以前的作業系統是實模式,例如dos。每個時候隻有一個程序在跑,這個程序使用全部的實體記憶體。後來發展到保護模式,分時多程序。一個CPU上跑多個程序, 但程序不知道到底有多少記憶體可以用,它能通路記憶體最大位址。例如16位系統就能通路2^16byte,32位就是2^32位。但是實際上沒有那麼多記憶體阿?怎麼辦?保護模式就應運而生了。
假設程序是一個劉祥,裁判(系統)一發令他就開始跑步。但是裁判說給你1秒,可以跑100米。于是劉祥開始跑步(記憶體位址),一秒後劉祥隻跑了10米,裁判吹哨說:劉祥你先歇會,我要去給王軍霞吹哨呢,現記住你跑到哪裡了(保護),等會從這裡開始。裁判給王軍霞吹哨,一隻跑一秒,回來再給劉祥吹哨再跑1秒,如此往複。開始跑步的人少,劉祥還可以站在跑道上休息。後來跑步的人越來越多,跑道都擠滿了人,那麼隻能把一些人移動到跑道旁的草地上休息(交換)。後來發現有些人橫七豎八的躺着,占了不少空間,于是規定每個人隻能站着(page),這樣可以容納很多的人。
swap -- 草地,就是存放page的硬碟空間。
virtual memory -- 假設劉祥跑n圈就已經是到北京的距離了,可是他們還在原地。虛拟就是不存在的。
page -- 草地上的格,每次隻容納一個人。
為了提高磁盤存取效率, Linux做了一些精心的設計, 除了對dentry進行緩存(用于VFS,加速檔案路徑名到inode的轉換), 還采取了兩種主要Cache方式:
Buffer Cache和Page Cache.前者針對磁盤塊的讀寫,後者針對檔案inode的讀寫.這些Cache有效縮短了I/O系統調用(如read,write,getdents
)的時間.
記憶體活動基本上可以用3個數字來量化:活動虛拟記憶體總量,交換(swapping)率和調頁(paging)率.其中第一個數字表明記憶體的總需求量,後兩個數字表示那些記憶體中有多少比例正處在使用之中.目标是減少記憶體活動或增加記憶體量,直到調頁率保持在一個可以接受的水準上為止.
活動虛拟記憶體的總量(VM)=實際記憶體大小(size of real memory)(實體記憶體)+使用的交換空間大小(amount of swap space used)
當程式運作需要的記憶體大于實體記憶體時,UNIX系統采用了調頁機制,即系統copy一些記憶體中的頁面到磁盤上,騰出來空間供程序使用。大多數系統可以忍受偶爾的調頁,但是頻繁的調頁會使系統性能急劇下降。
UNIX記憶體管理:UNIX系統通過2種方法進行記憶體管理,“調頁算法”,“交換技術”。
調頁算法是将記憶體中最近不常使用的頁面換到磁盤上,把常使用的頁面(活動頁面)保留在記憶體中供程序使用。
交換技術是系統将整個程序,而不是部分頁面,全部換到磁盤上。正常情況下,系統會發生一些交換過程。
當記憶體嚴重不足時,系統會頻繁使用調頁和交換,這增加了磁盤I/O的負載。進一步降低了系統對作業的執行速度,即系統I/O資源問題又會影響到記憶體資源的配置設定。
Unix的虛拟記憶體:Unix的虛拟記憶體是一個十分複雜的子系統,它實作了程序間代碼與資料共享機制的透明性,并能夠配置設定比系統現有實體記憶體更多的記憶體,某些作業系統的虛存甚至能通過提供緩存功能影響到檔案系統的性能,各種風格的UNIX的虛存的實作方式差別很大,但都離不開下面的4個概念。
1:實際記憶體
實際記憶體是指一個系統中實際存在的實體記憶體,稱為RAM。實際記憶體是存儲臨時資料最快最有效的方式,是以必須盡可能地配置設定給應用程式,現在的RAM的形式有多種:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用糾錯機制(ECC)。
2:交換空間(swap)
交換空間是專門用于臨時存儲記憶體的一塊磁盤空間,通常在頁面排程和交換程序資料時使用,通常推薦交換空間的大小應該是實體記憶體的二到四倍。
3:頁面排程
頁面排程是指從磁盤向記憶體傳輸資料,以及相反的過程,這個過程之是以被稱為頁面排程,是因為Unix記憶體被平均劃分成大小相等的頁面;通常頁面大小為4KB和8KB(在Solaris中可以用pagesize指令檢視)。當可執行程式開始運作時,它的映象會一頁一頁地從磁盤中換入,與此類似,當某些記憶體在一段時間内空閑,就可以把它們換出到交換空間中,這樣就可以把空閑的RAM交給其他需要它的程式使用。
4:交換
頁面排程通常容易和交換的概念混淆,頁面排程是指把一個程序所占記憶體的空閑部分傳輸到磁盤上,而交換是指當系統中實際的記憶體已不夠滿足新的配置設定需求時,把整個程序傳輸到磁盤上,交換活動通常意味着記憶體不足。
vmstat監視記憶體性能:該指令用來檢查虛拟記憶體的統計資訊,并可顯示有關程序狀态、空閑和交換空間、調頁、磁盤空間、CPU負載和交換,cache重新整理以及中斷等方面的資訊。
測試:
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1592800 41124 319788 0 0 1084 95 791 375 6 28 57 10 0
[root@localhost ~]#
Procs
r: The number of processes waiting for run time.
運作的和等待(CPU時間片)運作的程序數,這個值也可以判斷是否需要增加CPU(長期大于1)
b: The number of processes in uninterruptable sleep.
處于不可中斷狀态的程序數,常見的情況是由IO引起的
w: The number of processes swapped out but otherwise runnable.
Memory
swpd: the amount of virtual memory used (kB).
free: the amount of idle memory (kB).
空閑的實體記憶體
buff: the amount of memory used as buffers (kB).
作為buffer cache的記憶體,對塊裝置的讀寫進行緩沖
cache: the amount of memory used as cache.
Swap
si: Amount of memory swapped in from disk (kB/s). 虛拟記憶體的頁導入(從SWAP DISK導入RAM)
so: Amount of memory swapped to disk (kB/s). 虛拟記憶體的頁導出.
(從RAM到SWAP DISK)
1、page in/out:系統運作過程中,它一般不會導緻嚴重的性能問題,即使你的實體記憶體再大,也難免會出現或多或少的PAGE IN/OUT,這是多任務作業系統的内在機制決定的;
2、swap in/out:一般來說是系統實體記憶體比較緊張的表現,它是PAGE IN/OUT行為的進一步更新,PAGE IN/OUT是說明系統記憶體不夠用,但僅僅是PAGE或BLOCK和磁盤的交換,但PAGE IN/OUT這種“記憶體不夠用”一般是很難滿足的,也是動态的。
3、page in/out和swap in/out的差別是:page in/out是PAGE 或BLOCK在記憶體和磁盤間交換,但swap in/out是整個程序空間的交換,這會産生嚴重的性能問題。
4、其實,PAGE、SWAP和SGA、PGA沒可比性啊,它們應該說有聯系,但不能對比着來讨論,前者是作業系統記憶體管理的一種行為,而後者是ORACLE資料庫的兩個和記憶體有關的參數,打個不恰當的比方:就象烹饪和飯量;
4、一般來說,sga和pga是基于作業系統的記憶體管理機制的,但具體dbms的緩沖内部是怎末管理的,我現在不是特别清楚,但我個人認為,DBMS的記憶體管理和一般軟體的記憶體管理是有差別的,這種差別是,DBMS的記憶體管理不是完全依賴于OS的,也就是DBMS在記憶體管理方面,自主性更強一些,各種DBMS的緩沖區管理機制也不完全相同,個人之見而已,大家一起讨論。
page in/out和swap in/out是作業系統行為,目的是記憶體緊張時,空出記憶體來供給其他程序使用,這和應用軟體從磁盤的讀入和寫出記憶體不是一回事情,也就是說,資料庫從磁盤讀入資料和寫出資料到磁盤的行為,不算是PAGE IN/OUT和SWAP IN/OUT,有關作業系統原理的書籍裡,應該有這部分内容。