Docker容器對CPU資源隔離的幾種方式

jopen 8年前發布 | 40K 次閱讀 Docker

了解Docker的同學應該知道,Docker的一個很大的特性就是可以對各種資源做隔離以及限制,這些資源包括CPU、內存、網絡、硬盤,關于內存、網絡、硬盤的資源限制都比較好理解,無非就是分多少用多少,比如給這個容器分1G內存,那就最多能用1G的內存,但是對于CPU的限制就不是那么好理解了,而且配置起來相對來說也更復雜一些。

首先要知道的是Docker的資源隔離是基于Cgroups的, 前面的文章 里提到的coolshell的科普文章 《Docker基礎技術:Linux CGroup》 里有做一些基本的介紹和使用方法,想要深入了解的話可以看下 redhat上的文檔 ,因為今天主要是說對CPU資源的隔離,所以可以深入看下 關于CPU的這一章

Docker的官方文檔 里可以看到,在通過Docker run這條命令啟動一個容器時可以通過--cpu-shares --cpu-period以及--cpu-quota這三個參數來控制容器對CPU的使用,但是并沒有做太詳細的介紹以及示例,所以理解起來稍微有些困難。比如--cpu-shares和其他兩個參數一起用會有什么效果?

我們一個個來看,先看--cpu-shares,默認情況下所有容器的share(簡單理解成是權重吧)是相同的,也就是所有容器有相同的權重,在所有容器一起競爭資源時,最終得到的資源是相同的。這個share是一個相對的值,那么這個值的意義就不能單純的通過一個容器的share值來看,而是多個在一起對比,比如A和B兩個容器,A配置的是1024,B配置的是512,那么A最大可以使用的CPU資源是B的兩倍。還有一點要注意的是這種配置是有彈性的,如果A容器一直閑著,那B容器是可以使用空閑資源的。

再來看--cpu-period和--cpu-quota,為啥把這兩個參數放一起呢?因為這兩個參數是相互配合的,在redhat的那篇文檔里講的很清楚,--cpu-period和--cpu-quota的這種配置叫 Ceiling Enforcement Tunable Parameters ,--cpu-shares的這種配置叫 Relative Shares Tunable Parameters 。--cpu-period是用來指定容器對CPU的使用要在多長時間內做一次重新分配,而--cpu-quota是用來指定在這個周期內,最多可以有多少時間用來跑這個容器。跟--cpu-shares不同的是這種配置是指定一個絕對值,而且沒有彈性在里面,容器對CPU資源的使用絕對不會超過配置的值。

比如說A容器配置的--cpu-period=100000 --cpu-quota=50000,那么A容器就可以最多使用50%個CPU資源,如果配置的--cpu-quota=200000,那就可以使用200%個CPU資源。

如果這兩種配置方式一起使用呢?我簡單測試了下,應該是取兩個配置的交集,目前還沒做具體的測試,等做了具體的測試再把相關的數據在這里記錄一下,不過配置這么復雜也沒太大必要。

那么有什么樣的應用場景呢?簡單舉個例子,加入對外提供A和B兩個服務,但是A的優先級比B要高,假如只用--cpu-shares來配置,從實際經驗來看,B服務占用資源太高時是會對A有一定的影響的,但是具體原因我還沒去深入了解,但是如果通過--cpu-period和--cpu-quota來配置,就能起到絕對的控制,做到無論B怎么樣,都不會影響到A。

對了,我這里特意沒提到CFS這個概念,因為有點復雜,一上來就說這個東西會讓人有點懵,但是理解了上面的那些東西后再看CFS就可以加深對上面那些概念的理解。CFS是Linux內核2.6.23版本開始采用的進程調度器,可以翻譯為完全公平調度器,它的基本原理是這樣的:設定一個周期,目標是讓每個進程在這個周期內至少有機會運行一次,然后根據進程的數量,大家平分這個調度周期內的CPU使用權,如果有配置進程的優先級,在分割調度周期的時候要加權。

來自: http://dockone.io/article/1102

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!