一:总结
当我们发现WEB页面访问性能缓慢时,常常存在几种可能的原因
1) 网络性能慢
2) IIS服务器性能慢
3) 数据库性能慢
这三个原因常常交织在一起,导致我们无法轻易分辨出到底是谁引起了性能问题。
另外,Web页面的访问性能下降,可能是随机性的。当用户反馈性能慢时,再介入排查,可能现象已经消失了。
有没有一个办法能够像Ping一样持续的检测WEB页面的访问性能,并能够方便的区分出是网络问题?IIS问题?
答案是有的,那就是利用linux下的工具curl。利用这个工具,我们可以编写一个shell脚本,实现类似ping的功能,持续的检测某个网站的响应时间。
该工具使用方法如下:
这个命令的功能是请求https://1xx.xx.xx.71/iCloud/test/Dynamic.aspx页面100000次。
这个命令执行后,就会不断在屏幕上打印请求这个页面各阶段所耗费的时间。
从打印中可以看到各参数解释如下
参数 | 参数的含义 |
http_code | 页面请求的结果,200表示成功,404表示页面未找到 |
time_namelookup | 域名翻译的时间,因为示例中直接请求的是IP,所以域名翻译时间为0 |
time_connect | 建立tcp连接的时间,这可以看出网络性能好坏 |
time_total | 请求这个页面耗费的总时间= time_namelookup+ time_connect+页面下载时间 |
通过这个显示,我们就可以分辨出,当性能下降时,是网络导致的(time_namelookup和time_connect变长),还是页面下载的慢(前两者不变,但time_total变长)。
如果页面下载慢,怎么进一步区分是IIS服务变慢,还是数据库访问变慢了呢?
我们可以在WEB服务器上部署两个测试页面,一个测试页面是Static页面,返回一个空页面。另外一个测试页面是动态页面,需要访问数据库才能动态产生页面。
同时对这两个页面进行持续的请求。如果发现Static页面的time_total变慢,意味着IIS服务存在问题。如果Static页面的访问时间未变,但是动态页面的访问时间明显变慢,意味着数据库变慢导致页面访问变慢。
总结网站访问性能慢,可能分为如下几个原因,都可以用curl的访问结果进行判断。
二:CURL命令常用参数说明
1)抓取页面内容到一个文件中
[root@10.10.90.97 ~]# curl -ohome.html http://www.sina.com.cn
2)忽略安全证书验证访问https网站
[root@10.10.90.97 ~]# curl --insecure https://www.google.com.hk
3)静默模式,不输出任何内容
[root@10.10.90.97 ~]# cur –s
4)-w 格式化输出字符串
比如这样的格式:
curl --insecure -o /dev/null -s -w"http_code:%{http_code} time_namelookup:%
{time_namelookup} time_connect:%{time_connect}time_total:%{time_total} " www.si
na.com.cn
输出后的结果是:
http_code:200 time_namelookup:0.016time_connect:0.187 time_total:0.562
注:WINDOWS命令执行方法如下
curl -o NUL -s -w "http_code:%{http_code}time_namelookup:%{time_namelookup}
time_connect:%{time_connect}time_total:%{time_total} " http://www.baidu.com
三:Linux下Requrl.sh脚本执行说明
requrl.sh是在linux下编写的shell脚本,核心思想是循环调用CURL命令,将调用的时间耗费打印出来。
i=1
while [ $i -le $num ]
do
c=`curl --insecure -o/dev/null -s -w "http_code:%{http_code} time_namelookup:%{time_namelookup}time_connect:%{time_connect} time_total:%{time_total} " $url`
t=`date +%T`
echo $t": "$c
#s=$s$c"\n"
i=$[$i+1]
done
使用方法
1) 用root用户,将requrl.sh脚本放在预定目录下
2) 设置该脚本的可执行权限chmod 777 requrl.sh
3) 在脚本所在目录中,执行 ./requrl.sh –n 10 www.baidu.com.cn (次数和目标地址都要替换)
脚本见附件,需要用bin方式上传到linux机器中
#!/bin/bash
#requesturl.sh
usage="
Usage: $0 [options...] <url>\n
Options:\n
-h This help text\n
-n <num> The numbers to request\n
"
if [ $# -lt 1 ]
then
echo -e $usage
exit 1
fi
num=10
while getopts "n:h" arg
do
case $arg in
n)
num=$OPTARG
if [ $num -lt 1 ]
then
num=1
fi
;;
h)
echo -e $usage
exit 1
;;
?)
echo "Unknow argument"
exit 1
;;
esac
done
url=$(eval echo "\$$#")
if [ "http://" != ${url:0:7} ] && [ "https://" != ${url:0:8} ]
then
echo "The url need to add the http:// or https:// prefix"
exit 1
fi
echo "Request url: "$url
echo "Request number: "$num
i=1
while [ $i -le $num ]
do
c=`curl --insecure -o /dev/null -s -w "http_code:%{http_code} time_namelookup:%{time_namelookup} time_connect:%{time_connect} time_total:%{time_total} " $url`
t=`date +%T`
echo $t": "$c
#s=$s$c"\n"
i=$[$i+1]
done
echo -e $s | \
awk '{OFS="\n"}{if($1) for(i=1;i<=NF;i++)print $i}' | \
awk -F: -v num=$num -v failnum=0 \
'{if($1 != "http_code")result[$1]+=$2;if($1=="http_code" && $2 != 200)failnum++} \
END{print "Request Failed: " failnum "\n------Average Value------"; \
for(i in result) {print i ": " result[i]/num;} \
print "-------------------------"}'
四:Window下使用requrl脚本
下载并安装对应版本的CURL程序,下载地址是http://curl.haxx.se/download.html。将下载后解压的可执行文件,放到本地目录下,比如d:\curl
根据操作系统的不同可选择以下版本,注意选择SSL相关的版本,有的网站是带HTTS安全认证的。
并将windows下调用脚本释放到和curl可执行程序在一个目录下,比如d:\curl.
进入命令行窗口,切换当前目录到d:\curl
执行命令:requrl 10000 http://www.baidu.com.cn
注意,Winows下命令与linux环境下命令稍有不同。
执行结果如下:
Window 下批处理脚本代码如下:
::利用curl工具持续获取某个网址的响应时间
::requesturl.bat
@echo off
if "%1"=="" goto usage
if "%1"=="/?" goto usage
if "%1"=="help" goto usage
if "%2"=="" goto usage
set num=%1
set url=%2
echo 尝试次数:%num%
echo 目标网址:%url%
echo %url% >url.txt
type url.txt|find "http://" >url1.txt
type url.txt|find "https://" >>url1.txt
type url1.txt|find "http">url2 || goto format
echo url is ok
for /l %%i in (1,1,%num%) do curl --insecure -o NUL -s -w "http_code:%%{http_code} time_namelookup:%%{time_namelookup} time_connect:%%{time_connect} time_total:%%{time_total} " %url% && echo _
goto end
:usage
echo 参数错误,说明如下:
echo 用法: %0 检测次数 检测网址
echo 例如: requrl 100 http://www.baidu.com.cn