Linux 使用 swap交換空間

剛剛買的服務器內存太小了,找了一下原來的命令,乾脆搬到CSDN上。文檔多了很難找

第一:創建swap

[root@izwz99z5o9dc90keftqhlrz mnt]# dd if=/dev/zero of=/mnt/swap/swapfile bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 37.1569 s, 116 MB/s

命令說明:創建一個4096M 的swap,耗時37S,平均速率:116MB/s

第二:開機自動加載

[root@izwz99z5o9dc90keftqhlrz mnt]# mkswap swapfile
swapfile: No such file or directory

[root@izwz99z5o9dc90keftqhlrz mnt]# cd /mnt/swap
[root@izwz99z5o9dc90keftqhlrz swap]# mkswap swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=a392d881-3673-49da-a30c-f04c2fd7ee78

/mnt/swap  下面來操作
[root@izwz99z5o9dc90keftqhlrz mnt]# vim /etc/fstab
加入下面這一段:/mnt/swap/swapfile 上面我們創建的

/mnt/swap/swapfile   swap              swap        defaults        0 0

 第三:現在掛載使用

[root@izwz99z5o9dc90keftqhlrz swap]# swapon /mnt/swap/swapfile
swapon: /mnt/swap/swapfile: insecure permissions 0644, 0600 suggested.

[root@izwz99z5o9dc90keftqhlrz swap]# 

第四:卸載下來 

[root@izwz99z5o9dc90keftqhlrz swap]# swapoff /mnt/swap/swapadd

 

題外話: 

[root@izwz99z5o9dc90keftqhlrz swap]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.8G        3.1G         75M        440K        621M        507M
Swap:          4.0G          0B        4.0G
[root@izwz99z5o9dc90keftqhlrz swap]# 

第五:swap推薦設置

4G以內的物理內存,SWAP 設置爲內存的2倍。
 
4-8G的物理內存,SWAP 等於內存大小。
 
8-64G 的物理內存,SWAP 設置爲8G。
 
64-256G物理內存,SWAP 設置爲16G。

第六:swappiness到底是用來調節什麼的?

系統使用swap的規則閾值(實際上,並不是等所有的物理內存都消耗完畢之後,纔去使用swap的空間,什麼時候使用是由swappiness 參數值控制。

# 查看當前設置
cat /proc/sys/vm/swappiness
 
# swappiness=0的時候表示最大限度使用物理內存,然後纔是 swap空間。
# swappiness=100的時候表示積極的使用swap分區,並且把內存上的數據及時的搬運到swap空間裏面。
 
# 臨時修改
sysctl vm.swappiness=80
 
#永久修改,在/etc/sysctl.conf 文件裏添加如下參數:
 
vm.swappiness=10

使配置立即生效
/sbin/sysctl -p
我一般設置 swappiness = 80
[root@izwz99z5o9dc90keftqhlrz ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.8G        2.5G         379M         92K        828M        121M
Swap:          4.0G        141M        3.9G
[root@izwz99z5o9dc90keftqhlrz ~]# 

一些重要的細節如下:

很多人應該都知道/proc/sys/vm/swappiness這個文件,是個可以用來調整跟swap相關的參數。這個文件的默認值是60,可以的取值範圍是0-100。

這很容易給大家一個暗示:我是個百分比哦!

那麼這個文件具體到底代表什麼意思呢?我們先來看一下說明:

======
swappiness

This control is used to define how aggressive the kernel will swap memory pages. Higher values will increase agressiveness, lower values decrease the amount of swap.
A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.
The default value is 60.
======

這個文件的值用來定義內核使用swap的積極程度:

值越高,內核就會越積極的使用swap;
值越低,就會降低對swap的使用積極性。
如果這個值爲0,那麼內存在free和file-backed使用的頁面總量小於高水位標記(high water mark)之前,不會發生交換。
在這裏我們可以理解file-backed這個詞的含義了,實際上就是上文所說的文件映射頁的大小。

那麼這個swappiness到底起到了什麼作用呢?

我們換個思路考慮這個事情。假設讓我們設計一個內存回收機制,要去考慮將一部分內存寫到swap分區上,將一部分file-backed的內存寫回並清空,剩餘部分內存出來,我們將怎麼設計?

我想應該主要考慮這樣幾個問題:

如果回收內存可以有兩種途徑(匿名頁交換和file緩存清空),那麼我應該考慮在本次回收的時候,什麼情況下多進行file寫回,什麼情況下應該多進行swap交換。說白了就是平衡兩種回收手段的使用,以達到最優。

如果符合交換條件的內存較長,是不是可以不用全部交換出去?比如可以交換的內存有100M,但是目前只需要50M內存,實際只要交換50M就可以了,不用把能交換的都交換出去。

分析代碼會發現,Linux內核對這部分邏輯的實現代碼在get_scan_count()這個方法中,這個方法被shrink_lruvec()調用。

get_sacn_count()就是處理上述邏輯的,swappiness是它所需要的一個參數,這個參數實際上是指導內核在清空內存的時候,是更傾向於清空file-backed內存還是更傾向於進行匿名頁的交換的。

當然,這只是個傾向性,是指在兩個都夠用的情況下,更願意用哪個,如果不夠用了,那麼該交換還是要交換。

簡單看一下get_sacn_count()函數的處理部分代碼,其中關於swappiness的第一個處理是:
 

這裏註釋的很清楚:

如果swappiness設置爲100,那麼匿名頁和文件將用同樣的優先級進行回收。

很明顯,使用清空文件的方式將有利於減輕內存回收時可能造成的IO壓力。

因爲如果file-backed中的數據不是髒數據的話,那麼可以不用寫回,這樣就沒有IO發生,而一旦進行交換,就一定會造成IO。

所以系統默認將swappiness的值設置爲60,這樣回收內存時,對file-backed的文件cache內存的清空比例會更大,內核將會更傾向於進行緩存清空而不是交換。這裏指老版本的Linux,現在我們的系統基本都是設置爲0.因爲swap都是我們自己配置的

這裏的swappiness值如果是60,那麼是不是說內核回收的時候,會按照60:140的比例去做相應的swap和清空file-backed的空間呢?並不是。

參考來自:

CentOS7下面的swap分區的使用

Linux SWAP 深度解讀

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章