0 詳解swap分區
0.1 什么是swap分區?
Linux中Swap(即:交換分區),類似於Windows的虛擬內存,就是當內存不足的時候,把一部分硬盤空間虛擬成內存使用,從而解決內存容量不足的情況。
0.2 打開或關閉swap分區
- 打開swap分區
swapon -a
- 關閉swap分區
swapoff -a
如果關閉失敗,可能是物理內存占用量+swap分區占用量>物理內存總大小。
0.3 創建或刪除swap分區
0.3.1 創建swap分區
0.3.1.1 使用磁盤創建swap分區
0.3.1.1.1 使用磁盤的剩余空間創建
- 關閉swap分區
- 新建一個分區
fdisk /dev/sda
n
enter(回車,選擇默認分區類型)
enter(回車,選擇默認分區號)
enter(回車,選擇默認起始扇區位置)
+2G(輸入分區大小,要先確認磁盤剩余的可用大小)
w(保存更改)
partprobe(同步分區信息)
上述流程可能存在差異,請根據自身環境進行創建
- 設置並啟動交換分區
mkswap /dev/sdan
swapon /dev/sdan
- 永久生效
在/etc/fstab
添加如下內容,然后重啟:
/dev/sdan swap swap defaults 0 0
0.3.1.1.2 使用新磁盤創建
應該與上述流程相類似,不再贅述。
0.3.1.2 使用文件創建swap分區
- 關閉swap分區
- 使用dd指令創建一個文件,文件大小就是swap分區的大小
dd if=/dev/zero of=/swapfile bs=1M count=2048
此處創建了一個“包含2048個1M”的文件,也就是2G。
- 設置交換分區文件
mkswap /swapfile
- 啟用交換分區文件
swapon /swapfile
- 永久生效
在/etc/fstab
添加如下內容,然后重啟:
/swapfile swap swap defaults 0 0
0.3.2 刪除swap分區
- 臨時關閉,指令已經介紹過了。
- 修改
/etc/fstab
永久關閉,如下所示:
注釋或刪除上圖中的swap語句。 - 刪除swap磁盤分區
刪除分區sda1和sda3。
0.4 何時會占用swap分區?
觸發kswapd就會占用swap分區。那么何時會觸發kswapd?
在內存管理中有一種水位值機制,它是衡量內存使用量的一個標准。
內存管理中,把內存按一定大小划分為節點,每個節點中可以包含多個類型的區(zone),每個內存區(zone)都有自己的水位值。
要查看系統內存被划分為幾個節點,執行:
[root@localhost ~]# numactl -H
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
node 0 size: 6664 MB
node 0 free: 5625 MB
node distances:
node 0
0: 10
可知,只有一個節點--node0。
通過查看/proc/zoneinfo
文件,可得每個區的相關信息:
[root@localhost ~]# cat /proc/zoneinfo | grep -E "zone | free | min | low | high | spanned | present | managed"
Node 0, zone DMA
pages free 3968 //該區空閑的頁數
min 39 //min水位watermark[WMARK_MIN]
low 48 //low水位watermark[WMARK_LOW]
high 57 //high水位watermark[WMARK_HIGH]
spanned 4095 //該區的所有頁數
present 3997 //該區可用的頁數
managed 3976 //buddy管理的頁數
Node 0, zone DMA32
pages free 699747
min 6885
low 8606
high 10327
spanned 1044480
present 782288
managed 700360
Node 0, zone Normal
pages free 735868
min 326
low 407
high 488
spanned 1310720
present 1310720
managed 34485
Node 0, zone Movable
pages free 0
min 9643
low 12053
high 14463
spanned 0
present 0
managed 967245
Node 0, zone Device
pages free 0
min 0
low 0
high 0
spanned 0
present 0
managed 0
查看page大小
getconf PAGESIZE
一般頁大小為4096字節(4KB)。
每個區都有三個水位值--min、low、high。這三個值是根據min_free_kbytes計算得出的。
min_free_kbytes是系統保留空閑內存的最低限。
0.4.1 內存區(zone)水位圖
由圖可知,當到low水位線時,會觸發kswapd,開始占用swap分區。
當到min水位線時,會同時觸發直接回收(相當於直接釋放內存,不交換到swap分區)。
0.4.2 如何修改min_free_kbytes?
- 臨時修改(重啟失效)
echo xxx > /proc/sys/vm/min_free_kbytes
或
sysctl -w vm.min_free_kbytes=xxx
- 永久修改
編輯/etc/sysctl.conf
,添加:
vm.min_free_kbytes=xxx
保存,執行sysctl -p
生效。
修改min_free_kbytes后,再次查看/proc/zoneinfo
,發現區的水位值確實發生了變化。
0.4.3 swappiness對swap分區的影響
下面是kernel.org對swappiness的描述:
swappiness
This control is used to define the rough relative IO cost of swapping and filesystem paging, as a value between 0 and 200. At 100, the VM assumes equal IO cost and will thus apply memory pressure to the page cache and swap-backed pages equally; lower values signify more expensive swap IO, higher values indicates cheaper.
Keep in mind that filesystem IO patterns under memory pressure tend to be more efficient than swap’s random IO. An optimal value will require experimentation and will also be workload-dependent.
The default value is 60.
For in-memory swap, like zram or zswap, as well as hybrid setups that have swap on faster devices than the filesystem, values beyond 100 can be considered. For example, if the random IO against the swap device is on average 2x faster than IO from the filesystem, swappiness should be 133 (x + 2x = 200, 2x = 133.33).
At 0, the kernel will not initiate swap until the amount of free and file-backed pages is less than the high watermark in a zone.
下面是本人對這段描述的理解:
swappiness參數是使用交換回收(交換到swap分區)或使用I/O回收(寫回磁盤)之間的一個衡量杠桿。
swappiness可以設置[0,100]的值。值越高,內核優先使用交換回收。值越低,內核優先使用I/O回收。
當swappiness設置為0時,仍可能會使用swap分區。
swappiness只是在觸發了kswapd時,告訴內核更偏向於交換回收還是更偏向於I/O回收。觸不觸發kswapd,要看水位值。
Last login: Tue Mar 22 15:59:50 2022 from 172.29.157.196
[root@localhost ~]# cat /proc/sys/vm/swappiness
10
[root@localhost ~]# mount -t ramfs ramfs test
[root@localhost ~]# cd test/
[root@localhost test]# free -h
total used free shared buff/cache available
Mem: 1.8G 524M 929M 16M 365M 1.1G
Swap: 2.0G 0B 2.0G
[root@localhost test]# dd if=/dev/zero of=file bs=1M count=1300
記錄了1300+0 的讀入
記錄了1300+0 的寫出
1363148800字節(1.4 GB)已復制,1.31963 秒,1.0 GB/秒
[root@localhost test]# free -h
total used free shared buff/cache available
Mem: 1.8G 393M 66M 8.2M 1.3G 19M
Swap: 2.0G 148M 1.9G
Last login: Tue Mar 22 23:50:25 2022 from 172.29.157.196
[root@localhost ~]# cat /proc/sys/vm/swappiness
60
[root@localhost ~]# mount -t ramfs ramfs test
[root@localhost ~]# cd test/
[root@localhost test]# free -h
total used free shared buff/cache available
Mem: 1.8G 523M 934M 16M 361M 1.1G
Swap: 2.0G 0B 2.0G
[root@localhost test]# dd if=/dev/zero of=file bs=1M count=1300
記錄了1300+0 的讀入
記錄了1300+0 的寫出
1363148800字節(1.4 GB)已復制,1.18945 秒,1.1 GB/秒
[root@localhost test]# free -h
total used free shared buff/cache available
Mem: 1.8G 391M 73M 8.1M 1.3G 23M
Swap: 2.0G 154M 1.8G
通過兩次實驗結果的比對得:swappiness會影響swap分區的使用,但是使用swap分區不僅依據於swappiness,所以兩次實驗swappiness的值相差很大,但是swap分區的占用量相差卻很小(與預期的結果(相差應該會很明顯)不同)。
如果有大佬了解或知道swappiness相關的資料,可以留言讓我了解學習一下,謝謝
0.4.4 修改swappiness
- 臨時修改
echo xxx > /proc/sys/vm/swappiness
- 永久修改
vim /etc/sysctl.conf
增加:vm.swappiness=xxx
保存:wq
生效:sysctl -p
如有錯誤,歡迎留言指正