Centos7增加swap交換空間避免OOM

如下所示,當我們使用服務器進行比較耗內存的操作的時候,我們的進程通常會出現由於內存不足被系統內核Kill掉的情況。

#tail -f /var/log/messages
Mar 26 12:53:14 iZbp10exab3v6j02ja125lZ kernel: [ 6569]   501  6569  6123845  1789213   0       0             0 mysqld
Mar 26 12:53:14 iZbp10exab3v6j02ja125lZ kernel: [ 6973]     0  6973     6821      131   0       0             0 mysqldump
Mar 26 12:53:14 iZbp10exab3v6j02ja125lZ kernel: Out of memory: Kill process 6569 (mysqld) score 875 or sacrifice child
Mar 26 12:53:14 iZbp10exab3v6j02ja125lZ kernel: Killed process 6569, UID 501, (mysqld) total-vm:24495380kB, anon-rss:7156712kB, file-rss:140kB

如何儘量避免服務器出現內存不足的錯誤?最簡單的方法就是增加交換空間。Swap是存儲盤上的一塊自留地,操作系統可以在這裏暫存一些內存裏放不下的東西。

這從某種程度上相當於增加了服務器的可用內存。雖然從swap讀寫比內存慢,但總比沒有好,算是內存不夠時的安全網。

如果沒有swap,則服務器一旦內存不足,就會開始終止應用以釋放內存,甚至會崩潰,這會讓你丟失一些還沒來得及保存的數據,或者造成當機。有些應用明確要求系統配置swap以確保數據訪問的可靠性。

檢查系統的Swap信息

首先我們需要檢查系統的存儲,看看是否已經配置過swap。一個系統可以設置多個swap文件或分區,不過一般來說一個就夠了。

使用swapon命令可以檢查系統是否已經配置過swap,這是一個通用的swap工具。使用-s標籤可列出當前存儲設備上的swap使用情況:

swapon -s

如果該命令沒有返回出結果,則代表該系統尚未配置過swap。

或者使用 top 命令

[root@iZbp10exab3v6j02ja125lZ log]# top

top - 13:23:12 up 10 days, 22:22,  1 user,  load average: 0.08, 0.03, 0.05
Tasks: 241 total,   1 running, 240 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.7%us,  0.3%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8193452k total,  3570536k used,  4622916k free,    78428k buffers
Swap:        0k total,        0k used,        0k free,   314148k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                
  993 root      20   0  3536  260  172 S  0.3  0.0   5:51.26 aliyun-service  

檢查可用的存儲空間

通常,我們建立一個單獨的分區作爲swap。然而有時候由於硬件或軟件的限制,新建分區的方式無法實現,這種情況下就可以建立一個swap文件來實現同樣的功能。
開始之前,先檢查一下磁盤的可用空間。輸入如下指令:

#df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        59G  1.5G   55G   3% /
devtmpfs        2.0G     0  2.0G   0% /dev
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           2.0G  8.3M  2.0G   1% /run
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup

這裏的-h標記是爲了告訴df將信息輸出爲對人類友好的格式,比如以MB或GB爲單位輸出空間使用和空餘情況,而不是直接輸出內存塊的個數。

從第一行可以看到我們的存儲分區上還有55GB的空間剩餘,這足夠我們操作了。
合適的swap空間是多大?關於這個問題有很多種選擇,這取決於你的應用需求和你個人的偏好。一般來說,內存容量的兩倍就是個不錯的起點。

我的系統內存有8GB,如果設置8GB的swap會佔據太多空間,所以我決定只設置4GB就好。

創建Swap文件

接下來我們將在文件系統上創建swap文件。我們要在根目錄(/)下創建一個名叫swapfile的文件,當然你也可以選擇你喜歡的文件名。該文件分配的空間將等於我們需要的swap空間。
最快捷的創建方式是fallocate命令,該命令能夠創建一個預分配指定大小空間的文件。輸入如下指令創建一個4GB的文件:

fallocate -l 4G /swapfile

swap文件將立即創建完畢。我們可以用ls命令檢查文件大小:

[root@iZbp10exab3v6j02ja125lZ /]# ls -lh /swapfile 
-rw-r--r-- 1 root root 4.0G Mar 26 13:24 /swapfile

至此,我們的swap文件就創建完畢了。

啓用Swap文件

現在我們已經有了swap文件,但系統還不知道應該使用該文件作爲swap,這就需要我們告知系統將該文件格式化爲swap並啓用起來。

首先我們需要更改swap文件的權限,確保只有root纔可讀,否則會有很大的安全隱患。使用chmod命令進行權限操作:

chmod 600 /swapfile

如此,該文件的讀寫都只有root才能操作。使用ls -lh命令檢查一下:

[root@iZbp10exab3v6j02ja125lZ /]# ls -lh /swapfile 
-rw------- 1 root root 4.0G Mar 26 13:24 /swapfile

然後,使用如下命令告知系統將該文件用於swap:

[root@iZbp10exab3v6j02ja125lZ /]# mkswap -f /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=2a92ce63-8f40-40ff-9de3-5240a6469cf8

現在,這個swap文件就可以作爲swap空間使用了。輸入如下命令開始使用該swap:

swapon /swapfile

我們可以輸入如下命令來確認一下設置是否已經生效:

[root@iZbp10exab3v6j02ja125lZ /]# swapon -s
Filename				Type		Size	Used	Priority
/swapfile                               file		4194300	0	-1

可以看到返回的結果中已經有我們剛纔設置的swap。再使用top工具確認一下:

[root@iZbp10exab3v6j02ja125lZ /]# top

top - 13:26:47 up 10 days, 22:26,  1 user,  load average: 0.24, 0.09, 0.06
Tasks: 241 total,   1 running, 240 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.7%sy,  0.0%ni, 97.8%id,  1.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8193452k total,  3600800k used,  4592652k free,    86496k buffers
Swap:  4194300k total,        0k used,  4194300k free,   324044k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                
 1650 root      10 -10  130m  11m 2340 S  1.3  0.1  65:08.36 AliYunDun 

使Swap文件永久生效

至此我們已經在系統中啓用了swap文件,然而一旦系統重啓後,服務器還不能自動啓用該文件。要讓系統在重啓後自動生效swap,我們可以通過修改fstab文件來實現(這是一個管理文件系統和分區的表)。

用sudo權限打開該文件編輯:

vim /etc/fstab

在文件末尾加入下面這行內容,告訴操作系統自動使用剛纔創建的swap文件:

/swapfile   swap    swap    sw  0   0

添加完畢後,保存退出。以後服務器每次重啓都會檢查該文件並自動啓用swap。

更改Swap配置(可選)

swappiness參數決定了系統將數據從內存交換到swap空間的頻率,數值設置在0到100之間,代表系統將數據從內存交換到swap空間的力度。

該數值越接近於0,系統越傾向於不進行swap,僅在必要的時候進行swap操作。由於swap要比內存慢很多,因此減少對swap的依賴意味着更高的系統性能。

該數值越接近於100,系統越傾向於多進行swap。有些應用的內存使用習慣更適合於這種情況,這也於服務器的用途有關。

輸入如下命令查看當前的swappiness數值:

cat /proc/sys/vm/swappiness
30

CentOS 7默認設置了30的swappiness,這對於大部分桌面系統和本地服務器是比較中庸的數值。

一般來講,我們期望系統越傾向於不進行swap,僅在必要的時候進行swap操作。

#vim /etc/sysctl.conf
vm.swappiness = 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章