【LINUX】free 命令結果完全剖析
以下是筆者在虛擬機器上執行的debian系統的free情況。該虛擬機器記憶體只有128M,同時分配了256M的SWAP交換區。
total used free shared buffers cached
Mem: 124788 113432 11356 0 15308 75568
-/+ buffers/cache: 22556 102232
Swap: 245752 20 245732
第一行 (可以理解為從作業系統的角度來看記憶體分配)
total |
總實體記憶體大小。 |
used |
已分配的大小,注意,對作業系統來說任何被使用的記憶體都是used。 |
free |
未被分配的實體記憶體大小。 |
shared |
共享記憶體大小,主要用於程式間通訊,例如Oracle會使用上GB的共享記憶體。 |
buffers |
主要用於塊裝置資料緩衝,例如記錄檔案系統的metadata(目錄、許可權等等資訊)。 |
cached |
主要用於檔案內容緩衝 |
# 這裡補充一下關於檔案系統的常識 ^_^
# 檔案系統實際上可以粗略的劃分為兩個部分:
# (1)metadata:即通常說的後設資料,包括目錄結構、檔案的名字、大小、修改時間、許可權等等資訊。
# (2)filedata:即檔案中真正儲存的內容。
# 由於計算機中各個部件之間的速度相差很大,通常情況下CPU的cache最快,其次是記憶體,最慢的自然就是硬碟等外部裝置了。
# 而越慢的裝置越廉價,所以硬碟就被用來儲存大量資料(有一天記憶體不要錢了大家就不用在被buffer、cache這個東東折磨了 <( ̄︶ ̄)>)。
# 所以,檔案系統就被放在了硬碟上(不可避免的悲劇~~)。但是由於硬碟速度實在太慢了,為了改善IO效能,最終就誕生了"快取"這一概念。
# "快取"實際上就是在記憶體中劃分一塊區域作為硬碟和程式之間的緩衝區域,寫程式把資料寫到這裡然後就幹其他事情去了,讀程式需要時先在這裡找,找不到再去找硬碟,這樣就大大提高了讀寫效率,同時縮短了IO等待時間,否則你在linux上執行man iptables 這樣的命令的時候每次都會等N久。。。
# 這裡還有一個"實體記憶體"和"虛擬記憶體"的概念,這個概念比較難講,大家去google一些大牛的帖子看吧,涉及的東西太多了。。。。
所以,這裡,buffer實際上是用來儲存了檔案系統的後設資料(這樣我們每次ls就會很快了 ^_^),而cache則快取了近期讀寫過的檔案的內容(第一次讀檔案會很慢,以後就會很快,就是因為有cache的存在),把這個理解了free命令就理解了大半了。
繼續講。。。
第二行 (可以理解為從應用程式的角度來看記憶體分配)
-/+ buffers/cached: 22556 102232
這裡的 -/+ 實際上分別指的是 - buffers/cached 和 + buffers/cached 兩個部分。
- buffers/cached |
= used(第一行) - buffers - cached |
實際上是程式當前"真實使用"的"實體記憶體"的大小。 |
+ buffers/cached |
= buffers + cached |
兩個加起來可以理解為"暫時借給"系統作為"緩衝區"使用的記憶體大小。 |
大家做一下簡單的加減法就清楚了:
從應用多角度來說,實際上系統還可以分配給他的記憶體有這麼多:11356(free) + 15308(buffers) + 75568(cached)= 102232(free)
而系統所擁有的總的實體記憶體大小 113432 = 22556( - buffers/cached) + 102232 (+ buffers/cached)
所以,第一行的資料實際上是從作業系統角度來看的。
對於作業系統來說已分配的記憶體表示已經被某些資料所佔據了,但是具體這些數資料是用來做什麼的他不會去理會。
實際上正如前面所說,這部分實體記憶體被拿來做"快取"了。
但是,是不是應用就不能使用了呢?
當然不是!!!!
不然我也不用寫了,大家都懂了。。。
前面說到buffers和cached這部分記憶體是"借給"作業系統使用的,之所以說是"借的",這裡主要原因還在於"虛擬記憶體"與"實體記憶體"的區別。
對於應用來說,我申請了1000KB的記憶體,作業系統同意了,給程式一個地址,告訴他你要的記憶體在這裡,然後程式就拿著這個地址去用了。
但是實際上大多數時候程式不會立刻將這些記憶體使用掉,而是一點一點的使用,所以,在沒有使用之前,系統就能將這一部分實體記憶體拿去做其他事情已提升整個系統的效能,比如說這裡的"快取"。
當然,這樣理解"虛擬記憶體"是非常片面的,實際情況比這要複雜得多,比如說這還涉及到程式的執行空間、程式碼的編譯、連結、載入等等,必須結合起來才能解釋清楚為什麼需要虛擬記憶體,實際上"虛擬記憶體"是一個抽象的概念的實現,大大簡化了作業系統和應用的設計複雜度。
雖然要講的太多太多,但是,今天這樣理解"虛擬記憶體"在這裡也夠用了。 ^_^
在這裡作業系統就相當於"借"了一部分記憶體出去以提高系統的IO效能。
對於"虛擬記憶體"和"實體記憶體"可以透過ps aux命令簡單看一下:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1471 0.0 0.3 2152 428 ? S 15:55 0:00 /usr/bin/daemon /etc/init.d/mpt-statusd check_mpt
root 1474 0.0 0.4 1748 556 ? S 15:55 0:00 /bin/sh /etc/init.d/mpt-statusd check_mpt
VSZ這一列顯示的就是對應程式所分配的"虛擬記憶體"大小,而RSS則是程式實際使用的記憶體,VSZ實際是比RSS要大的,說明程式沒有使用到他所申請的那麼多記憶體,如果分配出去了肯定是閒的蛋疼。。。你的機器也不能像現在這樣一邊跑QQ一邊看網頁。。。開個chrome就完蛋了。。
細心的同學會發現,上面講的這個"借"的過程和銀行的業務很相似,大家把手裡的現錢存到銀行去,銀行給我們一張卡,卡上有個卡號,銀行說"憑這個卡和密碼你就可以隨時來取錢了"。然後我們就放心的把錢存在銀行裡,等需要錢的時候就拿著卡去取錢,而銀行這時候也能拿著我們的錢去投資修橋補路。
唯一的區別可能就是銀行有利息,這裡麼有~~~~~
扯遠了,回到主題上。
好,既然我們說這個記憶體是"借"來的,那當然有程式會拿著地址過來要記憶體的時候(就跟取錢一樣)。
這時候作業系統就會從第一行的free這裡去找空閒記憶體分給程式用。
但是大家肯定發現了,大部分的記憶體是被buffers和cached佔用了,萬一來個需求大的記憶體的時候怎麼辦?
答案很簡單嘛,把放出去的"貸款"收回來唄~~~~
那就從buffers和cached中釋放記憶體,同時將所釋放空間中的資料回寫到硬碟上,防止資料丟失。
再插一句,要是buffers和cached也沒了怎麼辦?那"銀行"就只有從其他地方"借錢"來還了~~~
這次"借"就是從硬碟借了,也就是我們所說的分配SWAP空間,將一部分記憶體頁面換到SWAP空間中。
當然實際的處理過程系統不會等到buffers和cached回收完才使用SWAP空間的,比你想象的要輕易得多,因為有時候縮小"快取"的效能代價比使用SWAP空間更高,Linux系統還是很smart的~~~
回來繼續說。
那什麼時候系統會開始回收buffers和cached部分的記憶體呢?
這裡要看一下資料:
root@debian01:~# cat /proc/meminfo
MemTotal: 124788 kB
MemFree: 11596 kB
Buffers: 15332 kB
Cached: 75568 kB
SwapCached: 20 kB
Active: 54884 kB
Inactive: 45564 kB
Active(anon): 2124 kB
Inactive(anon): 7560 kB
Active(file): 52760 kB
Inactive(file): 38004 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 124788 kB
LowFree: 11596 kB
SwapTotal: 245752 kB
SwapFree: 245732 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 9544 kB
Mapped: 5884 kB
Shmem: 136 kB
Slab: 8784 kB
SReclaimable: 4940 kB
SUnreclaim: 3844 kB
KernelStack: 528 kB
PageTables: 456 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 308144 kB
Committed_AS: 43272 kB
VmallocTotal: 897016 kB
VmallocUsed: 6344 kB
VmallocChunk: 879908 kB
HardwareCorrupted: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 4096 kB
DirectMap4k: 16384 kB
DirectMap4M: 114688 kB
meminfo的資料比較多,這裡就不細講了,我們只關注一個資料。
LowFree: 11596 kB
實際上當free部分的記憶體小於這個值的時候,系統就會考慮是否需要回收"快取"部分的實體記憶體,當然這不是絕對的,這可以作為一個參考閥值。
刪除線這段話有問題,正在研究
OK,最後一部分。
說了這麼多,那麼到底有沒有辦法強制釋放呢??
當然有啊!!!銀行欠你錢你會不去要???
話說辦法其實很簡單,在控制檯執行以下命令即可:
echo 3 > /proc/sys/vm/drop_caches
這裡的"3"表示釋放所有buffers和cached中能釋放的部分。
root@debian01:~# echo 3 > /proc/sys/vm/drop_caches
root@debian01:~# free
total used free shared buffers cached
Mem: 124788 26764 98024 0 148 6144
-/+ buffers/cache: 20472 104316
Swap: 245752 20 245732
手工釋放以後大家可以測試一下,執行幾次類似以下這些命令,會明顯發現又漲上去了。。。
ls -la /dev/
find / -name *.sh
man iptables
root@debian01:~# free
total used free shared buffers cached
Mem: 124788 87368 37420 0 30692 25512
-/+ buffers/cache: 31164 93624
Swap: 245752 20 245732
end,轉載只為記錄
原文地址:http://blog.chinaunix.net/uid-15007890-id-3067490.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29487349/viewspace-2062850/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- free命令結果分析
- [轉帖]剖析free命令
- Linux netstat命令結果分析Linux
- Linux之free命令Linux
- 如何讓crs_stat命令結果中的name列完全顯示
- Linux free命令詳解Linux
- Linux systemctl 命令完全指南Linux
- linux下free命令詳解Linux
- 每天一個 Linux 命令(45): free 命令Linux
- 每天一個linux命令(45):free 命令Linux
- linux環境中ab命令簡介及結果分析Linux
- Linux效能調優命令之freeLinux
- linux基礎學習 - free命令Linux
- Linux系統下ifconfig命令使用及結果分析Linux
- free命令
- free 命令
- Shell的命令的結果重定向
- MySQL的EXPLAIN命令結果詳解MySqlAI
- 慢動作輸出 Linux 命令結果並用彩色顯示Linux
- Docker--docker ps 命令與結果解析Docker
- linux 下c/c++ 使用shell命令並加入引數、儲存結果LinuxC++
- 【linux】free命令中cached和buffers的區別Linux
- Linux free 命令中cached 和 buffers 的區別Linux
- MySQL show status命令輸出結果詳解MySql
- linux命令檢視記憶體命令free -h whereis locate find查詢命令Linux記憶體
- free 命令詳解
- Linux命令總結--mkdir命令Linux
- Linux 中國徽標徵集活動結果Linux
- 《Linux系統free命令的使用》學習筆記Linux筆記
- 獲取多臺主機命令執行結果
- systemctl 命令完全指南
- linux命令總結Linux
- Linux 命令總結Linux
- shell前一個命令結果作為下一個命令引數
- Nginx 原始碼完全剖析(11)ngx_spinlockNginx原始碼
- MySQL pager和nopager命令--不顯示查詢結果MySql
- Java在Linux環境下執行MySQL命令無法獲取結果的問題JavaLinuxMySql
- Linux shell命令總結Linux