高性能的Linux集群監控之道
監控是集群管理的核心任務監控數據可用于調度任務負載平衡向管理員報告軟硬件故障并廣泛地控制系統使用情況監控信息必須在不影響集群性能的情況下獲得本文將討論使用/proc文件系統和Java來獲得監控數據的方法
本文引用地址:http://www.104case.com/article/201609/303759.htmJava在Linux集群中的應用
Java技術為集群管理開發者提供了許多解決問題的辦法Java是動態靈活可移植的這些不尋常的特征使得它成為了在異構網絡及平臺上構造集群管理的理想基礎
Java具有廣泛的例程庫很容易處理IP協議如TCPUDP并可在multihomed主機上進行網絡程序設計用它創建網絡連接比用C或C++更容易通過Java本地接口(JNI)運行在Java 虛擬機(JVM)內的Java代碼能夠與用其它語言編寫的應用及庫文件相互操作并匯編
在構造集群監控和管理時Java早已是一個可選的語言然而Java語言通常只被用于系統的前端或集群主機部分而將用C 語言編寫的守護進程安裝在集群結點上盡管Java程序設計語言提供了許多優點但是對于高性能集群監控Java能夠有效地替換運行在每個結點上的C 語言守護進程嗎?這將是本文討論的重點
高性能監控
監控Linux集群工具傳統上以秒為測量頻率來提供有限量的數據而高性能集群監控被定義為“以intrasecond為測量頻率從結點有效地采集數據的能力”當涉及較大集群時監控軟件的低效率問題就變得更加嚴重這是因為所運行的應用軟件必須互相協調或共享全局資源
在一個結點上的阻隔沖突(Interference)能影響其它結點上作業的運行例如一個MPI作用需要與所有參與的結點同步一種解決辦法是收集少量的數據并以小頻率傳輸然而如果是高性能監控這種解決辦法是不可接受的因為有較重利用率的集群應該被頻繁持續地監控本地作業調度器必須能夠基于資源使用情況做快速決策管理員經常希望收到緊急事件的立即通知并希望觀察到歷史趨勢數據如果集群不能被頻繁持續地監控那么這些要求是不可能實現的因此必須采取一些措施如使用更有效的算法增加傳輸的并行性提高傳輸協議及數據格式的效率減少冗余等
在跟蹤運行中的資源使用情況時壓縮Profiling應用有助于調試程序或優化程序對一個給定的應用而言像存儲器網絡CPU這樣動態資源的使用可能快速地改變著為了能夠觀察應用是怎樣使用這些資源的一種可能的辦法是使用高頻率的監控
即使用戶對高頻率監控沒有興趣如果算法是有效的不管監控頻率是多少它也將消費很少的資源在異構集群中這種效率將更重要用戶的作業可以被分散到較快的及較慢的結點上慢的結點需要全部CPU來跟上較快的結點并與之同步一個監控程序花費在較慢結點上的CPU時間是作業的關鍵路徑
監控階段
集群監控主要消耗CPU周期與網絡帶寬這兩個重要資源然而資源消費問題與這兩個資源是根本不同的CPU利用問題對結點而言是完全本地化的問題可通過創建有效的收集與合并算法來解決網絡帶寬是共享資源是規模問題可以通過最小化網絡上傳輸的數據量來解決
為了解決這兩個問題我們將集群監控分為三個階段收集合并傳輸收集階段負責從操作系統裝載數據分析數據值并存儲數據合并階段負責將來自多個數據源的數據合在一起決定數據值是否改變并過濾它們傳輸階段負責壓縮并傳輸數據本文集中討論Linux集群監控的收集階段
收集階段
Linux有幾種方法來進行系統統計每種方法都各有其優缺點
◆ 使用現有的工具
標準及非標準工具能執行一個或多個收集合并及傳輸階段如rstatd或SNMP工具然而標準的rstat后臺程序提供的信息是有限的速度慢而且效率低
◆ 內核模塊
幾個系統監控工程利用內核模塊來存取監控數據一般情況下這是很有效的收集系統數據的方法然而這種方法存在的問題是當主內核源內有其它改變時必須保持代碼一致性一個內核模塊可能與用戶想使用的其它內核模塊相沖突此外在使用監控系統之前用戶必須獲得或申請模塊
◆ /proc虛擬文件系統
/proc 虛擬文件系統是一個較快的高效率執行系統監控的方法使用/proc的主要缺點是必須保持代碼分析與/proc 文件格式改變的同步事實表明Linux內核的改變比/proc 文件格式的改變要更頻繁所以用/proc虛擬文件系統比用內核模塊存在的問題要少
◆ 混合系統
某些監控系統采用混合方式用內核模塊收集數據用/proc虛擬文件系統作為數據接口
合并階段
合并階段的實現可以在結點上集群管理的主機上或者分布在兩者上考慮到效率我們只采用在結點上的合并原因在于結點是監控數據的收集器與提供者兩個或多個同時的數據請求不會引起兩次操作系統調用來收集數據而是將第一次請求獲得的數據緩存并可以提供給第二次請求調用這種方法減少了操作系統的負擔提高了監控系統的響應性合并階段也可以用于將多個數據源的數據以相互獨立的收集速率結合因為并不是所有的數據都以同樣的速度改變或者需要以同樣的速率收集
使用在結點層上合并的另一個原因是減少了包括傳輸在內的信息量許多/proc文件既包含動態數據也包含靜態數據刪除最近一次傳輸后沒有改變的值一個結點發送的數據量可以大大地減少合并不僅除去了不經常改變的動態值的傳輸也解決了從不改變的靜態值的傳輸
傳輸階段
監控數據幾乎總是按一個層次結構組織起來傳輸階段的任務就是將層次數據進行有效的編碼形成一種能高效傳輸的數據格式Java擁有的文件格式是存儲層次數據的有效方法并且用提供的Java APIs很容易完成SExpressions已經被認為是傳輸這種數據的另一個有效的方法
關于傳輸監控數據普遍討論的問題是數據應該按二進制編碼還是按文本格式編碼二進制數據更容易壓縮因此也能更有效地傳輸但是當采用/proc文件系統時監控數據通常以人們易讀的格式存儲在傳輸之前將數據轉換為二進制格式將需要更多的處理資源與時間以文本格式保留收集的數據結點資源能被用于更多非監控性的相關工作
采用文本格式的數據將提供如下額外的益處
◆ 平臺獨立性
當監控異構集群時機器之間數據字節指令的配置不是永遠相同的文本格式的使用在代碼方面解決了這個問題而且體系結構獨立不會影響更多的處理需求
◆ 易讀的格式
文本數據能以人們易讀的格式進行組織如果需要的話這種特征能容易地進行程序調試或允許用戶觀看數據流
評論