詳解swap


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 使用磁盤的剩余空間創建
  1. 關閉swap分區
  2. 新建一個分區
fdisk /dev/sda
n
enter(回車,選擇默認分區類型)
enter(回車,選擇默認分區號)
enter(回車,選擇默認起始扇區位置)
+2G(輸入分區大小,要先確認磁盤剩余的可用大小)
w(保存更改)
partprobe(同步分區信息)

上述流程可能存在差異,請根據自身環境進行創建

  1. 設置並啟動交換分區
mkswap /dev/sdan
swapon /dev/sdan
  1. 永久生效
    /etc/fstab添加如下內容,然后重啟:
/dev/sdan swap swap defaults 0 0
0.3.1.1.2 使用新磁盤創建

應該與上述流程相類似,不再贅述。

0.3.1.2 使用文件創建swap分區

  1. 關閉swap分區
  2. 使用dd指令創建一個文件,文件大小就是swap分區的大小
dd if=/dev/zero of=/swapfile bs=1M count=2048

此處創建了一個“包含2048個1M”的文件,也就是2G。

  1. 設置交換分區文件
mkswap /swapfile
  1. 啟用交換分區文件
swapon /swapfile
  1. 永久生效
    /etc/fstab添加如下內容,然后重啟:
/swapfile swap swap defaults 0 0

0.3.2 刪除swap分區

  1. 臨時關閉,指令已經介紹過了。
  2. 修改/etc/fstab永久關閉,如下所示:

    注釋或刪除上圖中的swap語句。
  3. 刪除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?

  1. 臨時修改(重啟失效)
echo xxx > /proc/sys/vm/min_free_kbytes
或
sysctl -w vm.min_free_kbytes=xxx
  1. 永久修改
    編輯/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

  1. 臨時修改
echo xxx > /proc/sys/vm/swappiness
  1. 永久修改
vim /etc/sysctl.conf
增加:vm.swappiness=xxx
保存:wq
生效:sysctl -p

如有錯誤,歡迎留言指正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM