前述:正常情況下swap分區使用率都很低或者幾乎為0。如果出現占用率很高的情況,最快捷的解決辦法就是查找到相關的進程id並重啟相關進程。
#查看占用swap分區進程id
for i in $( cd /proc;ls |grep "^[0-9]"|awk ' $0 >100') ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10
[root@localhost ~]# for i in $( cd /proc;ls |grep "^[0-9]"|awk ' $0 >100') ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10 5879 4685.23M 2143 10.4062M 5531 8.57031M 2349 3.82031M 2392 3.74609M 4580 3.63281M 2504 3.15625M 2491 2.76562M 4324 2.67969M 2565 2.61719M
可發現PID為5879的進程占用了4個多G,通過top命令發現此PID對應的是oracle下nmccollector。
[root@localhost ~]# top
top - 09:25:12 up 15 days, 16:01, 1 user, load average: 0.08, 0.07, 0.08
Tasks: 224 total, 1 running, 223 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.7%us, 0.4%sy, 0.0%ni, 98.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 7967824k total, 7810600k used, 157224k free, 416484k buffers
Swap: 12287992k total, 5077816k used, 7210176k free, 809840k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5879 ORACLE 20 0 11.5g 5.8g 15m S 1.3 76.4 81:53.50 nmccollector
經查詢資料發現nmccollector是OEM控制監測方面的,在EM下重啟此服務即可回收swap空間。打開EM,在首頁下方點擊“在內存中訪問模式下監視”,然后禁用內存訪問模式,這樣你的nmccollector.exe進程應該就會沒有,你再回到EM,開啟SQL訪問模式!
增加swap空間:
1.添加swap分區
使用dd命令創建/home/swap這么一個分區文件。文件的大小是2048000 個block,一般情況下1個block為1K,所以這里空間是2G。
dd if=/dev/zero of=/var/swapfile bs=1024 count=2048000 //添加交換文件並設置其大小為2G
2.執行完畢,對交換文件格式化並轉換為swap分區:
mkswap /var/swapfile
3.掛載並激活分區:
swapon /var/swapfile
4 賦權限
chmod -R 0600 /var/swapfile
現在再用free -m命令查看一下內存和swap分區大小,就發現增加了2G的空間了。
注意當計算機重啟了以后,發現swap還是原來那么大,新的swap沒有自動啟動,還要手動啟動。那我們需要修改/etc/fstab文件
5.設置開機自動掛載該分區:
vi /etc/fstab
在fstab文件末尾追加如下內容后:wq!保存即可:
/var/swapfile swap swap defaults 0 0