天天看點

zabbix自動發現與監控記憶體和CPU使用率最高的程序

監控需求

  某項目的應用伺服器CPU和記憶體使用率的監控,通過zabbix系統監控記錄應用伺服器上程序的CPU和記憶體的使用情況,并以圖表的形式實時展現,以便于我們分析伺服器的性能瓶頸。

監控方式

  利用zabbix監控系統的自動發現功能,首先編寫shell腳本擷取伺服器的CPU和記憶體資源使用率最大的程序,以json的格式輸出,然後對這些程序的CPU和記憶體資源使用情況進行監控。(本文監控的程序為Linux伺服器中資源使用率最高的10個程序。)

缺點

不适用于監控固定的程序

首先使用top指令檢視程序狀态,再取出程序的%CPU(該值表示單個CPU的程序從上次更新到現在的CPU時間占用百分比) 和%MEM值。

<code>hmracdb2:~ </code><code># top</code>

<code>top</code> <code>- 13:57:01 up 32 days,  5:21,  2 </code><code>users</code><code>,  load average: 0.14, 0.26, 0.34</code>

<code>Tasks: 206 total,   1 running, 205 sleeping,   0 stopped,   0 zombie</code>

<code>Cpu(s):  3.7%us,  2.7%sy,  0.0%ni, 87.2%</code><code>id</code><code>,  6.3%wa,  0.0%hi,  0.1%si,  0.0%st</code>

<code>Mem:   3926096k total,  3651612k used,   274484k </code><code>free</code><code>,   788120k buffers</code>

<code>Swap:  4193276k total,  1369968k used,  2823308k </code><code>free</code><code>,  1443884k cached</code>

<code> </code> 

<code>  </code><code>PID USER      PR  NI  VIRT  RES  SHR S   %CPU %MEM    TIME+  COMMAND                                                          </code>

<code> </code><code>2365 root      20   0  854m 315m  12m S      3  8.2   1252:49 ohasd.bin                                                         </code>

<code> </code><code>5307 oracle    20   0 1783m  22m  22m S      3  0.6   1106:03 oracle                                                            </code>

<code> </code><code>4532 root      20   0  676m  31m  13m S      2  0.8 853:35.32 crsd.bin                                                          </code>

<code> </code><code>4272 grid      RT   0  437m 282m  52m S      2  7.4   1006:47 ocssd.bin                                                         </code>

<code> </code><code>5279 oracle    20   0 1771m  60m  48m S      2  1.6 477:11.19 oracle                                                            </code>

<code> </code><code>5122 oracle    20   0  654m  15m  12m S      1  0.4 537:40.85 oraagent.bin</code>

由于top是互動的指令,我們把top指令的結果輸出到一個檔案上

hmracdb2:~ # top -b -n 1 &gt; /tmp/.top.txt

第一個腳本,擷取監控程序記憶體資源占有率前10的程序,輸出格式為json格式,用于zabbix自動發現程序

<code># cat discovery_process.sh </code>

<code>#!/bin/bash</code>

<code>#system process discovery script</code>

<code>top</code> <code>-b -n 1 &gt; </code><code>/tmp/</code><code>.</code><code>top</code><code>.txt &amp;&amp; </code><code>chown</code> <code>zabbix. </code><code>/tmp/</code><code>.</code><code>top</code><code>.txt</code>

<code>proc_array=(`</code><code>tail</code> <code>-n +8 </code><code>/tmp/</code><code>.</code><code>top</code><code>.txt | </code><code>awk</code> <code>'{a[$NF]+=$10}END{for(k in a)print a[k],k}'</code><code>|</code><code>sort</code> <code>-gr|</code><code>head</code> <code>-10|</code><code>cut</code> <code>-d</code><code>" "</code> <code>-f2`)</code>

