网络性能探讨这周我们公司会进行新项目的research,主要是用于用户行为分析,在各个网站上采集一些用户行为
网络性能探讨
这周我们公司会进行新项目的research,主要是用于用户行为分析,在各个网站上采集一些用户行为然后传送到指定服务器进行数据收集,以后用于用户行为的分析,其中有一个带头的engineer,他指出希望采用ajax+tcp server的架钩模式进行这个项目,首先由于有很多网站,上百个,在用户点击一些广告的时候会由ajax 异步传输数据到指定server,这里的server可能就是一个Tcp server,这里的讨论焦点就是 是否有必要重新开发一个Tcp server去做数据收集的工作。首先他的论点是:
Tcp server位于OSI 网络7层模型的传输层,这样想当然他的效率是最高的,没有了HTTP server没必要的很多东西,比如每次http 传输后http server总是会来个callback,通过tcp 就不需要了,只要来个握手就可以了没必要callback,性能自然提升了。 通过linux的 epoll 可以提升网络性能。
感觉上他的论点的确有他的道理。但是大家知道现在很多开源的高性能的网络服务器比如wildfire等都是 通过mina nio网络框架进行实现,觉得其性能不会很差,以及其他quick server,cindy都是大口碑的网络框架,我觉得是否有必要再去重新开发一个TcP server,另外关于EPoll从一些文章了解到的当访问量达到 千W级别时候,相对于传统select的确可以大幅提升性能。对于java而言听说java6已经支持了,希望大家发表高见,如何通过现有资源开发一个高性能网络服务器。
1 楼 yiding_he 2007-05-15 就算开发一个 TCP Server,逻辑上也不会很复杂吧。如果访问实在太频繁以至于不得不采用一些额外的架构,自己开发的 TCP Server 亦能提供较大的灵活性。但如果访问量实在一般,就没这个必要了。所以我想如果不太可能达到很高的访问量,不妨先用 HTTP Server,开发起来也更快些;就算将来要换,也只是底层的换一下,不用全部重写。 2 楼 famoushz 2007-05-21 逻辑上就目前项目的需求来说,不会很复杂,但是从性能的要求来说就比较高了,大家知道 异步传输是最快的,查看了java的api,jdk6.0总算支持EPoll,但是仍然没有达到异步传输的方式,现在最多是多路复用。通过原始阻塞的方式,效率性能仍然是一大瓶颈。Http Server的方式肯定性能不是最佳的,HTTP server总是需要response,这样对于当前的这个项目其实很没必要的。不过从开发的成本,时间控制上来说Httpserver是最佳途径。
但是我们那个engineer坚持要用那个,这个项目也是由他发起的。所以如果公司愿意投入时间,开发成本,重新写一个server未尝不可。
所以从技术层面来说我觉得 用ACE来开发异步传输的高性能TCP server是最理想的。 3 楼 galaxystar 2007-05-21 tcp的alive可以设成一个较大的时间,reconnect可以交给客户端来做,高性能推送也是个不错的选择. 4 楼 kdekid 2007-05-21 就看你有没有需要做这个轮子了。如果你是需要从底层开始掌握服务器的性能,并有信心可以写出一个超过Jetty 6的服务器,那就重新写一个。你的服务器可以用到其它更先进的native non blocking 的东西,例如 Linux 2.6 的 epoll。不过你有可能需要面对更长的开发周期,更多的bug和更麻烦的维护(因为没有社区支持)。
否则的话,你可以尝试一下 Jetty 6(如果你用 Java 开发服务器端程序),或者用 lighttpd(如果你要用 RoR 或者 Django作为后台)。 5 楼 kuanchang 2007-05-22 Jetty 6用nio用的我认为比mina,cindy都好 6 楼 galaxystar 2007-05-22 mina不错,cindy已经不行了 7 楼 JAVA_ED 2007-05-22 <br/>
<strong>famoushz 写道:</strong><br/>
<div class='quote_div'>
<p>这周我们公司会进行新项目的research,主要是用于用户行为分析,在各个网站上采集一些用户行为然后传送到指定服务器进行数据收集,以后用于用户行为的分析,其中有一个带头的engineer,他指出希望采用ajax+tcp server的架钩模式进行这个项目,首先由于有很多网站,上百个,在用户点击一些广告的时候会由ajax 异步传输数据到指定server,这里的server可能就是一个Tcp server,这里的讨论焦点就是 是否有必要重新开发一个Tcp server去做数据收集的工作。首先他的论点是:</p>
<ol>
<li>Tcp server位于OSI 网络7层模型的传输层,这样想当然他的效率是最高的,没有了HTTP server没必要的很多东西,比如每次http 传输后http server总是会来个callback,通过tcp 就不需要了,只要来个握手就可以了没必要callback,性能自然提升了。 </li>
<li>通过linux的 epoll 可以提升网络性能。 </li>
</ol>
<p>感觉上他的论点的确有他的道理。但是大家知道现在很多开源的高性能的网络服务器比如wildfire等都是 通过mina nio网络框架进行实现,觉得其性能不会很差,以及其他quick server,cindy都是大口碑的网络框架,我觉得是否有必要再去重新开发一个TcP server,另外关于EPoll从一些文章了解到的当访问量达到 千W级别时候,相对于传统select的确可以大幅提升性能。对于java而言听说java6已经支持了,希望大家发表高见,如何通过现有资源开发一个高性能网络服务器。</p>
</div>
<p><br/>
偶没看懂why你们要去写一个TCP SERVER, </p>
<p>如果你觉得效率无法接受, 可以用socket通信</p> 8 楼 famoushz 2007-05-24 这周用nio的编程方式以及传统堵塞的方式,基于quickserver开源服务器的方式写了三套server,主要公司那个engineer想测试一下性能是否能够满足以后的需求,结果并发2000个socket,就会使得server那边断开一些socket连接,另外在测试当中还发现操作系统的socket连接数,thread的连接数都有限制,windows sp2 以及 linux都会有类似的问题。通过网上找到一些资料重新进行了设置还是会发现类似问题。对方engineer一直怀疑可能操作系统对thread有控制,所以想在一个thread中设置一定的socket但是我调整了之后发现现象依旧,公司上层发现开发诸如此类server会占用大量时间。现在就order me搁浅先~~无语~~ 9 楼 ken1984 2007-05-24 效率要求高,就别考虑什么开源框架了,还是写一个tcp server吧。你要考虑如果以后失败的结果。thread的连接数?不太明白,是指线程数量还是线程内的描述符数量?我记得这些在LINUX都是可以自己修改的。
结果并发2000个socket,就会使得server那边断开一些socket连接?
这个不太可能吧,连接在底层都是队列形式的,满了以后会等待或丢弃,怎么会造成旧的连接断开? 10 楼 robbin 2007-05-24 kdekid 写道就看你有没有需要做这个轮子了。如果你是需要从底层开始掌握服务器的性能,并有信心可以写出一个超过Jetty 6的服务器,那就重新写一个。你的服务器可以用到其它更先进的native non blocking 的东西,例如 Linux 2.6 的 epoll。不过你有可能需要面对更长的开发周期,更多的bug和更麻烦的维护(因为没有社区支持)。
否则的话,你可以尝试一下 Jetty 6(如果你用 Java 开发服务器端程序),或者用 lighttpd(如果你要用 RoR 或者 Django作为后台)。
我最近也看了一下jetty6的源代码,使用了JDK5.0引入的concurrent API,性能确实很不错。不知道现在jetty6和Tomcat6相比,哪个网络负载能力更强。tomcat虽然没有使用JDK的concurrent API,但是自从5.5开始,可以通过apr,使用操作系统的native IO,这个也可以达到同样的异步IO调度的作用。
从理论上来说,操作系统的异步IO调度,怎么也要比JDK提供的异步IO来的快吧?不知道有没有这方面的研究或者评测。
11 楼 lllyq 2007-05-24 看看
http://blog.covalent.net/roller/covalent/entry/20070308
tomcat6看起来能够处理更多的同步请求(16000?),不过似乎有内存泄漏的问题