Linux記憶體詳解

2022-05-09 21:14:37 字數 4329 閱讀 2559

--linux記憶體詳解

-----------------2014/05/24

linux的記憶體上表現的不像windows那麼直觀,本文準備詳細的介紹一下linux的記憶體。

請看這下有linux命令free和vmstat輸出的記憶體資訊。

mem行used表示已經分配的記憶體,free表示尚未分配的記憶體,shared表示共享記憶體。

計算方法:快取統計行free=mem(free)+mem(buffers)+mem(cached)

共享記憶體

對於共享記憶體(shared memory),主要用於在unix 環境下不同程序之間共享資料,是程序間通訊的一種方法,一般的應用程式不會申請使用共享記憶體,筆者也沒有去驗證共享記憶體對上面等式的影響。

例如linux平台的oracle為多程序程式,sga和pga都是各程序共享和通訊的資料區域,所有可以看到分配了很大的共享記憶體。而mysql為多執行緒,系統級表現為乙個程序,不需要共享記憶體。

linux的cache和buffer有何區別

linux下對檔案的訪問和裝置的訪問通常會被cache起來加快訪問速度,這個是系統的預設行為。 而cache需要耗費我們的記憶體,雖然這個記憶體最後可以通過echo 3>/proc/sys/vm/drop_caches這樣的命令來主動釋放。但是有時候我們還是需要理解誰消耗了我們的記憶體。

我們來先了解下記憶體的使用情況:

[root@my031045 ~]# free

total used free shared buffers cached

mem: 24676836 626568 24050268 0 30884 508312

-/+ buffers/cache: 87372 24589464

swap: 8385760

page cache和buffer cache一直以來是兩個比較容易混淆的概念,在網上也有很多人在爭辯和猜想這兩個cache到底有什麼區別,討論到最後也一直沒有乙個統一和正

確的結論,在我工作的這一段時間,page cache和buffer cache的概念曾經困擾過我,但是仔細分析一下,這兩個概念實際上非常的清晰。如果能夠了解到這兩個cache的本質,那麼我們在分析io問題的時候可能會更加得心應手。 page cache實際上是針對檔案系統的,是檔案的快取,在檔案層面上的資料會快取到page cache。檔案的邏輯層需要對映到實際的物理磁碟,這種對映關係由檔案系統來完成。當page cache的資料需要重新整理時,page cache中的資料交給buffer cache,但是這種處理在2.6版本的核心之後就變的很簡單了,沒有真正意義上的cache操作。

buffer cache是針對磁碟塊的快取,也就是在沒有檔案系統的情況下,直接對磁碟進行操作的資料會快取到buffer cache中,例如,檔案系統的元資料都會快取到buffer cache中。

簡單說來,page cache用來快取檔案資料,buffer cache用來快取磁碟資料。在有檔案系統的情況下,對檔案操作,那麼資料會快取到page cache,如果直接採用

dd等工具對磁碟進行讀寫,那麼資料會快取到buffer cache補充一點,在檔案系統層每個裝置都會分配乙個def_blk_ops的檔案操作方法,這是裝置的操作方法,在每個裝置的inode下面會存在乙個radix tree,這個radix tree下面將會放置快取資料的page頁。這個page的數量將會在top程式的buffer一欄中顯示。如果裝置做了檔案系統,那麼會生成乙個inode,這個inode會分配ext3_ops之類的操作方法,這些方法是檔案系統的方法,在這個inode下面同樣存在乙個radix tree,這裡會快取檔案的page頁,快取頁的數量在top程式的cache一欄進行統計。從上面的分析可以看出,2.6核心中的buffer cache和page cache在處理上是保持一致的,但是存在概念上的差別,page cache針對檔案的cache,buffer是針對磁碟塊資料的cache,僅此而已。

有了偉大的systemtap, 我們可以用stap指令碼來了解誰在消耗我們的cache了:

#這個命令列用來調查誰在加資料入page_cache

[root@my031045 ~]# stap -e 'probe vfs.add_to_page_cache '

...dev=2, devname=n/a, ino=0, index=2975, nrpages=1777

dev=2, devname=n/a, ino=0, index=3399, nrpages=2594

dev=2, devname=n/a, ino=0, index=3034, nrpages=1778

dev=2, devname=n/a, ino=0, index=3618, nrpages=2595

dev=2, devname=n/a, ino=0, index=1694, nrpages=106

dev=2, devname=n/a, ino=0, index=1703, nrpages=107

dev=2, devname=n/a, ino=0, index=1810, nrpages=210

dev=2, devname=n/a, ino=0, index=1812, nrpages=211

...

這時候我們拷貝個大檔案:

[chuba@my031045 ~]$ cp huge_foo.file  bar

#這時候我們可以看到檔案的內容被猛的新增到cache去:

...dev=8388614, devname=sda6, ino=2399271, index=39393, nrpages=39393

dev=8388614, devname=sda6, ino=2399271, index=39394, nrpages=39394

dev=8388614, devname=sda6, ino=2399271, index=39395, nrpages=39395

dev=8388614, devname=sda6, ino=2399271, index=39396, nrpages=39396

dev=8388614, devname=sda6, ino=2399271, index=39397, nrpages=39397

dev=8388614, devname=sda6, ino=2399271, index=39398, nrpages=39398

dev=8388614, devname=sda6, ino=2399271, index=39399, nrpages=39399

dev=8388614, devname=sda6, ino=2399271, index=39400, nrpages=39400

dev=8388614, devname=sda6, ino=2399271, index=39401, nrpages=39401

dev=8388614, devname=sda6, ino=2399271, index=39402, nrpages=39402

dev=8388614, devname=sda6, ino=2399271, index=39403, nrpages=39403

dev=8388614, devname=sda6, ino=2399271, index=39404, nrpages=39404

dev=8388614, devname=sda6, ino=2399271, index=39405, nrpages=39405

dev=8388614, devname=sda6, ino=2399271, index=39406, nrpages=39406

dev=8388614, devname=sda6, ino=2399271, index=39407, nrpages=39407

dev=8388614, devname=sda6, ino=2399271, index=39408, nrpages=39408

dev=8388614, devname=sda6, ino=2399271, index=39409, nrpages=39409

dev=8388614, devname=sda6, ino=2399271, index=39410, nrpages=39410

dev=8388614, devname=sda6, ino=2399271, index=39411, nrpages=39411

...

如果需要手動釋放linux系統的cache,可以參考博文:

Linux 記憶體引數詳解

free 命令相對於top 提供了更簡潔的檢視系統記憶體使用情況 free total used free shared buffers cached mem 255268 238332 16936 0 85540 126384 buffers cache 26408 228860 swap 265...

Linux記憶體管理 函式詳解

0.11核提供的記憶體管理函式大部分在memery.c中,我將其中的函式從功能上分為三類 記憶體的分配與釋放 頁異常處理和記憶體初始化。第一類主 要包括單個物理頁的操作和頁表的操作,單個物理頁的操作就是乙個物理頁的申請 對映和釋放 頁表操作主要是多個頁表的釋放 複製。第二類主要是處理缺頁異 常和寫保...

Linux 記憶體釋放命令詳解

我使用的是centos 6.5 由於解除安裝solr 後發現記憶體占用挺多的,我想釋放一下記憶體,就查閱了一些資料,分享給大家 1.free m 檢視內www.cppcns.com存的使用情況,m表示單位是兆 2.echo 1 proc sys vm drop cwww.cppcns.comache...