監控需求
某項目的應用伺服器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 > /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 > </code><code>/tmp/</code><code>.</code><code>top</code><code>.txt && </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<$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&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 --> Templates --> Create template -->
<a href="https://s2.51cto.com/wyfs02/M02/8E/FF/wKiom1jQ8U3wiHgDAABFtj5xE6w023.png" target="_blank"></a>
建立完模版之後,添加自動發現規則
Discovery rules -->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 --> 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