如何使用ELK來監控效能

2021-09-19 08:21:33 字數 4163 閱讀 2825

每當我解決一些應用效能問題的時候,我常常會看到乙個服務由於高的cpu利用率而使得一台或者多台伺服器執行變得非常緩慢。這也許意味著它因為高負載而導致資源缺乏,但是通常情況下這其實是**有bug,乙個異常或者乙個錯誤的流程導致過多占用了系統資源。為了把這些問題找出來,我不得不在newrelic/nagios和elk之間檢視資訊。

所以我確信我需要有乙個單一的管理面板來檢視從各個應用,作業系統以及網路裝置上收集來的事件組合而成的效能指標

為了使用elk來監控你平台的效能,你需要整合一系列的工具。probes是必須包含的元件,它執行在各個主機上用來收集各種系統效能指標。然後,採集的資料需要傳送給logstash,然後在elasticsearch中進行聚集,最後由kibana轉換成圖形。最終,軟體服務操作組成員使用這些圖形展示系統效能。在這篇文章中,我將分享我們如何建構我們的elk軟體棧來監控服務的效能。

在收集和傳送資料到logstash中的第乙個步驟,我們使用乙個名為 collectl 的工具。該工具來自於乙個開源專案,它包含的大量的選項允許系統管理員從多個不同的it系統中獲取各種指標,並且執行儲存這些資料供以後分析。我們使用它來生成,追蹤,以及儲存指標資料,例如網路吞吐量,cpu的磁碟io等待時間,空閒的記憶體,以及cpu的空閒時間(指出過度/未充分使用計算機資源)。它也常被用於監控其他型別的系統資源,例如inode的使用以及開啟的socket數量。

collectl命令輸出樣例

最後,collectl使用指定格式(in plot format)將採集的指標輸出到乙個日誌檔案中。該開源專案知道如何收集資訊但是它並不會自動傳送資料到elk軟體棧中。

我們把collectl封裝到了乙個docker容器中來獲取乙個docker映象,該映象會包含了資料採集和資料傳送的基本軟體。我們使用版本4.0.0的collectl以及下面提到的配置,這樣可以避免一系列的問題:

—— 為了避免資料在容器中過載,我們只儲存了當天的資料。更久的資料都是維護在elk軟體棧中,因此你無需擔心在容器的日誌中儲存所有的資料導致的問題。

—— collectl可以以指定的時間週期收集各種取樣資料,當它會用不同的時間週期把資料持久到磁碟。這被稱為重新整理周期。如果資料每秒鐘都被重新整理到磁碟那麼你可以得到近乎實時的資料。不過例如對於乙個30秒的採集間隔,那麼選擇乙個十分激進的取樣週期不是必須的。乙個輸出格式化器會用於輸出指定格式(a plot format)的輸出,預設它會在每一行輸出多個值,每個值用空格分開。

collectl配置檔案看上去類似下面:

daemoncommands = -f /var/log/collectl/performance-tab -r00:00,0 -f1 -s+yz -oz -p --interval 30

pquery = /usr/sbin/perfquery:/usr/bin/perfquery:/usr/local/ofed/bin/perfquery

pcounter = /usr/mellanox/bin/get_pcounter

vstat = /usr/mellanox/bin/vstat:/usr/bin/vstat

ofedinfo = /usr/bin/ofed_info:/usr/local/ofed/bin/ofed_info

resize=/usr/bin/resize:/usr/x11r6/bin/resize

ipmitool = /usr/bin/ipmitool:/usr/local/bin/ipmitool:/opt/hptc/sbin/ipmitool

ipmicache = /var/run/collectl-ipmicache

ipmitypes = fan,temp,current

rsyslog是另乙個容器元件。它用來從日誌檔案中提取資料,並且傳送資料到elk軟體棧中。為了讓logstash專注於需要欄位而不是所有的資料上,這裡建議使用rsyslog在日誌裡增加一些元資料來對日誌進行篩選。這裡可以在資料傳送前對指標進行過濾或者增加一些資訊比如例項名稱以及ip位址。附加上了時間戳後,這些資訊可以被傳送到logstash。

