情況描述:
朋友在阿里雲上有一台系統為CentOS7的VPS,內存為2GB,用於平時開發自己的項目時測試使用;
他在上面運行了5個docker實例,運行java程序;還有一個mysql服務;
上述5個docker實例和mysql服務總共占用VPS1.35GB的內存,系統運行很慢。ssh連接輸入命令都有卡頓;
因為內存太小,沒什么可以優化的空間。所以准備啟用swap交換空間。
百度了一下收到博客文章, 通過文章中提供的方式添加swap空間;但是遇到一個問題,該centos7系統中,不存在/dev/zero文件,所以找到另一篇博客文章.
具體步驟如下:
1. 誤刪/dev/zero文件的解決方法如下兩條命令進行修復重建文件:
[root@localhost sslinux]# mknod /dev/zero c 1 5 [root@localhost sslinux]# chmod 666 /dev/zero
修復完成后用命令測試下是否可用,發現已經可以正常使用磁盤測試了
[root@localhost sq808sq]# dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
至此,/dev/zero 文件的修復重建工作已經完成(該文件為系統特殊文件丟失后不能從系統盤或其他系統直接復制使用,只能通過重建修復,/dev/null文件也是如此)
2.使用dd 命令 新增 swap空間(/var/swap)
dd if=/dev/zero of=/var/swap bs=1024 count=4096000 ls -lh /var/swap mkswap /var/swap mkswap -f /var/swap swapon /var/swap free -lh swapon /var/swap more /proc/swaps vim /etc/fstab free -lh
將swap設置為開機自動掛載:
[root@izbp12z8w3jbbgmy9yiz92z ~]# tail -1 /etc/fstab /var/swap swap swap defaults 0 0
但是此時使用 free -lh
命令查看memory和swap的使用情況,依舊沒什么變化。
1.swap 是存儲“暫時不需要使用的內存”到硬盤上,等到使用的時候再載入到內存中
這種情況只能說明,沒有“長期不使用的內存”
2.Swap 的使用量和 OOM 沒有直接關系。OOM 看的是申請量不是使用量。哪怕你內存沒用完都會觸發 OOM
系統在什么情況下才會使用SWAP?
實際上,並不是等所有的物理內存都消耗完畢之后,才去使用swap的空間,什么時候使用是由swappiness 參數值控制。
[root@rhce ~]# cat /proc/sys/vm/swappiness 60
該值默認值是60.
swappiness=0的時候表示最大限度使用物理內存,然后才是 swap空間,
swappiness=100的時候表示積極的使用swap分區,並且把內存上的數據及時的搬運到swap空間里面。
即內存足夠大的時候,swappiness設置盡量小; 內存較小的時候,swappiness要設置的盡量大;
如何修改swappiness參數?
- 臨時性修改:
[root@rhce ~]# sysctl vm.swappiness=10 vm.swappiness = 10 [root@rhce ~]# cat /proc/sys/vm/swappiness 10
- 永久修改:
在/etc/sysctl.conf 文件里添加如下參數:
vm.swappiness=10 [root@izbp12z8w3jbbgmy9yiz92z ~]# sed -i '$a vm.swappiness=100' /etc/sysctl.conf [root@izbp12z8w3jbbgmy9yiz92z ~]# sysctl vm.swappiness vm.swappiness = 100
到這里,系統就會盡可能的使用swap。 可以執行一個占用大量內存的命令看一下效果;
此時再查看內存和swap的使用情況:
[root@izbp12z8w3jbbgmy9yiz92z ~]# free -lh total used free shared buff/cache available Mem: 1.8G 899M 690M 1.5M 249M 779M Low: 1.8G 1.1G 690M High: 0B 0B 0B Swap: 3.9G 715M 3.2G
OK,問題解決了。
因為覺得以后可能會再次遇到這樣的情況,所以簡單記錄一下;