情況描述:

朋友在阿里雲上有一臺系統為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

memory和swap的關係

系統在什麼情況下才會使用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,問題解決了。

因為覺得以後可能會再次遇到這樣的情況,所以簡單記錄一下;