亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

深入理解Kubernetes資源限制:CPU

發布時間:2020-06-17 14:26:05 來源:網絡 閱讀:399 作者:容器魔方 欄目:云計算

寫在前面
在上一篇關于Kubernetes資源限制的文章我們討論了如何通過ResourceRequirements設置Pod中容器內存限制,以及容器運行時是如何利用Linux Cgroups實現這些限制的。也分析了requests是用來通知調度器Pod所需資源需求和limits是在宿主機遇到內存壓力時幫助內核限制資源二者的區別。

在本文中,我會繼續深入探討CPU時間的requests和limits。你是否閱讀過第一篇文章并不會影響本文的學習,但是我建議你兩篇文章都讀一讀,從而得到工程師或者集群管理員視角的集群控制全景。

深入理解Kubernetes資源限制:CPU

CPU時間
正如我在第一篇文章中指出,限制CPU時間要比限制內存限制更加復雜,好消息是限制CPU也是根據我們前面所了解到的cgroups機制控制的,與限制內存的原理是通用的,我們只需要關注一些細節即可。我們從向前文的例子里添加CPU時間限制開始:
resources:
requests:
memory: 50Mi
cpu: 50m
limits:
memory: 100Mi
cpu: 100m

單位后綴m表示“千分之一個核心”,所以這個資源對象定義了容器進程需要50/1000的核心(5%),并且最多使用100/1000的核心(10%)。類似的,2000m表示2顆完整的核心,當然也可以用2或者2.0來表示。讓我們創建一個只擁有CPU requests的Pod,然后看看Docker是如何配置cgroups的:

$ kubectl run limit-test --image=busybox --requests “cpu=50m” --command – /bin/sh -c “while true; do sleep 2; done”

deployment.apps “limit-test” created

我們能夠看到Kubernetes已經配置了50m的CPU requests:

$ kubectl get pods limit-test-5b4c495556-p2xkr -o=jsonpath=’{.spec.containers[0].resources}’

[cpu:50m]]

我們也可以看到Docker配置了同樣的limits:

$ docker ps | grep busy | cut -d’ ’ -f1

f2321226620e

$ docker inspect f2321226620e --format ‘{{.HostConfig.CpuShares}}’

51

為什么是51而不是50?CPU cgroup和Docker都把一個核心劃分為1024份,而Kubernetes則劃分為1000份。那么Docker如何把它應用到容器進程上?設置內存限制會讓Docker來配置進程的memory cgroup,同樣設置CPU限制會讓它配置cpu, cpuacct cgroup。

$ ps ax | grep /bin/sh

60554 ? Ss 0:00 /bin/sh -c while true; do sleep 2; done

$ sudo cat /proc/60554/cgroup

4:cpu,cpuacct:/kubepods/burstable/pode12b33b1-db07-11e8-b1e1-42010a800070/3be263e7a8372b12d2f8f8f9b4251f110b79c2a3bb9e6857b2f1473e640e8e75

ls -l /sys/fs/cgroup/cpu,cpuacct/kubepods/burstable/pode12b33b1-db07-11e8-b1e1-42010a800070/3be263e7a8372b12d2f8f8f9b4251f110b79c2a3bb9e6857b2f1473e640e8e75

total 0

drwxr-xr-x 2 root root 0 Oct 28 23:19 .

drwxr-xr-x 4 root root 0 Oct 28 23:19 …

-rw-r–r-- 1 root root 0 Oct 28 23:19 cpu.shares

Docker的HostConfig.CpuShares容器屬性映射到了cgroup的cpu.shares上,所以讓我們看看:

$ sudo cat /sys/fs/cgroup/cpu,cpuacct/kubepods/burstable/podb5c03ddf-db10-11e8-b1e1-42010a800070/64b5f1b636dafe6635ddd321c5b36854a8add51931c7117025a694281fb11444/cpu.shares

51

