燕郊網(wǎng)站建設(shè)天津seo推廣服務(wù)
目錄
1、前言
2、CGroup
2.1、是否開啟CGroup
2.2、Linux CGroup限制資源能使用
2.2.1、創(chuàng)建一個demo
2.2.2、CGroup限制CPU使用
2.3、Linux CGroup限制內(nèi)存使用
2.4、Linux CGroup限制IO
3、Docker對資源的管理
3.1、Docker對CPU的限制
3.1.1、構(gòu)建一個鏡像
3.1.2、構(gòu)建兩個容器
3.1.3、查看CPU使用率
3.2、Docker對內(nèi)存的限制
3.3、Docker對IO的限制
3.4、查看Docker的資源配置
1、前言
通常情況下,我們一臺宿主機上會同時啟動多個Docker容器,而在默認情況下,Docker是沒有限制其運行的容器所使用的硬件資源,比如CPU,內(nèi)存,IO等。而在實際環(huán)境中,往往一個容器的負載過高,會占用宿主機的大部分資源,會導(dǎo)致其他容器的訪問資源被搶占,而出現(xiàn)響應(yīng)超時或無法響應(yīng)等情況。
因此,我們往往會對同時啟動的Docker容器做資源的分配和管理。這就是我們今天要說的容器資源管理。
2、CGroup
熟悉Linux的應(yīng)該知道,Linux內(nèi)核提供了一組為cgroup(Controller Group)的進程,通過這些進程可以限制應(yīng)用對資源的使用,如CPU,內(nèi)存等。通過cgroup可以對系統(tǒng)資源做精細化控制,例如實現(xiàn)對每個容器使用的CPU比率進行限制。
Linux CGroup主要提供了幾種功能:
- Resource Limitation:限制資源的使用,如CPU,內(nèi)存的上限。
- Prioritization:應(yīng)用的優(yōu)先級控制,如控制任務(wù)的調(diào)度。
- Accounting:應(yīng)用的審計和統(tǒng)計,例如實現(xiàn)應(yīng)用的計費。
- Control:實現(xiàn)對應(yīng)用的控制,例如應(yīng)用的掛起,恢復(fù)和執(zhí)行等。
2.1、是否開啟CGroup
cat /boot/config-3.10.0-1160.el7.x86_64 |grep CGROUP
如果相關(guān)參數(shù)是y,表示已經(jīng)啟動了Linux CGroup,默認是開啟的。
2.2、Linux CGroup限制資源能使用
2.2.1、創(chuàng)建一個demo
創(chuàng)建一個high_cpu.java文件。
touch high_cpu.java
編寫一段死循環(huán)代碼。
class HighCpu {public static void main(String args[]) {int i=0;while(true){i++;}}
}
再編譯執(zhí)行他。
javac high_cpunohup java HighCpu &
執(zhí)行完觀察cpu占用情況。
htop
我這里啟了兩個,所以兩個進程。但是不影響我們觀測,可以看到進程3999的CPU使用率已經(jīng)接近100%。
安裝htop步驟:
yum -y install epel-release.noarch
yum -y install htop
2.2.2、CGroup限制CPU使用
1)首先進入系統(tǒng)cgroup目錄下。
cd /sys/fs/cgroup/
ls
可以看到里面有很多熟悉的資源相關(guān)文件,如cpu,memory,blkio等。
沒錯,我們要限制cpu使用,當然是進入到cpu/目錄。
cd spu/
# 創(chuàng)建我們自己的資源隔離腳本,
mkdir mycpu
cd mycpu
ls
可以看到在里面默認生成很多cpu相關(guān)的腳本文件。
我們著重看cpu.cfs_quota_us。
cat cpu.cfs_quota_us
里面的值為-1,則表示不限制cpu使用。
我們修改他的值為2000,也就是限制20%閾值。
echo 20000 > cpu.cfs_quota_us#同時把我們上面的進程號(3999)寫進tasks文件
echo 3999 > tasks
我們再htop觀察下cpu占用,可以看到CPU使用已經(jīng)成功降到了20%的上限。
2.3、Linux CGroup限制內(nèi)存使用
同上面的CPU限制,內(nèi)存限制也類似。
cd /sys/fs/cgroup/memory
mkdir mymem
cd mymem
more memory.limit_in_bytes
可以看到這個值很大,表示對內(nèi)存沒有進行限制。
同樣我們可以通過配置進行調(diào)整。
echo 10m > memory.limit_in_bytes#同時把我們上面的進程號(3999)寫進tasks文件
echo 3999 > tasks
這樣,內(nèi)存使用就限制了10m可用。
2.4、Linux CGroup限制IO
cd /sys/fs/cgroup/blkio
mkdir myio
cd myio
echo '8:0 1048576' > blkio.throttle.read_bps_device#同時把我們上面的進程號(3999)寫進tasks文件
echo 3999 > tasks
上面的"8:0"是當前需要限制的設(shè)備號。如要查看/dev/sda磁盤的設(shè)備號,可以使用ls -l /dev/sda。
3、Docker對資源的管理
為什么前面說了那么多Linux CGroup對資源的管理?因為Docker是構(gòu)建在Linux基礎(chǔ)上的,因此Docker就是利用Linux CGroup來實現(xiàn)對資源的控制。那么有了前面CGroup的認識,我們接下來學習Docker資源管理就容易很多。
3.1、Docker對CPU的限制
Docker引擎可以通過-c或--cpu-shares來為每個容器分配一個“CPU使用的權(quán)重”。該權(quán)重與實際的處理速度無關(guān),每個容器默認有1024個CPU配額權(quán)重。
如果啟動了兩個容器,并且兩個都使用默認的權(quán)重值 1024,則 Docker 引擎將把 CPU使用率平均分配給這兩個容器,即這兩個容器各自占用 50%的 CPU使用率。
但是,如果給容器 A分配的是 1024 權(quán)重,而給容器 B分配的是 512 權(quán)重,則會發(fā)現(xiàn)容器A使用CPU的比例比容器B使用 CPU的比例多一倍。
3.1.1、構(gòu)建一個鏡像
創(chuàng)建一個Dockerfile文件,這里直接使用我們前面用過的例子:
# 指定基礎(chǔ)鏡像作為該容器的基礎(chǔ)環(huán)境,如springboot應(yīng)用最起碼得有jdk環(huán)境
FROM openjdk:8# 執(zhí)行維護者的信息
MAINTAINER shamee csdn peng793049488# 創(chuàng)建一個存放該工程的目錄
RUN mkdir -p /data/project
ADD target/dockerfile-springboot-1.0-SNAPSHOT.jar /data/project/dockerfile-springboot-1.0-SNAPSHOT.jar# 對外暴露一個8899端口
EXPOSE 8899# 執(zhí)行啟動
ENTRYPOINT ["/bin/sh", "-c", "java -jar /data/project/dockerfile-springboot-1.0-SNAPSHOT.jar"]
使用docker build構(gòu)建鏡像:
docker build -t docker_cgroup .
構(gòu)建完,便可以看到我們的鏡像docker_cgroup。
3.1.2、構(gòu)建兩個容器
# 第一個容器, CPU默認(1024)
docker run -d docker_cgroup --cpu 4 --name=cpu_1024# 第二個容器, CPU配額權(quán)重512
docker run -d -c 512 docker_cgroup --cpu 4 --name=cpu_512
3.1.3、查看CPU使用率
通過命令:
docker stats
可以看到CPU的占用情況,設(shè)置1024權(quán)重的CPU占用率比512的高將近一倍。
docker stats 命令可以查看容器的CPU,內(nèi)存,IO等分配,使用情況。下面的內(nèi)存驗證和IO驗證均可以使用該命令查看。
除此以外,還可以設(shè)置以下參數(shù),直接綁定CPU核心數(shù):
# 表示使用CPU0,1,2核
--cpuset-cpus=0,1,2
3.2、Docker對內(nèi)存的限制
同上面CPU的管理,Docker引擎支持通過-m參數(shù)來設(shè)定容器所使用的內(nèi)存。
如:
docker run -it xxx -m 256m
-m 256m表示限制容器使用的內(nèi)存大小為256m。驗證方式可以類似上面CPU管理方式,可以直接使用docker stats來查看。這里就不贅述。
3.3、Docker對IO的限制
對I/O的限制,可以使用參數(shù):
# 這里是限制容器寫入速度為1MB/s
docker run -it xxx --device-write-bps /dev/sda:1mb
其他參數(shù):
參數(shù)名稱 | 說明 |
--blkio-weight | 可以通過--blkio-weight 修改容器 blkio 的權(quán)重,權(quán)重值為 10~1000 |
--blkio-weight-device weighted-device | 指定某個設(shè)備的權(quán)重 |
--device-read-bps throttled-device | 按每秒讀取塊設(shè)備的數(shù)據(jù)量設(shè)定上限 |
--device-read-iops throttled-device | 按照每秒讀操作的次數(shù)設(shè)定上限 |
--device-write-bps throttled-device | 按每秒寫入塊設(shè)備的數(shù)據(jù)量設(shè)定上限 |
--device-write-iops throttled-device | 按照每秒寫操作的次數(shù)設(shè)定上限 |
3.4、查看Docker的資源配置
可以使用:
docker inspect <容器ID或名稱>
來查看容器的具體配置情況信息。
?