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