十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這里舉幾個(gè)例子。
為棲霞等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及棲霞網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、棲霞網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
在某地的雙向系統(tǒng)中,兩臺(tái)服務(wù)器有一個(gè)httpd服務(wù)器,通過(guò)負(fù)載均衡承擔(dān)4萬(wàn)多的機(jī)頂盒的首頁(yè)面訪問(wèn)。因此,需要監(jiān)測(cè)每臺(tái)服務(wù)器的http連接數(shù)量。對(duì)并發(fā)量關(guān)注一段時(shí)期,如果并發(fā)量在設(shè)置的值之內(nèi),則不需要進(jìn)行并發(fā)量的調(diào)整,而如果并發(fā)量比較大的話,則需要進(jìn)行調(diào)整httpd參數(shù)。
http的連接數(shù)量可以通過(guò)ps -ef | grep httpd | wc -l來(lái)獲取。Centos5版本默認(rèn)的文件打開數(shù)量為1024。對(duì)/etc/httpd/conf/httpd.conf進(jìn)行參數(shù)調(diào)整,使httpd可以承擔(dān)1000個(gè)并發(fā):
查詢默認(rèn)的服務(wù)方式:
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
#
默認(rèn)的服務(wù)方式為prefork,調(diào)整/etc/httpd/conf/httpd.conf參數(shù)(具體含義可到網(wǎng)上查找):
StartServers 10
MinSpareServers 50
MaxSpareServers 100
ServerLimit 3000
MaxClients 3000
MaxRequestsPerChild 10000
重啟httpd后,進(jìn)行并發(fā)測(cè)試:
ab -n 10000 -c 1000 http://172.16.100.190/index.htm
這里共發(fā)送10000個(gè)請(qǐng)求,每次發(fā)送1000個(gè),也就是每次并發(fā)1000個(gè),共分10次發(fā)送。
如果是并發(fā)2000,則報(bào)錯(cuò):
查詢httpd的服務(wù)方式為:
ps -ef | grep httpd | wc -l
編寫監(jiān)測(cè)腳本:
#!/bin/bash
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
count=`ps -ef | grep httpd | wc -l`
let "count =count-2"
if [ $count -gt 800 ]; then
echo "Critical ! httpd processes is $count!|HttpCounts=$count;600;800;0"
exit $STATE_CRITICAL
elif [ $count -gt 600 ]; then
echo "Warning ! httpd processes is $count!|HttpCounts=$count;600;800;0"
exit $STATE_WARNING
elif [ 600 -gt $count ]; then
echo "Ok ! httpd processes is $count!|HttpCounts=$count;600;800;0"
exit $STATE_OK
else
echo "Unknow"
exit $STATE_UNKNOWN
fi
腳本中echo一行最后添加的“|HttpCounts=$count;600;800;0”是pnp畫圖所需,否則不能畫出圖。其中600為預(yù)警,800為嚴(yán)重告警。
默認(rèn)配置的httpd,在訪問(wèn)量比較大的話,使用命令:
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT=581
ESTABLISHED=1
SYN_RECV=1
就會(huì)有大量的time_wait??梢酝ㄟ^(guò)調(diào)整系統(tǒng)參數(shù)得到改善:
http://blog.csdn.net/sunvince/article/details/6622796
http://chembo.iteye.com/blog/1503770
這里,在/etc/sysctl.conf增加以下4個(gè)參數(shù):
net.ipv4.tcp_syncookies = 1 //這個(gè)參數(shù)如果已經(jīng)添加了的話,就不需要再次添加
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后執(zhí)行 /sbin/sysctl -p 讓參數(shù)生效。
繼續(xù)使用netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}',觀察到TIME_WAIT=3了。
可以根據(jù)下節(jié)中監(jiān)測(cè)物理內(nèi)存的check_mem腳本規(guī)范編寫監(jiān)測(cè) TIME_WAIT的腳本:
#more /usr/local/nagios/libexec/check_timewait
#!/bin/bash
#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
#TIME_WAIT 641
#ESTABLISHED 1
#SYN_RECV 1
if [ $# != 4 ];then
echo "Usage:$0 -w num1 -c num2"
exit
fi
time_wait=`netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'|grep TIME_WAIT|awk '{print $2}'`
established=`netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'|grep ESTABLISHED|awk '{print $2}'`
syn_recv=`netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'|grep SYN_RECV|awk '{print $2}'`
if [ $time_wait -gt $4 ];then
echo "Critical - TIME_WAIT=$time_wait ESTABLISHED=$established SYN_RECV=$syn_recv|TIME_WAIT=$time_wait;$2;$4;0 ESTABLISHED=$established;;; SYN_RECV=$syn_recv;;;"
exit 2
fi
if [ $time_wait -le $4 -a $time_wait -ge $2 ];then
echo "Warning - TIME_WAIT=$time_wait ESTABLISHED=$established SYN_RECV=$syn_recv |TIME_WAIT=$time_wait;$2;$4;0 ESTABLISHED=$established;;; SYN_RECV=$syn_recv;;;"
exit 1
fi
if [ $time_wait -lt $2 ];then
echo "OK - TIME_WAIT=$time_wait ESTABLISHED=$established SYN_RECV=$syn_recv |TIME_WAIT=$time_wait;$2;$4;0 ESTABLISHED=$established;;; SYN_RECV=$syn_recv;;;"
exit 0
fi
~
另外,由于這臺(tái)機(jī)器不能丟失一個(gè)默認(rèn)的路由,否則機(jī)頂盒無(wú)法獲取首頁(yè)面。默認(rèn)的路由也可以編寫腳本進(jìn)行監(jiān)測(cè):
#!/bin/bash
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
default_route=`route |grep default`
if [ "default 172.16.100.1 0.0.0.0 UG 0 0 0 bond0"x = "$default_route"x ]; then
echo "Ok! Default route is \"$default_route\"!|defaultRoute=1;0;0"
exit $STATE_OK
else
echo "Critical! Default route is \"$default_route\"!|defaultRoute=0;0;0"
exit $STATE_CRITICAL
fi
默認(rèn)的check_swap為監(jiān)測(cè)虛擬內(nèi)存,如果要監(jiān)測(cè)物理內(nèi)存,則可以編寫以下腳本:
#cd /usr/local/nagios/libexec
#vi check_mem
#!/bin/bash
#memory
if [ $# != 4 ];then
echo "Usage:$0 -w num1 -c num2"
exit
fi
total_mem=`free -m |grep Mem|awk '{print $2}'`
free_mem=`free -m |grep Mem|awk '{print $4}'`
used_mem=`free -m |grep Mem|awk '{print $3}'`
if [ $free_mem -gt $2 ];then
echo "OK - total memory $total_mem MB used $used_mem MB free $free_mem MB|free_mem=$free_mem;$2;$4;0"
exit 0
fi
if [ $free_mem -ge $4 -a $free_mem -le $1 ];then
echo "Warning - total memory $total_mem MB used $used_mem MB free $free_mem MB|free_mem=$free_mem;$2;$4;0"
exit 1
fi
if [ $free_mem -lt $4 ];then
echo "Critical - total memory $total_mem MB used $used_mem MB free $free_mem MB|free_mem=$free_mem;$2;$4;0"
exit 2
fi
#chown -R nagios.nagios check_mem
#chmod a+x check_mem
#./check_mem -w 200 -c 100 //后面兩個(gè)參數(shù)表示剩余內(nèi)存容量,單位為兆。
網(wǎng)上還有另外一個(gè)監(jiān)測(cè)腳本也可以參考 http://www.yunvn.com/thread-5136-1-5.html :
#script to check real memory usage
# L.Gill 02/05/06 - V.1.0
# ------------------------------------------
# ######## Script Modifications ##########
# ------------------------------------------
# Who When What
# --- ---- ----
# LGill 17/05/06 "$percent" lt 1% fix - sed edits dc result beggining with "."
#
#
#!/bin/bash
USAGE="`basename $0` [-w|--warning]
THRESHOLD_USAGE="WARNING threshold must be greater than CRITICAL: `basename $0` $*"
calc=/tmp/memcalc
percent_free=/tmp/mempercent
critical=""
warning=""
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
# print usage
if [[ $# -lt 4 ]]
then
echo ""
echo "Wrong Syntax: `basename $0` $*"
echo ""
echo "Usage: $USAGE"
echo ""
exit 0
fi
# read input
while [[ $# -gt 0 ]]
do
case "$1" in
-w|--warning)
shift
warning=$1
;;
-c|--critical)
shift
critical=$1
;;
esac
shift
done
# verify input
if [[ $warning -eq $critical || $warning -lt $critical ]]
then
echo ""
echo "$THRESHOLD_USAGE"
echo ""
echo "Usage: $USAGE"
echo ""
exit 0
fi
# Total memory available
total=`free -m | head -2 |tail -1 |gawk '{print $2}'`
# Total memory used
used=`free -m | head -2 |tail -1 |gawk '{print $3}'`
# Calc total minus used
free=`free -m | head -2 |tail -1 |gawk '{print $4+$7}'`
# normal values
#echo "$total"MB total
#echo "$used"MB used
#echo "$free"MB free
# make it into % percent free = ((free mem / total mem) * 100)
echo "5" > $calc # decimal accuracy
echo "k" >> $calc # commit
echo "100" >> $calc # multiply
echo "$free" >> $calc # division integer
echo "$total" >> $calc # division integer
echo "/" >> $calc # division sign
echo "*" >> $calc # multiplication sign
echo "p" >> $calc # print
percent=`/usr/bin/dc $calc|/bin/sed 's/^\./0./'|/usr/bin/tr "." " "|/usr/bin/gawk {'print $1'}`
#percent1=`/usr/bin/dc $calc`
#echo "$percent1"
if [[ "$percent" -le $critical ]]
then
echo "CRITICAL - $free MB ($percent%) Free Memory"
exit 2
fi
if [[ "$percent" -le $warning ]]
then
echo "WARNING - $free MB ($percent%) Free Memory"
exit 1
fi
if [[ "$percent" -gt $warning ]]
then
echo "OK - $free MB ($percent%) Free Memory"
exit 0
fi
用以下命令執(zhí)行:
# ./check_memory -w 36 -c 10
OK - 185 MB (37%) Free Memory
# ./check_memory -w 37 -c 10
WARNING - 185 MB (37%) Free Memory
# ./check_memory -w 40 -c 37
CRITICAL - 184 MB (37%) Free Memory
#
-w表示低于多少百分比就預(yù)警,-c表示低于多少百分比就嚴(yán)重告警