Below:Facebook 開源的 Linux 系統資源監視器

在這篇文章中,我們將介紹 below:一個用於現代 Linux 系統的 Apache 2.0 許可的資源監視器。below 可以讓你重放以前記錄的數據。

背景

內核的主要職責之一是調度對資源的訪問。有時這可能意味着分配物理內存,使多個進程可以共享同一主機。其他時候,它可能意味着確保 CPU 時間的公平分配。在這些場景裏,內核提供了機制,而將策略留給了 “別人”。近來,這個“別人” 通常是 systemd 或 dockerd 這樣的運行時。運行時接受來自調度器或最終用戶的輸入(類似於運行什麼和如何運行)並在內核上轉動正確的旋鈕和拉動正確的槓桿,從而使工作負載能夠_好好_工作。

在一個完美的世界裏,故事就到此結束了。然而,現實情況是,資源管理是一個複雜的、相當不透明的技術混合體,在幾十年裏計算技術不斷髮展。儘管其中一些技術有各種缺陷和死角,但最終的結果是,容器運作得比較好。雖然用戶通常不需要關心這些細節,但對於基礎設施運營商來說,對他們的技術架構擁有可見性是至關重要的。可見性和可調試性對於檢測和調查錯誤的配置、問題和系統性故障至關重要。

讓事情變得更加複雜的是,資源中斷往往難以重現。經常需要花費數週時間等待一個問題重新出現,以便調查其根本原因。規模的擴大進一步加劇了這個問題:我們不能在_每臺_主機上運行一個自定義腳本,希望在錯誤再次發生時記錄下關鍵狀態的片段。因此,需要更復雜的工具。這就出現了 below

GitHub 鏈接:

https://github.com/facebookincubator/below

動機

歷史上,Facebook 一直是 atop[1] 的忠實用戶。atop 是一個用於 Linux 的性能監視器,能夠報告所有進程的活動以及各種系統級活動。與 htop 等工具相比,atop 最引人注目的功能之一是能夠作爲一個守護程序記錄歷史數據。這聽起來是一個簡單的功能,但在實踐中,這使得調試無數的生產問題成爲可能。有了足夠長的數據保留,就有可能在時間上回溯,查看在問題或故障發生之前、期間和之後的主機狀態。

不幸的是,隨着時間的推移,人們發現atop 有某些不足之處。首先,控制組 [2]cgroup 已經成爲控制和監視 Linux 機器上資源的實際方式。atop 仍然缺乏對這一基本構建模塊的支持。第二,atop 用自定義的 delta 壓縮方法在磁盤上存儲數據。這在正常情況下運行良好,但在沉重的資源壓力下,主機很可能會丟失數據點。由於使用了 delta 壓縮,在數據最重要的時間段內,數據可能會大面積丟失。第三,用戶體驗有一個陡峭的學習曲線。我們經常聽到 atop 的資深用戶說,他們喜歡密集的佈局和衆多的鍵盤綁定。然而,這也是一把雙刃劍。當一個剛進入這個領域的人想要調試一個生產問題時,他們現在要同時解決兩個問題:手頭的問題和如何使用 atop

below 是由 Facebook 的資源控制團隊爲其設計和開發的,並得到了 atop 生產環境用戶的支持。顧名思義,資源控制團隊負責的是規模化的資源管理。該團隊由內核開發人員、容器運行時開發人員和硬件人員組成。認識到下一代系統監控器的機會,我們在設計 below 時考慮到以下幾點:

安裝

安裝該軟件包:

# dnf install -y below

打開記錄守護進程:

# systemctl enable --now below

快速介紹

below 最常用的模式是重放模式。顧名思義,重放模式是重放以前記錄的數據。假設你已經啓動了記錄守護程序,那麼通過運行以下程序啓動一個會話:

$ below replay --time "5 minutes ago"

然後你會看到控制組視圖:

如果你不知道該怎麼操作,或者忘記了一個鍵位,按 ? 可以進入幫助菜單。

屏幕的最上方是狀態欄。狀態欄顯示關於當前樣本的信息。你可以通過按 tT 分別向前和向後移動樣本。中間的部分是系統概覽。系統概覽包含了關於整個系統的統計數據,一般來說,這些數據總是很有用的。第三部分也是最下面的部分是多用途視圖。上面的圖片顯示了控制組視圖。此外,還有進程和系統視圖,分別通過按 ps 來訪問。

來移動列表選擇。按回車鍵來摺疊和展開控制組。假設你發現了一個感興趣的控制組,你想看看它裏面有哪些進程在運行。要放大進程視圖,選擇控制組並按 z

再按 z 返回到控制組視圖。這個視圖有時會有點長。如果你對你要找的東西有一個模糊的概念,你可以通過按 / 並輸入一個過濾器來過濾控制組名稱。

在這一點上,你可能已經注意到了一個我們還沒有探索過的標籤系統。要在標籤中向前和向後循環,可以分別按 TabShift + Tab。我們把這個問題留給讀者去做練習。

其他功能

在底層,below 有一個強大的設計和架構。Facebook 正在不斷升級到更新的內核,所以我們從不假設數據源是可用的。這種默契的假設使得內核和 below版本之間能夠完全向前和向後兼容。此外,每個數據點都用 zstd 壓縮並完整地存儲。這解決了我們看到的 atop 在大規模時的 delta 壓縮問題。根據我們的測試,我們的每個樣本壓縮可以達到平均 5 倍的壓縮率。

below 也使用 [eBPF][8] 來收集關於短暫進程(生存時間短於數據收集間隔的進程)的信息。相比之下,atop 使用 BSD 進程覈算來實現這一功能,這是一個已知緩慢且容易發生優先級轉換的內核接口。

對於用戶來說,below 還支持實時模式和一個轉儲接口。實時模式將記錄守護程序和 TUI 會話合併到一個進程中。這對於瀏覽系統狀態是很方便的,不需要爲數據存儲投入長期運行的守護程序或磁盤空間。轉儲接口是一個可編寫腳本的接口,用於所有的 below 數據存儲。轉儲既強大又靈活,詳細的數據以 CSV、JSON 和人類可讀格式提供。

總結

below 是一個 Apache 2.0 許可的開源項目,我們(below 的開發者)認爲它比資源監控領域的現有工具具有引人注目的優勢。我們已經花了大量的精力來準備 below,以提供開源使用,所以我們希望讀者和社區有機會嘗試 below,並報告錯誤和功能要求。

參考資料

[1]

atop: https://www.atoptool.nl/

[2]

控制組: https://en.wikipedia.org/wiki/Cgroups

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/RLlkRsI7mTFDPvB7hj3rZg