手工釋放linux記憶體——/proc/sys/vm/drop_cache
linux的記憶體檢視:
[[email protected] 0.1.0]# free -m
total used free shared buffers cached
Mem: 4032 694 3337 0 0 25
需要說明的是,mem的used=free+buffers+cached,有些情況是cached佔用很多資源,算起來數值就是不對,其實不影響實際使用,下面轉載部分有說明如何清除cached的佔用(實際上可以不清除,不會影響實際使用)
當在Linux下頻繁存取檔案後,實體記憶體會很快被用光,當程式結束後,記憶體不會被正常釋放,而是一直作為caching。這個問題,貌似有不少人在問,不過都沒有看到有什麼很好解決的辦法。那麼我來談談這個問題。
一、通常情況
先來說說free命令:
引用[[email protected] ~]# free -m
total used free shared buffers cached
Mem: 249 163 86 0 10 94
-/+ buffers/cache: 58 191
Swap: 511 0 511
其中:
引用total 記憶體總數
used 已經使用的記憶體數
free 空閒的記憶體數
shared 多個程序共享的記憶體總額
buffers Buffer Cache和cached Page Cache 磁碟快取的大小
-buffers/cache 的記憶體數:used - buffers - cached
+buffers/cache 的記憶體數:free + buffers + cached
可用的memory=free memory+buffers+cached。
有了這個基礎後,可以得知,我現在used為163MB,free為86MB,buffer和cached分別為10MB,94MB。
那麼我們來看看,如果我執行復制檔案,記憶體會發生什麼變化.
引用[[email protected] ~]# cp -r /etc ~/test/
[[email protected] ~]# free -m
total used free shared buffers cached
Mem: 249 244 4 0 8 174
-/+ buffers/cache: 62 187
Swap: 511 0 511
在我命令執行結束後,used為244MB,free為4MB,buffers為8MB,cached為174MB,天吶,都被cached吃掉了。別緊張,這是為了提高檔案讀取效率的做法。
為了提高磁碟存取效率,Linux做了一些精心的設計,除了對dentry進行快取(用於VFS,加速檔案路徑名到inode的轉換),還採取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁碟塊的讀寫,後者針對檔案inode的讀寫。這些Cache有效縮短了 I/O系統呼叫(比如read,write,getdents)的時間。
那麼有人說過段時間,linux會自動釋放掉所用的記憶體。等待一段時間後,我們使用free再來試試,看看是否有釋放?
[[email protected] test]# free -m
total used free shared buffers cached
Mem: 249 244 5 0 8 174
-/+ buffers/cache: 61 188
Swap: 511 0 511
似乎沒有任何變化。(實際情況下,記憶體的管理還與Swap有關)
那麼我能否手動釋放掉這些記憶體呢?回答是可以的!
二、手動釋放快取
/proc是一個虛擬檔案系統,我們可以通過對它的讀寫操作做為與kernel實體間進行通訊的一種手段。也就是說可以通過修改/proc中的檔案,來對當前kernel的行為做出調整。那麼我們可以通過調整/proc/sys/vm/drop_caches來釋放記憶體。操作如下:
[[email protected] test]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,預設為0。
[[email protected] test]# sync
手動執行sync命令(描述:sync 命令執行 sync 子例程。如果必須停止系統,則執行sync 命令以確保檔案系統的完整性。sync 命令將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫對映檔案)
[[email protected] test]# echo 3 > /proc/sys/vm/drop_caches
[[email protected] test]# cat /proc/sys/vm/drop_caches
3
將/proc/sys/vm/drop_caches值設為3
[[email protected] 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 first.
三、我的意見
上述文章就長期以來很多使用者對Linux記憶體管理方面的疑問,給出了一個比較“直觀”的回覆,我更覺得有點像是核心開發小組的妥協。
對於是否需要使用這個值,或向用戶提及這個值,我是有保留意見的:
1、從man可以看到,這值從2.6.16以後的核心版本才提供,也就是老版的作業系統,如紅旗DC 5.0、RHEL 4.x之前的版本都沒有;
2、若對於系統記憶體是否夠用的觀察,我還是原意去看swap的使用率和si/so兩個值的大小;
使用者常見的疑問是,為什麼free這麼小,是否關閉應用後記憶體沒有釋放?
但實際上,我們都知道這是因為Linux對記憶體的管理與Windows不同,free小並不是說記憶體不夠用了,應該看的是free的第二行最後一個值:"-/+ buffers/cache: 58 191" 這才是系統可用的記憶體大小。
實際專案中告訴我們,如果因為是應用有像記憶體洩露、溢位的問題,從swap的使用情況是可以比較快速可以判斷的,但free上面反而比較難檢視。相反,如果在這個時候,我們告訴使用者,修改系統的一個值,“可以”釋放記憶體,free就大了。使用者會怎麼想?不會覺得作業系統“有問題”嗎?所以說,我覺得既然核心是可以快速清空buffer或cache,也不難做到(這從上面的操作中可以明顯看到),但核心並沒有這樣做(預設值是0),我們就不應該隨便去改變它。一般情況下,應用在系統上穩定運行了,free值也會保持在一個穩定值的,雖然看上去可能比較小。當發生記憶體不足、應用獲取不到可用記憶體、OOM錯誤等問題時,還是更應該去分析應用方面的原因,如使用者量太大導致記憶體不足、發生應用記憶體溢位等情況,否則,清空buffer,強制騰出free的大小,可能只是把問題給暫時遮蔽了。
我覺得,排除記憶體不足的情況外,除非是在軟體開發階段,需要臨時清掉buffer,以判斷應用的記憶體使用情況;或應用已經不再提供支援,即使應用對記憶體的時候確實有問題,而且無法避免的情況下,才考慮定時清空buffer。(可惜,這樣的應用通常都是執行在老的作業系統版本上,上面的操作也解決不了)。
測試
[[email protected] ~]# uname -a
Linux testserver 2.6.18-164.el5 #1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
[[email protected] ~]# free -m
total used free shared buffers cached
Mem: 2013 1661 352 0 223 1206
-/+ buffers/cache: 231 1782
Swap: 2047 0 2047
[[email protected] ~]# sync
[[email protected] ~]# sync
[[email protected] ~]# cat /proc/sys/vm/drop_caches
0
[[email protected] ~]# echo 3 > /proc/sys/vm/drop_caches
[[email protected] ~]# cat /proc/sys/vm/drop_caches
3
[[email protected] ~]# free -m
total used free shared buffers cached
Mem: 2013 100 1913 0 0 14
-/+ buffers/cache: 85 1927
Swap: 2047 0 2047
[[email protected] ~]#
相關推薦
手工釋放linux記憶體——/proc/sys/vm/drop_cache
linux的記憶體檢視: [[email protected] 0.1.0]# free -m total used free shared buffers cached Mem: 4032
手工釋放linux記憶體——/proc/sys/vm/drop cache
linux的記憶體檢視:[[email protected] 0.1.0]# free -m total used free shared buffers cachedMem: 4032
spark on yarn模式裡需要有時手工釋放linux記憶體
歡迎您的加入! 微信公眾號平臺: 大資料躺過的坑 微信公眾號平臺: 人工智慧躺過的坑 大資料和人工智慧躺過的坑(總群): 161156071 更多QQ技術分群,詳情請見:http://www.cnblogs.com/zls
linux /proc/sys/vm/中各個文件含義
交換 情況 正在 you mem 最新 bytes cluster rect 1) /proc/sys/vm/block_dump該文件表示是否打開Block Debug模式,用於記錄所有的讀寫及Dirty Block寫回動作。 缺省設置:0,禁用Block De
echo N>/proc/sys/vm/drop_caches清理快取
echo N>/proc/sys/vm/drop_caches清理快取 引言:在核心視窗—proc檔案系統這篇筆記中,我們介紹了/proc主要體現程序及核心資訊狀態。與/proc下其它檔案的“只讀”屬性不同的是,管理員可對/proc/sys子目錄的許多檔
如何在Linux作業系統中手工釋放記憶體快取?
在Linux作業系統中,我們一般不需要去釋放記憶體,因為系統已經將記憶體管理的很好。但是凡事也有例外,比如:1)當記憶體被快取佔用掉,導致系統使用SWAP空間並最終影響了系統性能;2)有些環境上部署了監控軟體用於檢測記憶體使用率的,那麼當記憶體使用率達到一定上限(例如:80%)時,就會報警。因此在這
Linux下的重要目錄/proc, /sys, /SElinux, /bin, /usr/lib, /usr/local, /var, /tmp
(1)/proc 只存在記憶體當中,而不佔用外存空間,在此目錄下可以檢視當前作業系統都有哪些程序(ls /proc),如下圖 (2)/bin 存放使用者最長用的命令,如:cp、ls、cat,等等。 (3)/usr /usr 我們用到的應用
【Linux】查詢資料, 瞭解以下Linux下的重要目錄/proc, /sys, /SElinux, /bin, /usr/lib, /usr/local, /var, /tmp
/proc /proc是linux核心中提供的檔案系統,在執行訪問核心資料結構,改變核心設定的機制。proc是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過proc得到系統的資訊,並可
Linux: 瞭解以下Linux下的重要目錄/proc, /sys, /SElinux, /bin, /usr/lib, /usr/local, /var, /tmp
簡單介紹各個目錄的作用: /proc /proc是linux核心中提供的檔案系統, 該目錄的資料都在記憶體中,如系統核心,外部裝置,網路狀態,由於資料都存放於記憶體中,所以不佔用磁碟空間,在執行訪問核心資料結構,改變核心設定的機制。它以檔案系統的方式為訪問系統核
Linux記憶體清理/釋放命令
NameNode節點忽然掛了,重啟後提示OOM,但是這臺測試機的記憶體是16G的,只運行了Namenode和Jenkins,不至於OOM。於是使用free命令檢視,發現cached的快取有10G。很不正常,於是需要進行快取釋放。echo 1 > /proc/sys/vm/drop_caches此時在使用
關於linux 記憶體重複釋放的問題
記憶體申請函式malloc,對應的釋放函式為free,多次釋放會造成系統未知問題,鑑於free對指標指向NULL的指標釋放後不會有任何操作,因此有必要在釋放後將指標清0。但有時候將指標傳給其它函式時,比如被其它函式呼叫後再釋放就可能要注意點,如下函式 #include &l
Linux下的共享記憶體(01)---檢視和釋放共享記憶體
說明: 1、檢視共享記憶體,使用命令ipcs:ipcs -m 2、刪除共享記憶體,使用命令ipcrm:ipcrm -m [shmid] 使用如下: [[email protected]
Linux網路管理員不得不瞭解的系統目錄/proc/sys/net/(網路配置)
2、/proc/sys/net/目錄下的檔案內容也可以通過用echo命令來修改。例如:echo 1 > /proc/sys/net/ipv4/ip_forward用來設定允許IP包轉發;echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all用來設定
如何釋放linux cache佔用的記憶體
[[email protected] ~]# free -m total used free shared buffers cached Mem: 3792 3663 128
linux 記憶體清理/釋放命令
在Linux系統下,我們一般不需要去釋放記憶體,因為系統已經將記憶體管理的很好。但是凡事也有例外,有的時候記憶體會被快取佔用掉,導致系統使用SWAP空間影響效能,此時就需要執行釋放記憶體(清理快取)的操作了。 Linux系統的快取機制是相當先進的,他會針對dentry(用於
/proc/sys/net/ipv4/配置Linux網路引數
1) /proc/sys/net/ipv4/ip_forward 該檔案表示是否開啟IP轉發。 0,禁止 1,轉發 預設設定:0 2) /proc/sys/net/ipv4/ip_default_ttl 該檔案表示一個數據報的生存週期(TimeTo Li
Linux記憶體管理之三 頁的分配和釋放
如上圖,Linux分配頁時,只能分配2^n個頁。核心維護MAX_ORDER個連結串列,每個連結串列記錄著連續的空閒頁。第一個連結串列中的每一項為1個空閒頁,第二個連結串列中的每一項為2個空閒頁,第三個連結串列中的每一項為4個空閒頁。。。,依次類推。分配頁時,從對應的連結串列上摘除空閒頁;釋放頁時,將對應的頁歸
Linux記憶體cached釋放
我們用free命令檢視系統記憶體使用情況的時候會發現: #free -m total used free shared buffers cachedMem: 24359
Linux記憶體管理之slab機制(釋放物件)
Linux核心中將物件釋放到slab中上層所用函式為kfree()或kmem_cache_free()。兩個函式都會呼叫__cache_free()函式。 程式碼執行流程: 1,當本地CPU cache中空閒物件數小於規定上限時,只需將物件放入本地CPU cache中;
【轉】Linux下/proc目錄簡介
map kms slab proc文件系統 文件格式 應用 environ 一段時間 內存映射 1. /proc目錄Linux 內核提供了一種通過 /proc 文件系統,在運行時訪問內核內部數據結構、改變內核設置的機制。proc文件系統是一個偽文件系統,它只存在內存當中,而