【背景知识】
webbench是由Lionbridge公司开发的知名的网站压力测试工具。它能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。webbench的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量。webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进 行测试的能力。还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试。Webbench最多可以模拟3万个并发连接去测试网站的负载能力。
Tinyhttpd是超轻量型的http server。这里我将尝试部署一个服务器,并用Webbecn测试其性能。
【任务说明】
打开网页http://blog.jobbole.com/79023/,看到第一和第二个项目(Webbecn和Tinyhttpd),需要做的是:
(1)在自己的VMware虚拟机里centos中,下载Tinyhttpd源码,编译并安装这个超轻量型的http server;
(2) 然后编译安装Webbench,去测试Tinyhttpd的性能;
(3)记录过程,并汇报遇到的问题和解决问题的方法,还有测试结果。
【操作流程】
首先需要配好环境。我用的是VMwareWorkstation8.0和CentOS-6.5-x86_64。方便起见,虚拟机需要共享windows真机资源。
下面正式进入编译安装过程:
1:将本机中的Tinyhttpd源码拷到本地 /usr/local/src并解压。 tinyhttpd-0.1.0.tar.gz解压之后,发现tinyhttpd-0.1.0文件夹中有makefile文件,没有./configure文件,说明可以直接make编译。编译之前需要参照 httpd.c中注释行的要求对httpd.c和makefile文件进行修改。编译之后生成了可执行文件httpd。Httpd是可执行文件,不用再安装了,直接在/usr/local/src/tinyhttpd-0.1.0下执行./httpd 就运行起了一个websever。在浏览器中输入虚拟机IP即可进入web页面。
图1:服务器部署成功
2: 接下来编译安装Webbench。首先将webbench-1.5.tar.gz拷贝到/usr/local/src下并解压。直接make编译,此时如果报错“/bin/sh: ctags: command not found”则需要安装ctags,用语句” yum –y install ctags”。编译完成生成Webbench文件,安装“make install” ,如果报错“cannot create regular file `/usr/local/man/man1′: No such file ordirectory”,则需创建“/usr/local/man/man1”文件。Make install安装成功则:
图2:webbench安装成功
3:现在开始用用Webbench测试Tinyhttpd的性能。
webbench -c 500 -t 30 http://192.168.195.128:80/。(这个过程中可能出现很多问题,详情见【问题解答】)
【问题解答】
1:使用 “yum grouplist” 指令查看已安装组时报告如下错误 “Error: Cannot find a valid baseurl for repo: base”。
解决办法:echo "nameserver 8.8.8.8">>/etc/resolv.conf。
2:Ping 一个网址时报错“connect: network is unreachable”。
解决办法:在/etc/sysconfig/ifcfg-eth0中写入如下语句(根据实际情况修改HWADDR,IPADDR):
DEVICE=eth0
HWADDR=00:0C:29:A7:5C:4E
ONBOOT=yes
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=192.168.195.128
USERCTL=no
IPV6INIT=no
PEERDNS=yes
运行语句:sudo dhclient
3:查看本机物理地址时报错“bash: ipconfig: command not found”
(低级错误)linux中用ifconfig,windows中用ipconfig。
4: 解压后的Tinyhttpd里没有configure文件,是不是就说明不用再编译了?可是直接make && make install又报错
”/usr/bin/ld: cannot find –lsocket”
解决办法:一开始以为是缺少lib包等,就yum update再yum install libpcap*,但/lib下还是没有没有 libsocket.a,libsocket.so,没能解决问题。后来发现httpd.c文件中的注释行说明的操作:* To compile for Linux:
* 1) Comment out the #include line.
* 2) Comment out the line that defines the variable newthread.
* 3) Comment out the two lines that run pthread_create().
* 4) Uncomment the line that runs accept_request().
* 5) Remove -lsocket from the Makefile.
照做之后,直接make就通过并生成了可执行文件httpd。
5: 由于未知原因,可能是手动修改了一些网络配置,虚拟机ping不通本机也连不上外网。
解决方法:经过一番折腾无果,最后采取 “编辑—>虚拟网络编辑器—>恢复默认设置”。所以不得不承认,有时候简单粗暴比慢条斯理来得立竿见影。
6:在用webbench对tinyhttpd进行测试时发现不是连不上就是卡死。
解决办法:还没找到解决办法。
一开始猜想原因应该是webbench和tinyhttpd在同一台机子上运行,会相互制约;或者是tinyhttpd太tiny,经不起webbench一测。于是用webbench测试了linux系统自带的httpd,没有问题。所以应该是tinyhttpd的问题。
图3:webbench测试系统自带httpd结果
具体原因有待进一步探究。敬请期待下一篇动态!
【原因补充】
通过gdb调试在tinyhttpd的源码,最终将问题定位在httpd.c文件中第452行send(client,buf,strlen(buf),0)。
因为webbench在一次访问完之后就断掉了,但是tinyhttp要分12次把一个网页的内容发送给webbench,所以第一次发的时候是成功的,第二次就失败了。而且,由于tinyhttpd太简单了,所以send的时候没有异常判断和处理,所以程序就死在那儿了。
如何判断并处理异常,还需进一步研究学习服务器测试访问过程。这里为简单起见,仅通过将后面的11次内容发送注释掉了,然后就得到了正常的测试结果,如下图所示: