我用一个简单的Servlet测试,这个Servlet中什么也没做,由于我用了Servlet3.0的异步特性,里面只是AsyncContext.complete();对于这个Servlet,在一台服务器上,用一个Tomcat实例,想并发到10000 req/sec,有没有做过的朋友来指点一下。目前,我通过配置默认的BIO的connector,最好的时候能到5880 req/sec,距离要求的 10k req/sec还很远。我看《Tomcat权威指南》上说BIO的性能还不错能到 2.3w req/sec呢。

解决方案 »

  1.   

    谢谢 ChengLyn 朋友回答。确实会跟机器有关系,但我的服务器的CPU使用率都不到20%!
      

  2.   

    是用什么方法进行压力测试的?LoadRunner?还是Apache的ab?压力测试客户机CPU如何?网络带宽占用如何?虚拟并发数多少?
      

  3.   

    并发量应该跟内存有关,跟CPU的关系不是很大
    估计你是2G内存,5880 req/sec已经很不错了
      

  4.   

    To ldh911:用的 Apache Bench, 参数是: ab -n 100000 -c 100 http://localhost:8080/MY/T
    直接在服务器上测试的,应该没有带宽的限制了。
    OS: Windows 2008 R2, 虚拟机: 16核,32G内存
    JDK6_update30
    Tomcat 7.0.27
      

  5.   

    <Connector port="8080" protocol="HTTP/1.1"

    acceptCount="1000"
    disableUploadTimeout="true"
    enableLookups="false"
    keepAliveTimeout="20"
    maxThreads="500" 
    minThreads="500"
    maxProcessor="500"
    minSpareThreads="20"
    maxKeepAliveRequests="1"
    connectionTimeout="20" 
    redirectPort="8443"
    allowTrace="false"
           acceptorThreadCount="100"
    acceptorThreadPriority="7"
    socket.tcpNoDelay="true"
    threadPriority="8"
    tcpNoDelay="true"
    compression="on"

    emptySessionPath="true"
    />这是我的connector配置
      

  6.   

    To stevenzxl:内存足够啊,32个G.在我本地PC上测试,4G的内存都用不完,而且我的JVM参数配置在本地是 1g,在服务器上设置的是 16g, 不过没有仔细设置 年轻代 年老代的比例
      

  7.   

    内存大小主要影响GC频度,内存小GC频度高,这个可以在JVM启动参数中增加 -XX:+PrintGCDetails 来查看GC的频度如何。用ab的话,并发量可以再尝试增大点,反正CPU还有富裕,根据你Connector的配置,加到500是没问题的。几个参数建议调整下:
    minSpareThreads 小了,建议设置500,服务器启动时就把线程都准备好。
    maxSpareThreads 增加上,也是500好了。
    acceptorThreadCount 大了点,按照CPU数量设置。
    maxKeepAliveRequests 小了点,可以放大点,比如 50 ~ 100。
    acceptCount 小了点,可以放大点,比如跟Thread一样大。
    “《Tomcat权威指南》上说BIO的性能还不错能到 2.3w req/sec呢”
    基本上都是做了不少优化后的效果了。
      

  8.   


    多谢 ldh911 !minSpareThreads maxSpareThreads 都调成跟maxThread一样,可以理解,启动时就把所有的线程准备好,并且不释放。acceptorThreadCount 跟CPU 的core数目一样,也可以理解,看书上写的意思像是这么多线程来从一个池子里取出线程。maxKeepAliveRequests 这个设置,我从书上看的说 设置为1,来应对高并发(我没有太理解这个参数)acceptCount 设置的1000,maxThreads设置的500,这个应该是大了。我试试看,回来通知你 ldh911 !Thanks again!
      

  9.   

    maxKeepAliveRequests 设置为1,即禁用keepAlive,某些场合下有道理。但真实环境下的HTTP1.1中,允许一次连接传送多个请求,这样可以有效减少浏览器与服务端的TCP握手次数。比如一个网页带20张图片,非keepAlive模式下,要连接20次服务器来获取20张图片;启用keepAlive则可以1次连接获取20张图片。当然,客观地说,面对压力测试未必有意义。
    maxKeepAliveRequests - 最大长连接个数(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间) the maximum number of HTTP requests that can be held in the pipeline until the connection is closed by the server. Setting this attribute to 1 disables HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 allows an unlimited number of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100.
      

  10.   

    Sorry啊!过了这么久才过来。这个问题后来我没有再在这个上面纠结,选择了Mina,自己写服务端,异步通信的话,上面的虚拟机(换成了CentOS)能达到112w req / sec. 同步也能到12w。谢谢 ldh911 的热心回答!Thanks a lot!!不过我有个问题:
    我自己写的服务端,如何作为类似于 httpd 这样的服务发布呢?
      

  11.   

    我看《Tomcat权威指南》上说BIO的性能还不错能到 2.3w req/sec每次看到这种并发XXX的问题总觉得令人蛋疼,不是说解决不了,而是毫无意义的问题。假设1秒钟并发1万,那1个小时的pv就是3600万,假设一天的pv只按照3个小时算就是1亿的pv。一天1亿的pv多大?我刚刚查一下新浪微博的排名,平均一天的pv是1.8亿,也就是说你相当于做了半个新浪微博。
    新浪微博有多少工程师、多少服务器我不知道,不过我们网站正好用的apache+tomcat,流量很低,alexa排名才1万,有15台tomcat服务器。兄弟,如果你能一台服务器解决这个问题的话,我可以花高价聘请你来帮忙,不过前提是你不被google这样的公司挖走,因为我听说google有超过100万台服务器。
      

  12.   

    你给tomcat分配的资源太少了。要加大。加到1024左右还差不多。