保證運(yùn)行容器的主機(jī)有重組的內(nèi)存
限制容器可以使用的內(nèi)存
為主機(jī)配置 swap
好了,啰嗦了這么多,其實(shí)就是說:通過限制容器使用的內(nèi)存上限,可以降低主機(jī)內(nèi)存耗盡時(shí)帶來的各種風(fēng)險(xiǎn)。
壓力測試工具 stress
為了測試容器的內(nèi)存使用情況,筆者在 ubuntu 的鏡像中安裝了壓力測試工作 stress,并新創(chuàng)建了鏡像 u-stress。本文演示用的所有容器都會(huì)通過 u-stress 鏡像創(chuàng)建(本文運(yùn)行容器的宿主機(jī)為 CentOS7)。下面是創(chuàng)建 u-stress 鏡像的 Dockerfile:
FROM ubuntu:latest RUN apt-get update && \\\\ apt-get install stress
創(chuàng)建鏡像的命令為:
$ docker build -t u-stress:latest .
限制內(nèi)存使用上限
在進(jìn)入繁瑣的設(shè)置細(xì)節(jié)之前我們先完成一個(gè)簡單的用例:限制容器可以使用的最大內(nèi)存為 300M。
-m(–memory=) 選項(xiàng)可以完成這樣的配置:
$ docker run -it -m 300M --memory-swap -1 --name con1 u-stress /bin/bash
下面的 stress 命令會(huì)創(chuàng)建一個(gè)進(jìn)程并通過 malloc 函數(shù)分配內(nèi)存:
# stress --vm 1 --vm-bytes 500M
通過 docker stats 命令查看實(shí)際情況:
上面的 docker run 命令中通過 -m 選項(xiàng)限制容器使用的內(nèi)存上限為 300M。同時(shí)設(shè)置 memory-swap 值為 -1,它表示容器程序使用內(nèi)存的受限,而可以使用的 swap 空間使用不受限制(宿主機(jī)有多少 swap 容器就可以使用多少)。
下面我們通過 top 命令來查看 stress 進(jìn)程內(nèi)存的實(shí)際情況:
上面的截圖中先通過 pgrep 命令查詢 stress 命令相關(guān)的進(jìn)程,進(jìn)程號比較大的那個(gè)是用來消耗內(nèi)存的進(jìn)程,我們就查看它的內(nèi)存信息。VIRT 是進(jìn)程虛擬內(nèi)存的大小,所以它應(yīng)該是 500M。RES 為實(shí)際分配的物理內(nèi)存數(shù)量,我們看到這個(gè)值就在 300M 上下浮動(dòng)??礃幼游覀円呀?jīng)成功的限制了容器能夠使用的物理內(nèi)存數(shù)量。
限制可用的 swap 大小
強(qiáng)調(diào)一下 –memory-swap 是必須要與 –memory 一起使用的。
正常情況下, –memory-swap 的值包含容器可用內(nèi)存和可用 swap。所以 –memory=300m –memory-swap=1g 的含義為:
容器可以使用 300M 的物理內(nèi)存,并且可以使用 700M(1G -330M) 的 swap。–memory-swap 居然是容器可以使用的物理內(nèi)存和可以使用的 swap 之和!
把 –memory-swap 設(shè)置為 0 和不設(shè)置是一樣的,此時(shí)如果設(shè)置了 –memory,容器可以使用的 swap 大小為 –memory 值的兩倍。
如果 –memory-swap 的值和 –memory 相同,則容器不能使用 swap。下面的 demo 演示了在沒有 swap 可用的情況下向系統(tǒng)申請大量內(nèi)存的場景:
$ docker run -it --rm -m 300M --memory-swap=300M u-stress /bin/bash # stress --vm 1 --vm-bytes 500M
demo 中容器的物理內(nèi)存被限制在 300M,但是進(jìn)程卻希望申請到 500M 的物理內(nèi)存。在沒有 swap 可用的情況下,進(jìn)程直接被 OOM kill 了。如果有足夠的 swap,程序至少還可以正常的運(yùn)行。
我們可以通過 –oom-kill-disable 選項(xiàng)強(qiáng)行阻止 OOM kill 的發(fā)生,但是筆者認(rèn)為 OOM kill 是一種健康的行為,為什么要阻止它呢?
除了限制可用 swap 的大小,還可以設(shè)置容器使用 swap 的緊迫程度,這一點(diǎn)和主機(jī)的 swappiness 是一樣的。容器默認(rèn)會(huì)繼承主機(jī)的 swappiness,如果要顯式的為容器設(shè)置 swappiness 值,可以使用 –memory-swappiness 選項(xiàng)。
總結(jié)
通過限制容器可用的物理內(nèi)存,可以避免容器內(nèi)服務(wù)異常導(dǎo)致大量消耗主機(jī)內(nèi)存的情況(此時(shí)讓容器重啟是較好的策略),因此可以降低主機(jī)內(nèi)存被耗盡帶來的風(fēng)險(xiǎn)。
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機(jī)的問題,請?jiān)L問西部數(shù)碼官網(wǎng):m.ps-sw.cn