轉 linux 記憶體釋放

c3tc3tc3t發表於2014-01-03

原文 http://blog.zol.com.cn/2322/article_2321774.html

 

#cat /proc/meminfo | grep "MemFree" | awk '{print $2}'    (用來檢視free的記憶體有多少)之前先了解一下記憶體的基本知識#free -mtotal       used       free     shared    buffers     cached
Mem:         1002        769        232          0         62        421
-/+ buffers/cache:        286        715
Swap:         1153          0       1153

第一部分Mem行:
total 記憶體總數: 1002M
used 已經使用的記憶體數: 769M
free 空閒的記憶體數: 232M
shared 當前已經廢棄不用,總是0
buffers Buffer 快取記憶體數: 62M
cached Page 快取記憶體數:421M

關係:total(1002M) = used(769M) + free(232M)

第二部分(-/+ buffers/cache):
(-buffers/cache) used記憶體數:286M (指的第一部分Mem行中的used - buffers - cached)
(+buffers/cache) free記憶體數: 715M (指的第一部分Mem行中的free + buffers + cached)

可見-buffers/cache反映的是被程式實實在在吃掉的記憶體,而+buffers/cache反映的是可以挪用的記憶體總數。(從這裡我們可 以看出,實際上 :可用記憶體=第一部分Mem行中的free + buffers + cached,並不是只有free部分)
#sync
#sync
#echo 3   > /proc/sys/vm/drop_caches
#free -m

 


[root@server test]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,預設為0

[root@server test]# sync    #把記憶體裡的資料暫時寫到硬碟裡

手動執行sync命令(描述:sync 命令執行 sync 子例程。如果必須停止系統,則執行 sync 命令以確保檔案系統的完整性。sync 命令將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫對映檔案)

[root@server test]# echo 3 > /proc/sys/vm/drop_caches
[root@server test]# cat /proc/sys/vm/drop_caches
3

將/proc/sys/vm/drop_caches值設為3

[root@server test]# free -m
total       used       free     shared    buffers     cached
Mem:           249         66        182          0          0         11
-/+ buffers/cache:         55        194
Swap:          511          0        511

再來執行free命令,發現現在的used為66MB,free為182MB,buffers為0MB,cached為11MB.那麼有效的釋放了buffer和cache.

有關/proc/sys/vm/drop_caches的用法在下面進行了說明

/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches,
dentries and inodes from memory, causing that memory to become
free.

              To free pagecache, use echo 1 > /proc/sys/vm/drop_caches; to
free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to   free   pagecache,   dentries and inodes, use echo 3 >
/proc/sys/vm/drop_caches.

              Because this is a non-destructive operation and dirty objects
are not freeable, the user should run sync(8) first.

 


--記憶體釋放前

 

#sync

#echo 1 > /proc/sys/vm/drop_caches

記憶體釋放後:

 

echo 2 > /proc/sys/vm/drop_caches

echo 3 > /proc/sys/vm/drop_caches

cache釋放:

To free pagecache:

echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

echo 3 > /proc/sys/vm/drop_caches

說明,釋放前最好sync一下,防止丟資料。

因為LINUX的核心機制,一般情況下不需要特意去釋放已經使用的cache。這些cache起來的內容可以增加檔案以及的讀寫速度。

檢視記憶體條數命令:

#dmidecode |grep -A16 "Memory Device$"

先說下free命令怎麼看記憶體

[root@yuyii proc]# free

total used free shared buffers cached

Mem: 515588 295452 220136 0 2060 64040

-/+ buffers/cache: 229352 286236

Swap: 682720 112 682608

其中第一行用全域性角度描述系統使用的記憶體狀況:

total——總實體記憶體

used——已使用記憶體,一般情況這個值會比較大,因為這個值包括了cache+應用程式使用的記憶體

free——完全未被使用的記憶體

shared——應用程式共享記憶體

buffers——快取,主要用於目錄方面,inode值等(ls大目錄可看到這個值增加)

cached——快取,用於已開啟的檔案

note:

total=used+free

used=buffers+cached (maybe add shared also)

第二行描述應用程式的記憶體使用:

前個值表示-buffers/cache——應用程式使用的記憶體大小,used減去快取值

後個值表示+buffers/cache——所有可供應用程式使用的記憶體大小,free加上快取值

note:

-buffers/cache=used-buffers-cached

+buffers/cache=free+buffers+cached

第三行表示swap的使用:

used——已使用

free——未使用

cache釋放:

To free pagecache:

echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

echo 3 > /proc/sys/vm/drop_caches

說明,釋放前最好sync一下,防止丟資料。

 

附:

linux cache記憶體釋放bash 指令碼

#! /bin/sh
    freemem=$(cat /proc/meminfo | grep "MemFree" | awk '{print $2}')
       if [ $freemem -le 409600 ]
          then
               date  >> /var/log/mem.log
               free -m >> /var/log/mem.log
               sync
               sync
               echo 3 > /proc/sys/vm/drop_caches
               free -m >> /var/log/mem.log            
       fi

相關文章