前幾天在km上看到的深度好文,去和各位大佬要了授權。拿出來分享一下資料分析顯示,資料中心成本中,伺服器採購成本佔比超過50% 1, 2 ,而全球伺服器平均資源利用率不到20%,並且伺服器一般3~5年就會淘汰,需要購置新伺服器,造成了巨大的成本浪費。
如果資料中心或者機房規模較小,伺服器數量有限,很少有人會去關注資源利用率這個問題。因為在小規模場景下,耗費人力、物力想辦法提高伺服器資源利用率並不會獲得太高的收益。如果資料中心規模比較大,提公升資料中心資源利用率則能夠顯著降低成本、帶來巨大收益,所以國內外的大型網際網路公司,很早就開始投入大量的人力物力進行較多的探索實踐。
近幾年,隨著雲**、嚴選、傳媒、有道等網際網路業務的快速發展,網易內部的伺服器數量不斷攀公升,而實際資源利用率又比較低,it基礎設施成本問題日益嚴峻。面對日益增長的業務,我們希望用最小的基礎設施資源成本來支撐更大的業務需求。提公升伺服器資源利用率成為乙個比較重要的解決手段。
網易輕舟團隊提出了一套基於kubernetes的業務混部方案,目前已經在網易內部得到廣泛應用,在不影響業務slo(service-level objective)的前提下,資源利用率得到顯著提公升。
麥肯錫資料統計顯示,整個業界的伺服器平均利用率大約為6%,而gartner的估計要樂觀一些,大概在12%。國內一些銀行的資料中心的利用率大概在5%左右 3 。
而造成利用率比較低的原因主要有以下三個方面:
圖1 google資料中心資源使用情況
業務通常是有波峰和波谷的,使用者在部署服務時,為了保證服務的效能和穩定性通常都會按照波峰申請資源,即 provision resource for the peek load,但是波峰的時間可能很短。另外,也有相當一部分使用者對於自己服務的資源使用情況不是很了解,在申請資源時具有較大盲目性,但是通常也是申請過量資源而不是申請的過少。
圖2 推特資料中心資源使用情況
圖2 是推特資料中心資源使用情況,可以看到cpu利用率大約在20%左右,但是使用者申請了60%左右的cpu資源;記憶體利用率在40%左右,但是使用者申請了80%左右的記憶體資源 4。
服務a已申請的但是實際沒有使用的資源,即使是空閒的,其他服務也是不能夠使用的。reserved - used差值越大,資源浪費越多。所以我們應該如何去縮小reserved - used的差值,從而提高業務部署密度和資源利用率呢?
傳統的資料中心中,之所以將在/離線服務分開部署管理,實屬無奈之舉:
在/離線服務分屬不同的研發、產品團隊,成本管理是分開的
在/離線服務使用不同的資源排程管理系統,無法統一排程
圖3 在/離線業務混部
隨著雲原生理念、容器和微服務的普及,kubernetes 逐步統治了容器編排領域,成為資料中心的基礎設施。將在/離線業務統一使用 kubernetes 排程管理,日漸成熟。
因為要基於kubernetes 實現在/離線業務的混部,所以需要先了解 kubernetes 有哪些功能能夠幫助實現混部,以及 kubernetes 本身存在哪些問題。
pod是有優先順序(pod priority)的,相應欄位是pod.spec.priority,它表示了pod的重要程度,值越大優先順序越高。排程器排程的時候會優先排程高優先順序的pod,kubelet在驅逐過載節點的pod時,會優先驅逐低優先順序的pod。
所以,可以將離線任務設定較小的pod priority。
pod有三種qos class:
其中,guaranteed pod對於 slo 要求最高,有最高的資源保證;burstable pod對於 slo 要求次之,僅保證 request 部分的資源;best effort pod 對於 slo 要求最低,資源無法保證。
表2 不同 qos class pod 的 oom score
best effort型別pod的 oom score 是最大的,也就是說在發生系統oom的時候,首先kill的就是best effort型別的pod。
當節點上記憶體、磁碟等非可壓縮資源負載過高時,kubelet會驅逐上面的pod,保證節點穩定性,驅逐的順序是: best effort、burstable、guaranteed。
所以,是不是可以將離線任務歸為best effort class 呢?
kubernetes 是使用 cgroups 來實現pod的資源限制的。
圖4 pod cpu cgroups
圖4 是kubernetes cpu cgroups的層級,三種不同的顏色表示三種不同的qos class:
圖5 pod memory cgroups
圖5 是kubernetes memory cgroups的層級,三種不同的顏色表示三種不同的qos class:
之所以在這講一下kubernetes pod cgroups的層級組織結構和動態更新策略,是因為我們開發的資源隔離元件也是通過更改cgroups配置來實現資源隔離的。如果不知道kubernetes原生的cgroups管理策略,很容易發生更新失效或者衝突,引發故障。
kubernetes是使用的靜態排程。靜態排程是指根據容器的資源請求(resource request)進行排程,而不考慮節點的實際負載。所以,經常會發生節點負載很低,但是排程不了新的pod上去的情況。
kubernetes為什麼會使用靜態排程呢?因為要實現乙個基於節點負載進行動態排程的通用框架是很困難的。而靜態排程實現簡單、管理方便,但是對於使用者的要求要高一些,如果 resource request 配置的不合理,可能會導致節點之間負載不均衡以及利用率較低。
而 kubernetes 對於pod之間的資源隔離也是很弱的,僅僅通過cgroups在cpu維度使用cpu.shares控制發生cpu爭用時的時間片分配比例,使用cfs quota限制cpu使用上限;記憶體維度使用memory limit in bytes限制使用上限。
大佬們分別是:張曉龍——網易數帆輕舟技術總監。負責基礎設施研發 /運維至今,在虛擬化、網路、容器、大規模基礎設施管理以及分布式系統等技術架構有多年經驗,當前主要興趣點在雲原生技術方向。
***——網易數帆輕舟業務部資深系統開發工程師。具有多年kubernetes開發運維經驗,負責在/離線業務混部、容器網路編排等多個專案,推動和協助網易內部多個業務實現容器化。
陳林亮——網易數帆輕舟資深雲計算開發工程師。具有多年雲計算開發,運維及優化經驗,參與開發網易雲計算1.0至當前3.0多個雲平台。目前專注在在/離線業務混部、容器編排資源優化等方向。
感謝我的技術總監
這是我的技術總監,他教會了我很多東西,所以發出來與大家共勉。某某,你要辭職了,一 個真正的 有責任心 有能力 真心為下屬考慮的好老大要離開我們了,我很遺憾,很惋惜 不過還是祝您身體健康,活得精彩!雖然我們相處了僅僅一年的時間,而且大多都是工作時間,但是我從你身上卻學會了很多東西。你教會了我不僅僅有技...
來自網上,技術總監的職責
所屬行業 未定行業0 0 0 0 0 一 業務職責 1 制訂並組織實施技術系統工作目標和工作計畫。2 組織制訂並實施技術系統規章制度和實施細則。3 組織不合格品的審理工作。4 組織技術 產品開發與創新。5 組織建立並實施質量體系。6 公司標準化 計量管理工作。7 定期進行技術分析和質量分析工作,制定...
CTO 技術總監和技術經理有啥區別?
最近朋友圈上被cto的故事刷的滿屏都是,著實又火了一次。你我都不是吃瓜群眾,這事不同角色不同的利益點,肯定態度不一樣。作為乙個技術老司機,今天和大夥談談這三個角色到底有啥不同。程式設計師,英文名coder programmer,大家常自嘲叫碼農的階段。這個角色職責是把需求或產品實現為使用者可用的軟體...