嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-11-21 5720 次浏览 标签 : Linuxapache-bench

两段代码对比

循环服务器:http://mengkang.net/563.html

并发服务器:http://mengkang.net/571.html

两段代码非常相似,后者只是在前者的基础上把往客户端socket fd 里写入数据的工作放到了子进程中去做。

但是,当我对循环服务器编译结果进行压测没有问题,在上面那篇笔记里也有记录,但是对并发服务器编译结果进行ab压力测试时,发现返回的结果如下(为了排除是并发数太大的影响,我设置为了1个请求的情况):

[zhoumengkang@localhost ~]$ ab -n1 -c1 http://127.0.0.1:8031/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)...apr_socket_recv: Connection reset by peer (104)

不过此时通过浏览器是能正常返回指定的结果的。后来在这里找到了答案

ab -n1 -c1 http://127.0.0.1:8031/

换成

ab -r -n1 -c1 http://127.0.0.1:8031/

就能压测了,而-r的作用是Don't exit on socket receive errors.,也就是说我的服务器程序在返回给 ab 的 socket 上出现了错误。

后来过了好久发现原来在并发服务器中如果不对接受到的客户端socket fd进行读取,而直接写入,则会导致客户端收到结果时出错。(根据 ab 推测,后期再更新客户端的代码进行 debug )截取并发服务器里的71~74行:

len = read(cfd,buf,sizeof(buf));

char web_result[] = "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\nContent-Length: 11\r\nServer: mengkang\r\n\r\nhello world";
write(cfd,web_result,sizeof(web_result));

如果上面代码中的第一行注释掉,再编译,编译完之后运行,在进行ab压测的时候ab -n1 -c1 http://127.0.0.1:8031/就不能通过了,需要带上-r的参数了。将上面代码中的第一行注释打开,则能正常压测。

但是在循环服务器里面不读取cfd也不没事。所以比较诡异。暂时无法确定是什么原因。

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表