<code>length=${</code><code>#proc_array[@]}</code>

<code>printf</code> <code>"{\n"</code>

<code>printf</code> <code>'\t'</code><code>"\"data\":["</code>

<code>for</code> <code>((i=0;i&lt;$length;i++))</code>

<code>do</code>

<code>    </code><code>printf</code> <code>"\n\t\t{"</code>

<code>    </code><code>printf</code> <code>"\"{#PROCESS_NAME}\":\"${proc_array[$i]}\"}"</code>

<code>    </code><code>if</code> <code>[ $i -lt $[$length-1] ];</code><code>then</code>

<code>        </code><code>printf</code> <code>","</code>

<code>    </code><code>fi</code>

<code>done</code>

<code>    </code><code>printf</code> <code>"\n\t]\n"</code>

<code>printf</code> <code>"}\n"</code>

或者

<code># cat discovery_process2.sh </code>

<code>proc_array=`</code><code>tail</code> <code>-n +8 </code><code>/tmp/</code><code>.</code><code>top</code><code>.txt | </code><code>awk</code> <code>'{a[$NF]+=$10}END{for(k in a)print a[k],k}'</code><code>|</code><code>sort</code> <code>-gr|</code><code>head</code> <code>-10|</code><code>cut</code> <code>-d</code><code>" "</code> <code>-f2`</code>

<code>length=`</code><code>echo</code> <code>"${proc_array}"</code> <code>| </code><code>wc</code> <code>-l`</code>

<code>count=0</code>

<code>echo</code> <code>'{'</code>

<code>echo</code> <code>-e </code><code>'\t"data":['</code>

<code>echo</code> <code>"$proc_array"</code> <code>| </code><code>while</code> <code>read</code> <code>line</code>

<code>    </code><code>echo</code> <code>-en </code><code>'\t\t{"{#PROCESS_NAME}":"'</code><code>$line</code><code>'"}'</code>

<code>    </code><code>count=$(( $count + 1 ))</code>

<code>    </code><code>if</code> <code>[ $count -lt $length ];</code><code>then</code>

<code>        </code><code>echo</code> <code>','</code>

<code>echo</code> <code>-e </code><code>'\n\t]'</code>

<code>echo</code> <code>'}'</code>

輸出的效果如下

<code>[root@Zabbix_19F ~]</code><code># ./discovery_process.sh </code>

<code>{</code>

<code>"data"</code><code>:[</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"mysqld"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"php-fpm"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"zabbix_server"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"nginx"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"sshd"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"bash"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"zabbix_agentd"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"qmgr"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"pickup"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"master"</code><code>}</code>

<code>]</code>

<code>}</code>

第二個腳本,用于zabbix監控的具體監控項目(item)的key,通過腳本擷取第一個腳本自動發現的程序的CPU和記憶體的具體使用情況與使用率。

<code>#system process CPU&amp;MEM use information</code>

<code>#mail: [email protected]</code>

<code>mode=$1</code>

<code>name=$2</code>

<code>process=$3</code>

<code>mem_total=$(</code><code>cat</code> <code>/proc/meminfo</code> <code>| </code><code>grep</code> <code>"MemTotal"</code> <code>| </code><code>awk</code> <code>'{printf "%.f",$2/1024}'</code><code>)</code>

<code>cpu_total=$(( $(</code><code>cat</code> <code>/proc/cpuinfo</code> <code>| </code><code>grep</code> <code>"processor"</code> <code>| </code><code>wc</code> <code>-l) * 100 ))</code>