你可能會驚奇地發現設置一個CPU請求會把這個值發送到cgroup去,而上篇文章中設置內存卻并非如此。下面這行內核對內存軟限制的行為對Kubernetes來說沒什么用處,而設置了cpu.shares則是有用的。我等會會對此做出解釋。那么當我們設置cpu限制時發生了什么?讓我們一起找找看:

$ kubectl run limit-test --image=busybox --requests “cpu=50m” --limits “cpu=100m” --command – /bin/sh -c “while true; do sleep 2; done”

deployment.apps “limit-test” created

現在我們回過頭來看看Kubernetes Pod資源對象的限制:

$ kubectl get pods limit-test-5b4fb64549-qpd4n -o=jsonpath=’{.spec.containers[0].resources}’

map[limits:map[cpu:100m] requests:map[cpu:50m]]

在Docker容器配置里:

$ docker ps | grep busy | cut -d’ ’ -f1

f2321226620e

$ docker inspect 472abbce32a5 --format ‘{{.HostConfig.CpuShares}} {{.HostConfig.CpuQuota}} {{.HostConfig.CpuPeriod}}’

51 10000 100000

正如我們所見,CPU請求存放在HostConfig.CpuShares屬性里。CPU限制,盡管不是那么明顯,它由HostConfig.CpuPeriod和HostConfig.CpuQuota兩個值表示,這些Docker容器配置映射為進程的cpu, cpuacct cgroup的兩個屬性:cpu.cfs_period_us和cpu.cfs_quota_us。讓我們仔細看看:

$ sudo cat /sys/fs/cgroup/cpu,cpuacct/kubepods/burstable/pod2f1b50b6-db13-11e8-b1e1-42010a800070/f0845c65c3073e0b7b0b95ce0c1eb27f69d12b1fe2382b50096c4b59e78cdf71/cpu.cfs_period_us

100000

$ sudo cat /sys/fs/cgroup/cpu,cpuacct/kubepods/burstable/pod2f1b50b6-db13-11e8-b1e1-42010a800070/f0845c65c3073e0b7b0b95ce0c1eb27f69d12b1fe2382b50096c4b59e78cdf71/cpu.cfs_quota_us

10000

如我們所料這兩個配置會同樣配置到Docker容器配置里。但是這些值是怎么從Pod的100m CPU限制里轉換過來,并且是怎么實現的呢?原來CPU requests和CPU limits是由兩套不同的cgroup分別進行控制的。Requests使用CPU分片系統,是二者中出現較早的一個。Cpu分片是將每個核心劃分為1024份,并且保證每個進程會接收到一定比例的CPU分片。如果只有1024片而這兩個進程都設置cpu.shares為512,那么這兩個進程會各自得到一半的CPU時間。CPU分片系統并不能指定上界,也就是說如果一個進程沒有使用它的這一份,其它進程是可以使用的。

在2010年左右Google和一些公司注意到了這個可能存在的問題。進而合并了一個更加強大的秒級響應的系統:CPU帶寬控制。帶寬控制系統定義了一個通常是1/10秒的周期,或者100000微秒,以及一個表示周期里一個進程可以使用的最大分片數配額。在這個例子里,我們為我們的Pod申請了100mCPU,它等價于100/1000的核心,或者10000/100000毫秒的CPU時間。所以我們的CPU requests被翻譯為設置這個進程的cpu,cpuacct的配置為cpu.cfs_period_us=100000并且cpu.cfs_quota_us=10000。cfs表示完全公平調度,它是Linux默認的CPU調度器。同時還有一個響應quota值的實時調度器 。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中卫市| 长泰县| 项城市| 汪清县| 泸溪县| 乌兰浩特市| 昭通市| 宜城市| 承德县| 佛教| 高邮市| SHOW| 江西省| 都匀市| 阿克陶县| 和林格尔县| 同德县| 东乡| 鄂托克前旗| 谷城县| 自治县| 凤城市| 乌审旗| 平顺县| 潞城市| 保定市| 杂多县| 马山县| 英德市| 灌云县| 清苑县| 普定县| 民权县| 黑河市| 阿克陶县| 武鸣县| 肃南| 原平市| 小金县| 绍兴县| 南澳县|