高性能的Linux集群監控之道
◆ 有效壓縮
數值數據的文本表示由來自個字節集中的字符組成而不是二進制下的個字節集它們產生的數字及模式的相對頻率允許有效地使用基于壓縮算法的字典及熵(平均信息量)
/proc虛擬文件系統
/proc虛擬文件系統(也叫procfs)是Unix操作系統所使用的虛擬文件系統的Linux實現包括Sun SolarisLinuxBSD在/proc開始時它以一個標準文件系統出現并包含與正在運行的進程IDs同樣名字的文件然而在/proc中的文件不占用磁盤空間它們存在于工作存儲器(內存)中/proc最初的目的是便于進程信息的存取但是現在在Linux中它可被內核的每一部分使用來報告某些事情
在/proc文件系統提供的成百上千的值當中我們將集中考慮集群監控所需的最小集它們包括
◆ /proc/loadavg包含系統負載平均值;
◆ /proc/meminfo包含存儲管理統計量;
◆ /proc/net/dev包含網卡度量;
◆ /proc/stat包含內核統計量;
◆ /proc/uptime包含總的系統正常工作時間及空閑時間
每個文件提供的值的數量是不同的這些文件的完整有效值列表如下
◆ /proc/loadavg提供以下數據
秒鐘平均負載;
秒鐘平均負載;
秒鐘平均負載;
總作業數;
正在運行的作業總數
◆ /proc/meminfo提供的存儲器信息包括
活動存儲器;
不活動存儲器;
緩沖存儲器;
高速緩沖存儲器;
總的自由存儲器;
總的高位存儲器;
自由高位存儲器;
總的低位存儲器;
自由低位存儲器;
共享存儲器;
交換存儲器;
交換高速緩沖存儲器;
交換自由存儲器;
總存儲器
◆ /proc/net/dev中包括每個網卡的如下數據
接收到的字節;
接收到的壓縮字節;
收到的誤碼數;
收到的漏失誤碼;
收到的FIFO誤碼;
收到的幀誤碼;
收到的多播誤碼;
收到的總包數;
已傳輸的字節;
已傳輸的壓縮字節;
傳輸誤碼總數;
傳輸載波誤碼;
傳輸沖突誤碼;
傳輸漏失誤碼;
傳輸FIFO誤碼;
傳輸的總包數
◆ /proc/stat提供
引導時間;
上下文切換數量;
中斷總量;
進頁面總數;
出頁面總數;
進程總數;
換入總數;
換出總數;
合計CPU空閑時間;
合計CPU nice時間;
合計CPU系統時間;
合計CPU用戶時間
同時提供對每個CPU的:
單個CPU空閑時間;
單個CPU nice時間;
單個CPU系統時間;
單個CPU用戶時間
以及對每個磁盤驅動器的如下數據
單個磁盤塊讀;
單個磁盤塊寫;
單個磁盤I/O總數;
單個磁盤I/O讀;
單個磁盤I/O寫
◆ /proc/uptime中包括
系統總工作時間;
系統總空閑時間
值得注意的是每次某個/proc被讀時一個句柄函數都被內核或特有模塊調用來產生數據數據在運行中產生不管是讀一個字符還是一個大的字塊整個文件都將被重建這對效率是至關重要的一點因為使用/proc的任何系統監控器將吞下整個文件而不是一點一點地處理它
Java提供了豐富的文件I/O類集包括基于類的流基于類的塊設備以及JSDK 提供的新的I/O庫實驗表明一般而言對基本的塊讀寫文件操作用RandomAccessFile類進行I/O是最佳的例如塊讀文件操作如下
mFile = new RandomAccessFile( /proc/meminfo r );
//以讀方式打開文件
mFileread( mBuffer ); //讀文件塊
結論
本文討論了如何將Java語言有效地用于Linux集群結點上的高性能監控在程序設計中要注意以下方面
◆ 采用/proc文件系統;
◆ 以塊形式讀/proc文件而不是以行或字符形式;
◆ 在讀文件期間保持文件打開;
◆ 消除不必要的數據轉換;
◆ 在結點上合并數據;
◆ 以壓縮形式傳輸數據;
◆ 注意與性能問題相關的語言或庫
對高性能監控而言內核模塊不是必要條件這點很重要因為它在Linux版本和分類之間提供了很大程度的可移植性在監控器實現語言上有很多的選擇但是/proc文件系統的性能卻很依賴內核代碼的效率因此適當地理解有關的機制將對以任何語言編寫的監控器性能有非常大的影響。
評論