linux free命令以及系統內存占用過高的處理方式
第一行Mem,表示物理內存統計
total:總內存大小used:已使用內存大小free:當前空閑內存大小shared:多個進程共享的內存總額buffers/cached:緩存內存數據第二行-/+ buffers/cache:
(1)used 實際使用的內存,等于第一行的 used - buffers - cached
(2)free 實際可用內存,等于第一行的 free + buffers + cached
內存占用計算公式used/(used+free)
第三行Swap表示交換區的使用情況,也就是我們通常所說的虛擬內存。
free常用參數free -b #以Byte為單位顯示內存使用情況free -k #以KB為單位顯示內存使用情況,也是默認參數free -m #以MB為單位顯示內存使用情況free -g #以GB為單位顯示內存使用情況free -s<數字> #間隔數字秒數刷新顯示內存使用情況free -t #顯示內存總和列free -V#顯示當前版本在Linux系統下,我們一般不需要去釋放內存,因為系統已經將內存管理的很好。但是凡事也有例外,有的時候內存會被緩存占用掉,導致系統使用SWAP空間影響性能,此時就需要執行釋放內存(清理緩存)的操作了。
Linux系統的緩存機制是相當先進的,他會針對dentry(用于VFS,加速文件路徑名到inode的轉換)、Buffer Cache(針對磁盤塊的讀寫)和Page Cache(針對文件inode的讀寫)進行緩存操作。
但是在進行了大量文件操作之后,緩存會把內存資源基本用光。但實際上我們文件操作已經完成,這部分緩存已經用不到了。
這個時候,我們難道只能眼睜睜的看著緩存把內存空間占據掉么?
所以,我們還是有必要來手動進行Linux下釋放內存的操作,其實也就是釋放緩存的操作了。
要達到釋放緩存的目的,我們首先需要了解下關鍵的配置文件/proc/sys/vm/drop_caches。
這個文件中記錄了緩存釋放的參數,默認值為0,也就是不釋放緩存。他的值可以為0~3之間的任意數字,代表著不同的含義:
0 – 不釋放1 – 釋放頁緩存2 – 釋放dentries和inodes3 – 釋放所有緩存知道了參數后,我們就可以根據我們的需要,使用下面的指令來進行操作。
首先我們需要使用sync指令,將所有未寫的系統緩沖區寫到磁盤中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件。否則在釋放緩存的過程中,可能會丟失未保存的文件。
#sync接下來,我們需要將需要的參數寫進/proc/sys/vm/drop_caches文件中,比如我們需要釋放所有緩存,就輸入下面的命令:
#echo 3 > /proc/sys/vm/drop_caches此指令輸入后會立即生效,可以查詢現在的可用內存明顯的變多了。
要查詢當前緩存釋放的參數,可以輸入下面的指令:
cat /proc/sys/vm/drop_caches1.清理前內存使用情況
free -m2.開始清理
echo 1 > /proc/sys/vm/drop_caches3.清理后內存使用情況
free -m4.完成
查看內存條數命令:
dmidecode | grep -A16 'Memory Device$'linux 內存 占用較高問題排查查看內存情況#按 k 查看
free
#按兆M查看
free -m
#所以空閑內存=free+buffers+cached=total-used
內存的使用情況
cat /proc/meminfo查看進程的內存占用
pidstat -r -p 24427 1 5內存占用高的前20
ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20動態查看內存占用
slabtop
問題定位cached 占用過高問題
buffer,cached的作用:
cached主要負責緩存文件使用, 日志文件過大造成cached區內存增大把內存占用完 .
Free中的buffer和cache:(它們都是占用內存):
buffer : 作為buffer cache的內存,是塊設備(磁盤)的緩沖區,包括讀、寫磁盤cache: 作為page cache的內存, 文件系統的cache,包括讀、寫文件如果 cache 的值很大,說明cache住的文件數很多。
linux服務器會自動釋放內存,保障系統運行,但只會釋放夠用的內存,而不會去釋放更多的內存。
解決方法:
手動釋放cached方法有三種(系統默認值是0,釋放之后你需要再改回0值):
釋放前最好sync一下,防止丟數據
sync 在啟動機器或關機之前一定要運行sync命令。記住在任何情況下,慎重地執行sync命令決不會有任何壞處,sync命令強制把磁盤緩沖的所有數據寫入磁盤
To free pagecache: #echo 1 > /proc/sys/vm/drop_cachesTo free dentries and inodes: #echo 2 > /proc/sys/vm/drop_cachesTo free pagecache, dentries and inodes: #echo 3 > /proc/sys/vm/drop_caches#常用方法是
syncecho 1 > /proc/sys/vm/drop_caches#清除后要還原系統默認配置:
echo 0 > /proc/sys/vm/drop_caches#查看設置
sysctl -a | grep drop_caches補充: echo 字符串 > 文件 就是把字符串內容從定向到文件中
這時查看 free 可以看到 cached 降低了很多
總結以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。
