`
cheng163134
  • 浏览: 33018 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

质疑 apache和yaws的性能比较(必看)

阅读更多

网站:JavaEye 作者:mryufeng 发表时间: 2007-07-31 23:24 此文章来自于 http://www.iteye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://www.iteye.com/topic/107476

http://www.sics.se/~joe/apachevsyaws.html 上比较yaws的性能 显示apache 4000就挂了 但是yaws 8w还在挺着。

见附件的图

但是你仔细看下他的测试方式


What do we measure and how?


We use a 16 node cluster running at SICS. We plot throughput vs. parallel load.



  • Machine 1 has a server (Apache or Yaws).

  • Machine 2 requests 20 KByte pages from machine 1. It does this in tight a loop requesting a new page as soon as it has received a page from the server. From this we derive a throughput figure, which is plotted in the horizontal scale on the graph. A typical value (800) means the throughput is 800 KBytes/sec.

  • Machines 3 to 16 generate load.

    Each machine starts a large number of parallel sessions.


    Each session makes a very slow request to fetch a one byte file from machine 1. This is done by sending very slow HTTP GET requests (we break up the GET requests and send them character at a time, with about ten seconds between each character)




这个比较是非常不公平的


apache的链接处理机制是 开线程或者进程来处理请求 按它的测试方法 你非常慢速的8w请求 导致apache开大量的线程来处理。而能开多少线程取决于操作系统的能力 这还是其次 大量的线程处理活跃的链接导致大量的thread content switch。 apache 挂了不奇怪。 而erlang的线程相大于c语言的一个数据结构 erl_process你开多少取决于你的内存 大量的但是慢速的链接刚好适合poll事件dispatch, 以epoll的能力(俺测试过epoll30w)能够轻松处理。 这个测试与其说测试web服务器的性能 不如说 测试服务器的进程生成能力。


俺的测试是这样的:.

./yaws --conf yaws.conf --erlarg "+K true +P 1024000"     #epoll 最多1024000个进程 内核都已经调优过



yaws.conf 的内容:



auth_log = false

max_num_cached_files = 8000

max_num_cached_bytes = 6000000







大家都用 ab -c 1000 -n 1000000 http://192.168.0.98:8000/bomb.gif 来测

果然发现yaws的性能也是非常一般 大概也就是3K左右.

各位看下 strace 的结果就知道了:


accept(10, {sa_family=AF_INET, sin_port=htons(5644), sin_addr=inet_addr("192.168.0.97")}, [16]) = 11

fcntl64(11, F_GETFL)                    = 0x2 (flags O_RDWR)

fcntl64(11, F_SETFL, O_RDWR|O_NONBLOCK) = 0

getsockopt(10, SOL_TCP, TCP_NODELAY, [0], [4]) = 0

getsockopt(10, SOL_SOCKET, SO_KEEPALIVE, [0], [4]) = 0

getsockopt(10, SOL_SOCKET, SO_PRIORITY, [0], [4]) = 0

getsockopt(10, SOL_IP, IP_TOS, [0], [4]) = 0

getsockopt(11, SOL_SOCKET, SO_PRIORITY, [0], [4]) = 0

getsockopt(11, SOL_IP, IP_TOS, [0], [4]) = 0

setsockopt(11, SOL_IP, IP_TOS, [0], 4)  = 0

setsockopt(11, SOL_SOCKET, SO_PRIORITY, [0], 4) = 0

getsockopt(11, SOL_SOCKET, SO_PRIORITY, [0], [4]) = 0

getsockopt(11, SOL_IP, IP_TOS, [0], [4]) = 0

setsockopt(11, SOL_SOCKET, SO_PRIORITY, [0], 4) = 0

getsockopt(11, SOL_SOCKET, SO_PRIORITY, [0], [4]) = 0

getsockopt(11, SOL_IP, IP_TOS, [0], [4]) = 0

setsockopt(11, SOL_SOCKET, SO_KEEPALIVE, [0], 4) = 0

setsockopt(11, SOL_IP, IP_TOS, [0], 4)  = 0

setsockopt(11, SOL_SOCKET, SO_PRIORITY, [0], 4) = 0

getsockopt(11, SOL_SOCKET, SO_PRIORITY, [0], [4]) = 0

getsockopt(11, SOL_IP, IP_TOS, [0], [4]) = 0

setsockopt(11, SOL_TCP, TCP_NODELAY, [0], 4) = 0

setsockopt(11, SOL_SOCKET, SO_PRIORITY, [0], 4) = 0

recv(11, "GET /bomb.gif HTTP/1.0\r\nUser-Age"..., 8192, 0) = 100

getpeername(11, {sa_family=AF_INET, sin_port=htons(5644), sin_addr=inet_addr("192.168.0.97")}, [16]) = 0

clock_gettime(CLOCK_MONOTONIC, {110242, 326908594}) = 0

stat64("/var/www/html/bomb.gif", {st_mode=S_IFREG|0644, st_size=4096, ...}) = 0

access("/var/www/html/bomb.gif", R_OK)  = 0

access("/var/www/html/bomb.gif", W_OK)  = 0

clock_gettime(CLOCK_MONOTONIC, {110242, 327135982}) = 0

time(NULL)                              = 1185894828

clock_gettime(CLOCK_MONOTONIC, {110242, 327222643}) = 0

stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=405, ...}) = 0

writev(11, [{NULL, 0}, {"HTTP/1.1 200 OK\r\nConnection: clo"..., 231}, {"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"...

, 4096}], 3) = 4327

close(11



这里面充斥着大量的无用的昂贵的系统调用 (至少有20个*10us = 200us 的系统调用是无效的)

对文件的access 2 次  连文件的cache都没有  每次 打开文件  读文件 然后写到socket去 。



这个case是小文件(4k)的情况。 看下大文件(40k)的情况

open("/var/www/html/bomb.gif", O_RDONLY|O_LARGEFILE) = 19

read(19, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 10240) = 10240

writev(16, [{NULL, 0}, {"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 10240}], 2) = 10240

read(19, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 10240) = 10240

writev(16, [{NULL, 0}, {"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 10240}], 2) = 10240

read(19, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 10240) = 10240

writev(16, [{NULL, 0}, {"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 10240}], 2) = 10240

read(19, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 10240) = 10240

writev(16, [{NULL, 0}, {"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 10240}], 2) = 7240

read(19, "", 10240)                     = 0

close(19)                               = 0

clock_gettime(CLOCK_MONOTONIC, {110574, 856508319}) = 0

epoll_ctl(3, EPOLL_CTL_DEL, 11, {0, {u32=11, u64=581990243524149259}}) = 0

epoll_ctl(3, EPOLL_CTL_DEL, 12, {0, {u32=12, u64=581990243524149260}}) = 0

epoll_ctl(3, EPOLL_CTL_ADD, 16, {EPOLLOUT, {u32=16, u64=581990243524149264}}) = 0

epoll_wait(3, {}, 256, 0)               = 0

clock_gettime(CLOCK_MONOTONIC, {110574, 856677411}) = 0

clock_gettime(CLOCK_MONOTONIC, {110574, 856729274}) = 0


大量的epoll_ctl 调用 clock_gettime的调用 足够让系统的速度变的非常慢。




比对下lighttpd的性能。 lighttpd用到了cache,用到了aio,还是完全用c语言小心编写, 他处理小文件大概是并发1w.  而yaws这个的处理方式打个3折我看差不多。



所以请各位大佬介绍erlang的性能时候不要 再用这个apache vs yaws的例子了 误导太多人了.


 




《 质疑 apache和yaws的性能比较(必看) 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>

推荐相关文章:
  如何把erlang应用在项目中?
  ErLang语法提要




JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA


分享到:
评论

相关推荐

    使用Erlang和Yaws开发REST式的服务

    使用Erlang和Yaws开发REST式的服务.详细分析如何使用Erlang和yaws开发REST的服务,有实例

    yaws官方文档

    yaws是一款采用erlang开发的web server,具有高并发的特点,这是yaws的官方文档。

    yaws:Yaws Web服务器

    这是Yaws,是用Erlang编写的动态内容的Web服务器。 准备构建 获取并安装一个Erlang系统( )。 要编译Yaws,需要Erlang / OTP 18.0或更高版本。 如果您已经从github克隆了源代码,并且想使用自动工具进行构建,请...

    yaws:偏航(还有另一个网络抓取工具)

    yaws(Yet Another Web Scraper)是一种易于使用但功能强大的Node.js Web抓取工具,它支持多种常用的抓取技术,通过使用带有正则表达式的模式,通过导航DOM(JQuery样式)来定义对象。 它是一个进行中的工作,包括...

    yaws-json2:Yaws json2 库

    yaws-json2 yaws-json2 是来自网络服务器的编码器/解码器。安装在 rebar.config 中: { yaws_json2 , " .* " , { git , " git://github.com/myua/yaws-json2 " , { tag , " master " }}}用法使用yaws_json2:decode_...

    yaws-开源

    Yaws 是一个小巧、快速且美观的 HTTP 1.1 网络服务器,对生成动态内容提供出色的支持。 Yaws 已移至 github。 http://github.com/klacke/yaws/

    Erlang入门手册

    Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。据说使用Erlang编写的Yaws Web服务器,其并发性能是apache的15倍!

    Building Web Applications with Erlang.2012.英文

    基于erlang开发web应用,涉及restful、websocket、yaws

    building_web_applications_with_erlang.pdf

    使用Erlang开发web应用,书中范例所使用的webserver为Yaws

    erlang调用java

    erlang调用java,在yaws应用里调用J2EE方法

    accounter:一个简单的簿记应用程序

    该应用程序是用Erlang编写的,并且使用Yaws作为Web服务器。 在webui中,可以执行以下操作 注册新凭证 正确的错误凭证 生成可存档的报告 余额报告 结果报告 杂志 分类帐 结果与预算之间的差异 生成一个大的组合报告...

    game_manager:游戏后端数据统计平台

    webserver:Yaws, 一个Erlang开发的web服务器. 开发语言:Erlang,Html(html,javascript,css) ###如何部署: 1.下载并安装Erlang. 2.安装完成后,把bin/erl.exe添加入环境变量 3.下载并安装yaws。 4.安装完成后,把/...

    simple_bridge:一个简单,标准化的Erlang HTTP服务器接口库

    它目前支持Cowboy,Inet,Mochiweb,Webmachine和Yaws。 SimpleBridge用作两个最受欢迎的Erlang Web框架到Web服务器的桥梁: 和 从某种意义上讲,它类似于 ,除了具有一些关键的改进/不同之处: 轻松扩展-需要...

    embjson:将 JSON 结构嵌入到 Erlang 代码中

    -embjson([{callback, embjson_yaws_json2}, {function, '@json'}]). 可选属性embjson配置解析转换: callback :回调模块的名称(默认为转换模块)。 模块必须实现embjson行为。 function :封装嵌入式 JSON 的...

    scrub:感觉很肥皂-Erlang SOAP 1.2客户端

    擦洗-最适合SOAP 一个Erlang SOAP 1.2客户端描述这是Yaws的yaws_soap12_lib到单独的Erlang模块的转换。 见 与洗涤剂类似,但适用于SOAP 1.2。 参见

    try:try.lfe.io的容器化服务,REST API和网站(WIP!)

    try.lfe.io介绍该项目目前正在积极开发中。 有关更多信息,请参见 。... 然后照常做: $ rebar get-deps $ rebar compile用法在开发环境中,只需运行dev目标: $ make dev 这将启动YAWS,您将能够在上查看该网站。

    [Erlang] 网络应用开发 (Erlang 实现) (英文版)

    [奥莱理] Building Web Applications with Erlang Working with REST and Web Sockets on Yaws (E-Book) ☆ 出版信息:☆ [作者信息] Zachary Kessin [出版机构] 奥莱理 [出版日期] 2012年06月14日 [图书页数] ...

Global site tag (gtag.js) - Google Analytics