最近處理線上問題的時候總是遇到用戶說我的主機swap分區怎麼用滿了,cache怎麼使用的很多,麻煩幫忙看看。。。
一、找出那些進程佔用swap內存
for i in `cd /proc;ls |grep "^[0-9]" |awk $0>100`;do awk '/Swap:/{a=a+$2}END{print '"$2"',a/1024"M"}' /proc/$i/smaps;done 2>&1 |sort -k2nr |head
二、linux什麼時候開始使用交換分區Swap的?
我們知道虛擬內存(Swap)是爲了滿足物理內存不足的情況而提出的策略,是利用磁盤空間虛擬出的一塊邏輯內存,作爲物理內存的擴展。當linux系統中物理內存不足的時候,就會使用交換分區的虛擬內存。更詳細的說,linux的內存管理採取的分頁存取機制,爲保證物理內存得到充分的利用,內核會在適當的時候將物理內存中不經常使用的數據塊自動交換到虛擬內存中,而將經常使用的信息保留在物理內存中,當需要使用到原始的內容時,這些信息又會被重新交換空間寫入到物理內存中。
當然,在linux系統中也有對Swap分區的參數設置:
# cat /proc/sys/vm/swappiness
60
# sysctl -a |grep vm.swappiness
vm.swappiness=60
上面的60代表的是:當物理內存被使用(100-60)%的時候纔會使用到swap,
vm.swappiness=0:表示最大限度使用物理內存,然後使用swap
vm.swappiness=100:表示積極的使用swap分區。
vm.swappiness=60:默認值
三、vm.swappiness 參數怎麼修改?
臨時修改:
# sysctl vm.swappiness=10
vm.swappiness=10
# cat /proc/sys/vm/swappiness
10
永久修改:
# sysctl vm.swappiness=10
vm.swappiness=10
# cat /proc/sys/vm/swappiness
10
# sysctl -p
或者
# vim /etc/sysctl.conf
增加或修改
vm.swappiness=10
# sysctl -p
四、如何釋放swap?
swap分區一旦釋放,存在在swap分區中的內容將會再次加載到物理內存中,釋放內存方法通常如下:
方法一、利用第一點的操作找到對應使用SWAP分區的進程,進行重啓。
方法二、當找不到具體的進程的時候,可以通過先關閉swap分區再開啓釋放。
注意:關閉分區前要確保系統空閒內存大於swap已經使用的內存,,否則有可能會導致宕機,後果比較嚴重。
1、查看當前分區掛載位置
swapon -s
2、關閉這個分區,
swapoff /dev/sda4(掛載點)
3、查看狀態
swapon -s
4、確認swap是否關閉
free -m (最下邊Swap對應全爲0,表示已關閉)
5、重新開啓swap
swapon /dev/sda4
6、查看是否掛載成功
swapon -s
7、查看swap是否釋放
free -m
或者使用:swapoff -a;swapon -a
五、如何釋放caches?
caches的關鍵配置文件是:/proc/sys/vm/drop_caches。記錄了釋放緩存的參數,默認爲0,即不釋放。其值可以有四種,分別代表不同的含義。
0 —— 不釋放;
1 ——釋放頁緩存;
2——釋放目錄緩存(dentries)和inodes
3——釋放所有緩存
一般使用如下方式清理:
sync;sync;sync;&& echo 1 > /proc/sys/vm/drop_caches
操作說明:
sync:將緩存寫回到硬盤中
echo 1 > /proc/sys/vm/drop_caches 修改drop_caches的值爲1,將釋放頁面緩存;
等待一會,保證上述命名執行完畢
echo 0 > /proc/sys/vm/drop_caches 將drop_caches 修改回默認值。