<code>function</code> <code>mempre {</code>

<code>    </code><code>mem_pre=`</code><code>tail</code> <code>-n +8 </code><code>/tmp/</code><code>.</code><code>top</code><code>.txt | </code><code>awk</code> <code>'{a[$NF]+=$10}END{for(k in a)print a[k],k}'</code> <code>| </code><code>grep</code> <code>"\b${process}\b"</code> <code>| </code><code>cut</code> <code>-d</code><code>" "</code> <code>-f1`</code>

<code>    </code><code>echo</code> <code>"$mem_pre"</code>

<code>function</code> <code>memuse {</code>

<code>    </code><code>mem_use=`</code><code>tail</code> <code>-n +8 </code><code>/tmp/</code><code>.</code><code>top</code><code>.txt | </code><code>awk</code> <code>'{a[$NF]+=$10}END{for(k in a)print a[k]/100*'</code><code>''</code><code>${mem_total}</code><code>''</code><code>',k}'</code> <code>| </code><code>grep</code> <code>"\b${process}\b"</code> <code>| </code><code>cut</code> <code>-d</code><code>" "</code> <code>-f1`</code>

<code>    </code><code>echo</code> <code>"$mem_use"</code> <code>| </code><code>awk</code> <code>'{printf "%.f",$1*1024*1024}'</code>

<code>function</code> <code>cpuuse {</code>

<code>    </code><code>cpu_use=`</code><code>tail</code> <code>-n +8 </code><code>/tmp/</code><code>.</code><code>top</code><code>.txt | </code><code>awk</code> <code>'{a[$NF]+=$9}END{for(k in a)print a[k],k}'</code> <code>| </code><code>grep</code> <code>"\b${process}\b"</code> <code>| </code><code>cut</code> <code>-d</code><code>" "</code> <code>-f1`</code>

<code>    </code><code>echo</code> <code>"$cpu_use"</code>

<code>function</code> <code>cpupre {</code>

<code>    </code><code>cpu_pre=`</code><code>tail</code> <code>-n +8 </code><code>/tmp/</code><code>.</code><code>top</code><code>.txt | </code><code>awk</code> <code>'{a[$NF]+=$9}END{for(k in a)print a[k]/('</code><code>''</code><code>${cpu_total}</code><code>''</code><code>'),k}'</code> <code>| </code><code>grep</code> <code>"\b${process}\b"</code> <code>| </code><code>cut</code> <code>-d</code><code>" "</code> <code>-f1`</code>

<code>    </code><code>echo</code> <code>"$cpu_pre"</code>

<code>case</code> <code>$name </code><code>in</code>

<code>    </code><code>mem)</code>

<code>        </code><code>if</code> <code>[ </code><code>"$mode"</code> <code>= </code><code>"pre"</code> <code>];</code><code>then</code>

<code>            </code><code>mempre</code>

<code>        </code><code>elif</code> <code>[ </code><code>"$mode"</code> <code>= </code><code>"avg"</code> <code>];</code><code>then</code>

<code>            </code><code>memuse</code>

<code>        </code><code>fi</code>

<code>    </code><code>;;</code>

<code>    </code><code>cpu)</code>

<code>            </code><code>cpupre</code>

<code>            </code><code>cpuuse</code>

<code>    </code><code>*)</code>

<code>        </code><code>echo</code> <code>-e </code><code>"Usage: $0 [mode : pre|avg] [mem|cpu] [process]"</code>

<code>esac</code>

我們先來檢視一下目前系統的記憶體和CPU大小情況:

<code>-- 記憶體</code>

<code>[root@Zabbix_19F ~]</code><code># cat /proc/meminfo | grep "MemTotal" | awk '{printf "%.f",$2/1024}'</code>

<code>3832</code>

<code>-- CPU</code>

<code>[root@Zabbix_19F ~]</code><code># cat /proc/cpuinfo | grep "processor" | wc -l</code>

<code>8</code>

執行腳本運作效果如下(擷取監控項key值)

<code>[root@Zabbix_19F ~]</code><code># ./process_check.sh avg mem mysqld   #輸出mysqld程序使用的記憶體(計算公式:3832*18.5/100)</code>

<code>708.92</code>

<code>[root@Zabbix_19F ~]</code><code># ./process_check.sh pre mem mysqld   #輸出mysqld程序記憶體的使用率</code>

<code>18.5</code>

<code>[root@Zabbix_19F ~]</code><code># ./process_check.sh avg cpu mysqld   #單個CPU的mysqld程序使用率</code>

<code>3.9</code>

<code>[root@Zabbix_19F ~]</code><code># ./process_check.sh pre cpu mysqld   #所有CPU的mysqld程序的使用率</code>

<code>0.004875</code>

配置zabbix_agentd,在agentd用戶端的etc/zabbix_agentd.conf中增加userparameter配置,增加程序自動發現的key,和程序資源檢測的key。

<code>hmracdb2:</code><code>/opt/zabbix</code> <code># vim etc/zabbix_agentd.conf.d/userparameter_script.conf </code>

<code>UserParameter=discovery.process,</code><code>/opt/zabbix/scripts/discovery_process</code><code>.sh</code>

<code>UserParameter=process.check[*],</code><code>/opt/zabbix/scripts/process_check</code><code>.sh $1 $2 $3</code>

配置完之後重新開機agentd服務

<code>hmracdb2:</code><code>/opt/zabbix</code> <code># service zabbix_agentd restart</code>

<code>Shutting down zabbix_agentd                                                           </code><code>done</code>

<code>Starting zabbix_agentd                                                                </code><code>done</code>

在zabbix伺服器端手動擷取監控項key值資料

<code>[root@Zabbix_19F ~]</code><code># zabbix_get -p10050 -k 'discovery.process' -s 10.xxx.xxx.xxx</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"ohasd.bin"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"ocssd.bin"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"oracle"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"oraagent.bin"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"crsd.bin"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"orarootagent.bi"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"watchdog/3"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"watchdog/2"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"watchdog/1"</code><code>},</code>

<code>{</code><code>"{#PROCESS_NAME}"</code><code>:</code><code>"watchdog/0"</code><code>}</code>

<code>[root@Zabbix_19F ~]</code><code># zabbix_get -p10050 -k 'process.check[pre,mem,oracle]' -s 10.xxx.xxx.xxx</code>

<code>2.9</code>

<code>[root@Zabbix_19F ~]</code><code># zabbix_get -p10050 -k 'process.check[avg,mem,oracle]' -s 10..xxx.xxx.xxx</code>

<code>111.186</code>

<code>[root@Zabbix_19F ~]</code><code># zabbix_get -p10050 -k 'process.check[avg,cpu,oracle]' -s 10..xxx.xxx.xxx</code>

<code>4</code>

<code>[root@Zabbix_19F ~]</code><code># zabbix_get -p10050 -k 'process.check[pre,cpu,oracle]' -s 10..xxx.xxx.xxx</code>

<code>0.01</code>

配置完agentd後,在zabbix伺服器配置Web端的模版與監控項目item

Configuration --&gt; Templates --&gt; Create template --&gt;

<a href="https://s2.51cto.com/wyfs02/M02/8E/FF/wKiom1jQ8U3wiHgDAABFtj5xE6w023.png" target="_blank"></a>

建立完模版之後,添加自動發現規則

Discovery rules --&gt;Create discovesy rule

<a href="https://s4.51cto.com/wyfs02/M00/8E/FF/wKiom1jQ8XPgf7j8AAA6mqteZHY898.png" target="_blank"></a>

<a href="https://s3.51cto.com/wyfs02/M00/8E/FD/wKioL1jQ8ZTQXJY0AABcSo2_hK0370.png" target="_blank"></a>

Item prototypes --&gt; Create item prototype

<a href="https://s2.51cto.com/wyfs02/M00/8E/FD/wKioL1jQ8dKQIfSaAAB_fpdzTr0384.png" target="_blank"></a>

也可以繼續添加監控的主機和所需監控項,添加完後我們可以檢視下監控的曆史資料

<a href="https://s1.51cto.com/wyfs02/M01/8E/FF/wKiom1jQ8fLDBd9KAADGJ7MLd_U356.png" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M02/8E/FF/wKiom1jQ8gigRMUcAADFoSW8eTc772.png" target="_blank"></a>

添加一個程序的CPU使用率的監控項

<a href="https://s5.51cto.com/wyfs02/M02/8E/FD/wKioL1jQ8jDTRgurAACDsuRxHfA268.png" target="_blank"></a>

檢視曆史資料

<a href="https://s1.51cto.com/wyfs02/M00/8E/FF/wKiom1jQ8lmCJovkAADyx4H1n2Y892.png" target="_blank"></a>

當然還可以擷取程序記憶體使用的具體大小情況

<a href="https://s1.51cto.com/wyfs02/M00/8E/FD/wKioL1jQ8pvgNZW-AAEN_Z37FgY293.png" target="_blank"></a>

    至此,zabbix自動發現程序記憶體和CPU使用情況并實時監控配置就完成了

<a href="http://down.51cto.com/data/2366527" target="_blank">附件:http://down.51cto.com/data/2366527</a>

本文轉自 HMLinux 51CTO部落格,原文連結:http://blog.51cto.com/7424593/1908930