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

摘要:瞭解Docker的同窗應該知道,Docker的一個很大的特性就是能夠對各類資源作隔離以及限制,這些資源包括CPU、內存、網絡、硬盤,關於內存、網絡、硬盤的資源限制都比較好理解,無非就是分多少用多少,好比給這個容器分1G內存,那就最多能用1G的內存,可是對於CPU的限制就不是那麼好理解了,並且配置起來相對來講也更復雜一些。html

瞭解Docker的同窗應該知道,Docker的一個很大的特性就是能夠對各類資源作隔離以及限制,這些資源包括CPU、內存、網絡、硬盤,關於內存、網絡、硬盤的資源限制都比較好理解,無非就是分多少用多少,好比給這個容器分1G內存,那就最多能用1G的內存,可是對於CPU的限制就不是那麼好理解了,並且配置起來相對來講也更復雜一些。docker

首先要知道的是Docker的資源隔離是基於Cgroups的, 前面的文章 裏提到的coolshell的科普文章 《Docker基礎技術:Linux CGroup》 裏有作一些基本的介紹和使用方法,想要深刻了解的話能夠看下 redhat上的文檔 ,由於今天主要是說對CPU資源的隔離,因此能夠深刻看下 關於CPU的這一章 。shell

從 Docker的官方文檔 裏能夠看到,在經過Docker run這條命令啓動一個容器時能夠經過--cpu-shares --cpu-period以及--cpu-quota這三個參數來控制容器對CPU的使用,可是並無作太詳細的介紹以及示例,因此理解起來稍微有些困難。好比--cpu-shares和其餘兩個參數一塊兒用會有什麼效果?segmentfault

咱們一個個來看,先看--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資源的使用絕對不會超過配置的值。ide

好比說A容器配置的--cpu-period=100000 --cpu-quota=50000,那麼A容器就能夠最多使用50%個CPU資源,若是配置的--cpu-quota=200000,那就可使用200%個CPU資源。post

若是這兩種配置方式一塊兒使用呢?我簡單測試了下,應該是取兩個配置的交集,目前還沒作具體的測試,等作了具體的測試再把相關的數據在這裏記錄一下,不過配置這麼複雜也沒太大必要。測試

那麼有什麼樣的應用場景呢?簡單舉個例子,加入對外提供A和B兩個服務,可是A的優先級比B要高,假如只用--cpu-shares來配置,從實際經驗來看,B服務佔用資源過高時是會對A有必定的影響的,可是具體緣由我還沒去深刻了解,可是若是經過--cpu-period和--cpu-quota來配置,就能起到絕對的控制,作到不管B怎麼樣,都不會影響到A。ui

對了,我這裏特地沒提到CFS這個概念,由於有點複雜,一上來就說這個東西會讓人有點懵,可是理解了上面的那些東西后再看CFS就能夠加深對上面那些概念的理解。CFS是Linux內核2.6.23版本開始採用的進程調度器,能夠翻譯爲徹底公平調度器,它的基本原理是這樣的:設定一個週期,目標是讓每一個進程在這個週期內至少有機會運行一次,而後根據進程的數量,你們平分這個調度週期內的CPU使用權,若是有配置進程的優先級,在分割調度週期的時候要加權。spa

本文出自來自: http://dockone.io/article/1102

相關文章
相關標籤/搜索