問題背景
最近注意到自己負責的一個任務調度集羣碰到了計算資源業務線分配不均的問題(即業務線資源隔離沒有做好):
- 在任務高峯期,調度系統會將計算資源偏向分配給(執行耗時比較長的)大任務,而(執行耗時比較短的)小任務卻分到較少的計算資源。
- 當某一個業務線的任務都是大任務時,就會出現大部分計算資源都分配到該業務線,而其他業務線只分配到較少的計算資源。
閱讀該系統調度相關代碼稍加分析就明白了爲什麼會出現這種情況,在分析之前先講一下這個任務調度系統工作機制:
- 該系統爲master-slave模式,即有一箇中心調度節點,多個工作節點。
- 工作節點會不停的嘗試請求中心調度節點獲取任務並執行,循環往復。
- 當工作節點請求調度節點獲取任務時,調度節點會選擇一條業務線,並將該業務線的任務返回給工作節點。
問題分析
現在問題就出現在調度節點選擇業務線的算法上,目前的算法是:
- 各業務線提前配置好資源上下限,根據任務堆積情況進行自動擴縮,即每條業務線分配的資源是實時計算的。
- 選擇業務線則是根據業務線實時配置的計算資源 / 所有業務線實時配置的資源之和 得到一個權重比例,然後根據該權重比例進行選擇業務線。權重比例大(即該業務線配置的資源在所有業務線資源之和中所佔比例大),被選中的概率就大。
這個算法粗略一看沒什麼問題,但是仔細分析一下這裏忽略了一個關鍵因素:沒有考慮任務執行耗時,默認任務執行耗時都一樣。
這樣會造成大任務佔用了大部分的計算資源(即工作節點),這裏簡單描述一下:
- 這裏有A、B2條業務線,分別配置了5個計算資源(總共10個計算資源):可以計算得出每條業務線中的任務被執行的概率是50%。
- 其中業務線A中有100大任務,業務線B有200個小任務。假設大任務執行需要20s,小任務執行需要10s。那麼正常情況業務線A總共需要(100 * 20) 2000s計算時間才能執行完,業務線B也需要(200 * 10)2000s計算時間執行完,同時在(2000s * 2 / 10)400s後執行完成
- 實際情況是:
調度輪次 | 第1次 | 第2次 | 第3次 | 第4次 | 第5次 | 第6次 | 第N次 |
---|---|---|---|---|---|---|---|
選擇的業務線 | A | B | A | B | A | B | |
業務線A剩餘任務 | 99 | 99 | 98 | 98 | 97 | 97 | 100 - N/2 |
業務線B剩餘任務 | 200 | 199 | 199 | 198 | 198 | 197 | 200 - N/2 |
大家發現端倪沒有,雖然在選擇任務線的邏輯上是公平的、符合預期的,但是任務本身是不公平的(任務執行耗時有長有短),這就會造成大任務多的業務線實際上分配了比預期多得多的計算資源。
思考
到了這裏,心裏出現了一些疑問:
- 調度系統存在的意義是什麼?
- 任務怎麼調度才符合預期?
對於第一個問題,我給出一些我的見解:任務調度系統存在的意義是解決任務與計算資源之間的矛盾。如果計算資源足夠多,多到每一個任務都能夠立即得到執行,那麼調度系統就沒有存在的意義了。
第二個問題,任務怎麼調度才符合預期。
還記得上文我提到的業務線提前配置好資源上下限嗎?
對,這個很關鍵。業務線配置的是資源的上下限,業務線只關心資源,只要分配給業務線的資源符合預期就行,不用關心這一次任務到底調度業務線A還是業務線B的任務。
理清楚了第二個問題,那麼之前的調度算法問題就很明顯了,計算權重時應該把計算資源的因素考慮進去。
計算資源的視角
在任務調度系統中,看待資源,我覺得有兩種視角:
- 機器視角
- 計算時間視角
機器視角
這個很好理解,符合自然直覺。把物理機器當成一種計算資源,這個物理機器分配給業務線A就是業務線A的計算資源,必須優先執行業務線A的任務。
那麼在調度任務時邏輯就非常簡單了,這臺物理機器嘗試從調度節點獲取任務時,應該優先獲取業務線A的任務,只有當業務線A沒有任務時才能借給其他業務線執行任務。
在機器視角下,業務線資源分配邏輯被前置到了物理機器啓動環節,即在機器啓動時就要確定好歸屬於哪條業務線。
在機器視角下,業務線資源隔離、分配變得很簡單了,但是也存在不小的問題,至少在我這個(動態擴縮容)場景下不太適用:因爲我們的調度系統每分鐘都要動態計算每條業務線的目標資源數量,很有可能因爲資源不足導致分配給某條業務線的機器一直起不來,就會導致該業務線沒有計算資源執行任務。
在實際的操作過程中,我選擇了從計算時間視角看待計算資源,來解決我碰到的問題。
計算時間視角
在機器視角中,把物理機器看成計算資源;在計算時間視角中,把物理機器的計算時間抽象成計算資源。
怎麼理解計算時間是一種計算資源呢?可以參考現在計算機中CPU的調度邏輯,把CPU計算資源按照時間進行分片,按照一定的算法將計算時間分配給不同的進程,達到多個進程同時運行的效果。
在計算時間視角下,不管底層機器有多少臺,始終按照業務線實時配置的計算資源 / 所有業務線實時配置的資源之和 得到一個權重比例去分配計算資源。
具體做法是:
- 業務線實時配置的計算資源 / 所有業務線實時配置的資源之和 得到一個權重比例,稱之爲P吧。
- 統計本輪資源調度中,所有業務線已使用的計算時間之和,稱之爲T吧。
- 比較本輪資源調度中,某業務線已使用的計算時間是否大於 T * P:若大於,則說明該業務線的計算時間已經使用完,不能再參與本次任務調度了;反之則正常參與任務調度計算。
- 計算業務線實時配置的計算資源 / 剩下業務線實時配置的資源之和 得到一個權重比例,按照該比例進行任務調度
通過計算時間的視角去分配計算資源,能夠屏蔽底層機器狀態,比如資源不夠機器起不來、機器擴縮容等沒有達到目標機器數量的情況。
通過計算時間的視角抽象計算資源也有弊端:如果底層機器計算能力差異很大的時候仍然會干擾資源分配的準確性。