在本步驟,有兩個問題需要注意:

1 - 時間戳: 首先,collectl並不在採集的資料中輸出它的時間戳。因此如果你不同的主機執行在不同的時區,它們在你的elk裡面並不會對齊。為了解決這個問題,我們需要查詢容器當前執行的時區,然後設定相應的時間戳。

2 - 遵循collectl日誌檔名: 另乙個複雜的問題是collectl輸出資料到乙個檔案中,但是該檔名不是固定不變的。僅僅檔名的字首是可以自定義的,然後collectl自動在檔名上加上了當前日期。這個問題導致rsyslog不能通過檔名來監視檔案,當日期切換時檔名也會改變。我們可以用最新版本的rsyslog —— 版本8來解決它,但是這裡我假設大多數使用者還沒有用上這個版本。我們建立了乙個很小的指令碼,它呼叫了老版本的rsyslog,該指令碼在容器裡執行了乙個定時的任務,該任務會鏈結乙個指定的名稱的檔名到乙個固定的日誌檔名上。然後syslog只中那個固定日誌檔案中提取資料,即便該檔案鏈結的目標檔案改變了也沒有關係。這就像乙個指標,它在一定的時間下總是指向正確的collectl日誌檔案。

$modload imfile

$inputfilepollinterval 10

$privdroptogroup adm

$workdirectory /var/spool/rsyslog

# logengine access file:

$inputfilename /var/log/collectl/daily.log

$inputfiletag performance-tab:

$inputfilestatefile stat-performance

$inputfileseverity info

$inputfilepersiststateinterval 20000

$inputrunfilemonitor

if $programname == 'performance-tab' then @@xxlistenerxx;logzioperformanceformat

— collectl

在收集和裝箱傳送後,我們需要做資料的解析。collectl返回的是未結構化的日誌資料,它基本是由一系列的數字組成, logstash grok表示式使用這些資料來獲取每個欄位的名稱和指定的值。

collectl的配置引數顯示設定了乙個特定的輸出模式。rsyslog日誌配置在傳送的訊息中的特定位置增加了時區的資訊。如果你想同時使用了這兩個配置,那grok模式配置如下:

% % %

% % %

% %% %

% %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% %

% %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% % % % % % % %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% % %

% % %?(

%)

如果你執行了乙個快速的elk軟體棧,那你會幾乎同時得到這些資料的展示。顯然這依賴於你安裝的elk的效能,不過你可以預期會在半分鐘之內得到結果 - 乙個最新的資料流的資訊。

在logz.io,我們有一些預定義的報警和儀表板來展示效能指標,它們都是使用collectl。如果你也使用logz.io服務,請在聊天室裡找到我們,我們將會分享這些有用的資訊。

翻譯自這裡

使用nagios來監控memcached

在麼,我們來講講如何讓nagios來監控memcached吧。需要一些perl的modules 1.nagios plugin 2.nagios plugins memcached 3.carp clan 其他的你可能還會缺,安裝的時候使用sudo make install b來看看吧 安裝的時候執...

使用HttpHandler來監控HTML頁面請求

最近要實現乙個iis7下的純html頁面的請求 由於諸多原因 所以試著做了個html handler 編寫乙個 net 2.0 的httphandler來處理請求 此處是 html檔案的請求 將編譯後的dll檔案放到目標 的bin目錄中 在右上方click add managed handler鏈結...

使用INNOTOP監控MySQL效能

最近mysql效能不太理想,已經搭建了mysql主從同步,但是還要對資料庫進一步優化。老大在server上裝了個叫innotop的工具,可以檢測很多狀態,上去用了一下,是個很不錯的工具。switch to a different mode b innodb buffers i innodb i o ...