用ab做性能测试.
并发请求量稍微高一点(200,300以上)就会报apr_socket_recv: Connection reset by peer 的错.
刚开始以为apache服务器设置有问题. 网上一顿找, 结果你也懂的. 按照咱国家特殊国情惯例, 都是同一篇文章考来考去.
最后还是找到一个靠谱点的解决方法.
如果有同上的问题, 不要犹豫, ab必须要重新编译安装了. 至于用yum安装httpd的. 也不例外, 也需要新编译安装ab和apr了.
如果你是通过编译安装的修改ab.c文件后重新编译安装也有同样问题. 我想应该是apr的问题.
具体错误在哪里也没研究. 下面方法能解决这个问题.
1. 下载所需要的源码
apr和apr-utils
http://apr.apache.org/download.cgi
ab源码可以到这里下载
https://code.google.com/p/apachebench-standalone/downloads/list
2. 编译安装
$ mkdir ab
$ mkdir apr
$ mkdir apr-utils
$ cd ab
$ wget https://apachebench-standalone.googlecode.com/files/ab-standalone-0.1.tar.bz2
$ tar -xvf ab-standalone-0.1.tar.bz2
$ cd ../apr
$ wget http://apache.etoak.com//apr/apr-1.4.8.tar.gz
$ tar -xvf apr-1.4.8.tar.gz
$ cd ../apr-utils
$ wget http://apache.etoak.com//apr/apr-util-1.5.2.tar.gz
$ tar -xvf apr-util-1.5.2.tar.gz
先编译apr
$ cd apr/apr-1.4.8
$ ./configure
$ make
$ make install
编译apr-utils
$ cd apr-utils/apr-util-1.5.2
$ ./configure --with-apr=/usr/local/apr
$ make
$ make install
编译ab
先修改ab.c文件
$ cd ab/ab-standalone
$ vim ab.c
到 :1380 行
修改成如下.
- /* catch legitimate fatal apr_socket_recv errors */
- else if (status != APR_SUCCESS) {
- err_recv++;
- if (recverrok) {
- bad++;
- close_connection(c);
- if (verbosity >= 1) {
- char buf[120];
- fprintf(stderr,"%s: %s (%d)\n", "apr_socket_recv", apr_strerror(status, buf, sizeof buf), status);
- }
- return;
- } else {
- //apr_err("apr_socket_recv", status); // 从这开始
- bad++;
- close_connection(c);
- return; // 到这里
- }
- }
$ make apr-skeleton
$ make ab
就可以了.
把之前的ab替换掉一个软连接或者直接在编译后的目录上用都可以.
参考
https://code.google.com/p/apachebench-standalone/wiki/HowToBuild