更好的任務竊取可以使 Linux 更快嗎?
| 2019-11-23 23:58
Oracle Linux 核心開發人員 Steve Sistare 參與了這場有關核心排程程式改進的討論。
透過可擴充套件的任務竊取進行負載平衡
Linux 任務排程程式透過將喚醒的任務推送到空閒的 CPU,以及在 CPU 空閒時從繁忙的 CPU 中拉取任務來平衡整個系統的負載。在大型系統上的推送側和拉取側,有效的伸縮都是挑戰。對於拉取,排程程式搜尋連續的更大範圍中的所有 CPU,直到找到過載的 CPU,然後從最繁忙的組中拉取任務。這代價非常昂貴,在大型系統上要花費 10 到 100 微秒,因此搜尋時間受到平均空閒時間的限制,並且某些範圍不會被搜尋。並非總能達到平衡,而且閒置的 CPU 依舊閒置。
我實現了一種備用機制,該機制在 idle_balance()
中的現有搜尋中自身受限並且沒有找到之後被呼叫。我維護了一個過載的 CPU 的點陣圖,當可執行的 CFS 任務計數超過 1 時,CPU 會設定該位。這個點陣圖是稀疏的,每個快取記憶體線的有效位數量有限。當許多執行緒同時設定、清除和訪問元素時,這可以減少快取爭用。每個末級快取都有一個點陣圖。當 CPU 空閒時,它將搜尋該點陣圖以查詢第一個具有可遷移任務的過載 CPU,然後將其竊取。這種簡單的竊取會比單獨的 idle_balance()
產生更高的 CPU 利用率,因為該搜尋的成本很便宜,花費 1 到 2 微秒,因此每次 CPU 即將空閒時都可以呼叫它。竊取不會減輕全域性最繁忙的佇列的負擔,但是它比根本不執行任何操作要好得多。
結果
偷竊僅在排程程式程式碼中佔用少量 CPU 開銷即可提高利用率。在以下實驗中,以不同數量的組(每個組 40 個任務)執行 hackbench,並對每次執行結果顯示 /proc/schedstat
中的增量(按 CPU 平均),並增加了這些非標準的統計資訊:
%find
:在舊函式和新函式中花費的時間百分比,這些函式用於搜尋空閒的 CPU 和任務以竊取並設定過載的 CPU 點陣圖。steal
:任務從另一個 CPU 竊取的次數。經過的時間增加了 8% 到 36%,最多增加了 0.4% 的發現時間。
如下圖的綠色曲線所示,新核心的 CPU 繁忙利用率接近 100%,作為比較的基線核心是橙色曲線:
根據負載的不同,竊取可將 Oracle 資料庫 OLTP 效能提高多達 9%,並且我們已經看到 MySQL、Pgsql、gcc、Java 和網路方面有了一些不錯的改進。通常,竊取對上下文切換率高的工作負載最有幫助。
程式碼
截至撰寫本文時,這項工作尚未完成,但最新的修補程式系列位於 https://lkml.org/lkml/2018/12/6/1253。如果你的核心是使用 CONFIG_SCHED_DEBUG=y
構建的,則可以使用以下命令驗證其是否包含竊取最佳化:
# grep -q STEAL /sys/kernel/debug/sched_features && echo Yes
Yes
如果要嘗試使用,請注意,對於具有 2 個以上 NUMA 節點的系統,禁用了竊取功能,因為 hackbench 在此類系統上發生了迴歸,正如我在 https://lkml.org/lkml/2018/12/6/1250 中解釋的那樣。但是,我懷疑這種影響是特定於 hackbench 的,並且竊取將有助於多節點系統上的其他工作負載。要嘗試使用它,請用核心引數 sched_steal_node_limit=8
(或更大)重新啟動。
進一步工作
在將基本盜用演算法推向上游之後,我正在考慮以下增強功能:
- 如果在末級快取中進行竊取找不到候選者,在 LLC 和 NUMA 節點之間進行竊取。
- 維護稀疏點陣圖以標識 RT 排程類中的偷竊候選者。當前
pull_rt_task()
搜尋所有執行佇列。 - 從
idle_balance()
中刪除核心和套接字級別,因為竊取會處理這些級別。當支援跨 LLC 竊取時,完全刪除idle_balance()
。 - 維護點陣圖以標識空閒核心和空閒 CPU,以實現推平衡。
這篇文章最初釋出於 Oracle Developers Blog。
via: https://www.linux.com/blog/can-better-task-stealing-make-linux-faster
作者:Oracle 選題:lujun9972 譯者:wxy 校對:wxy
相關文章
- Linux已可勝任實時任務應用(轉)Linux
- 在 PowerShell 中,您可以使用以下命令來管理 DNS 相關的任務以及 DNS 快取DNS快取
- 如何更好、更快的解讀jive的程式碼
- 獲取任務的執行結果
- 大量 Redis 伺服器存在 SSH 許可權竊取風險Redis伺服器
- linux的定時任務crontabLinux
- Linux | 定時任務Linux
- Linux 定時任務Linux
- Linux at 定時任務Linux
- Linux定時任務Linux
- linux 任務排程Linux
- Chrome擴充套件程式可偷偷竊取你的加密貨幣私鑰Chrome套件加密
- 新型Android木馬Xavier爆發:可悄然竊取你的個人資訊Android
- Chrome瀏覽器擴充套件程式可竊取明文密碼Chrome瀏覽器套件密碼
- Swift 4.0 正式釋出,更快更相容更好用Swift
- Linux任務的前後臺管理Linux
- linux定時任務的設定Linux
- 活用Linux的後臺任務(轉)Linux
- Metasploit之令牌竊取
- 利用Oracle許可實現更好控制Linux(轉)OracleLinux
- Linux系統中延時任務及定時任務Linux
- Linux 任務計劃管理Linux
- Linux crontab 定時任務Linux
- Linux 定時任務(crontab)Linux
- Linux 計劃任務整理Linux
- LINUX 定時任務命令Linux
- Linux - crontab(定時任務)Linux
- Linux 自動任務crontabLinux
- 谷歌瀏覽器“SymStealer”漏洞:可竊取使用者敏感檔案谷歌瀏覽器
- 密碼是如何被竊取的密碼
- linux下定時任務的簡單示例Linux
- 【轉】linux定時任務的設定Linux
- linux定時任務的設定2Linux
- 檔案許可權與計劃任務
- linux系統怎麼新增每天定時任務? linux系統新增定時任務的教程Linux
- JavaScript的巨集任務與微任務JavaScript
- 黑客技術—QQ竊取黑客
- Ernst & Young:黑客每月可從加密貨幣中竊取150萬美元黑客加密