为什么tomcat比提供静态资源的nodejs更快

时间:2018-06-27 12:26:07

标签: java node.js performance express tomcat

有人告诉我,tomcat在提供静态资源(例如js / css / img)时速度很慢。 (我只熟悉nodejs)

我不明白为什么tomcat比nodejs / nginx慢。服务静态资源时,它们应该全部使用内存缓存还是至少使用非阻塞io?


我进行了一次AB测试,结果出乎意料(tomcat比nodejs快)。我使用Windows 7 Pro和Intel Core i5-5200 @ 2.20GHz和8GB RAM(戴尔笔记本电脑)。我的nodejs版本是v8.9.0,而Java版本是1.8.045和tomcat 5.5.17。

nodejs代码:

const path = require('path');
const Koa = require('koa');
const Router = require('koa-router');
const staticServer = require('koa-static');

const app = new Koa();
const router = new Router();

app.use(staticServer( path.join(__dirname, 'static')) );
app.listen(8001);

nodejs的结果是:

E:\soft-new\apache\Apache24\bin>ab -c 20 -n 1000 http://localhost:8001/benu_crm/a.html
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:
Server Hostname:        localhost
Server Port:            8001

Document Path:          /benu_crm/a.html
Document Length:        3 bytes

Concurrency Level:      20
Time taken for tests:   0.679 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      209000 bytes
HTML transferred:       3000 bytes
Requests per second:    1472.67 [#/sec] (mean)
Time per request:       13.581 [ms] (mean)
Time per request:       0.679 [ms] (mean, across all concurrent requests)
Transfer rate:          300.57 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0       1
Processing:     6   13   3.0     13      26
Waiting:        6   11   2.7     10      23
Total:          6   13   3.0     13      26

Percentage of the requests served within a certain time (ms)
  50%     13
  66%     14
  75%     15
  80%     15
  90%     18
  95%     20
  98%     21
  99%     23
 100%     26 (longest request)

和tomcat的结果是:(对于tomcat,我只是做了一个没有任何Java代码的a.html)

E:\soft-new\apache\Apache24\bin>ab -c 20 -n 1000 http://localhost:8050/benu_crm/a.html
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache-Coyote/1.1
Server Hostname:        localhost
Server Port:            8050

Document Path:          /benu_crm/a.html
Document Length:        3 bytes

Concurrency Level:      20
Time taken for tests:   0.171 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      222000 bytes
HTML transferred:       3000 bytes
Requests per second:    5847.61 [#/sec] (mean)
Time per request:       3.420 [ms] (mean)
Time per request:       0.171 [ms] (mean, across all concurrent requests)
Transfer rate:          1267.74 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0       2
Processing:     0    3   1.3      3       8
Waiting:        0    3   1.4      3       8
Total:          0    3   1.3      3       8

Percentage of the requests served within a certain time (ms)
  50%      3
  66%      4
  75%      4
  80%      4
  90%      5
  95%      6
  98%      6
  99%      7
 100%      8 (longest request)

@EugèneAdell,谢谢。我将a.html的大小增加到309,344字节。然后tomcat 5.5.17和nodejs koa2几乎相等。稍后我将尝试NIO tomcat并将结果放入。但是,我仍然感到惊讶的是,BIO tomcat与koa2几乎相等。

nodejs结果:

E:\soft-new\apache\Apache24\bin>ab -c 20 -n 1000 http://localhost:8001/benu_crm/a.html
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:
Server Hostname:        localhost
Server Port:            8001

Document Path:          /benu_crm/a.html
Document Length:        309344 bytes

Concurrency Level:      20
Time taken for tests:   1.071 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      309555000 bytes
HTML transferred:       309344000 bytes
Requests per second:    933.65 [#/sec] (mean)
Time per request:       21.421 [ms] (mean)
Time per request:       1.071 [ms] (mean, across all concurrent requests)
Transfer rate:          282243.05 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       3
Processing:     8   21  12.0     20     386
Waiting:        2   10   2.2      9      23
Total:          8   21  12.0     20     386

Percentage of the requests served within a certain time (ms)
  50%     20
  66%     22
  75%     23
  80%     23
  90%     25
  95%     26
  98%     29
  99%     31
 100%    386 (longest request)

tomcat结果:

E:\soft-new\apache\Apache24\bin>ab -c 20 -n 1000 http://localhost:8050/benu_crm/a.html
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache-Coyote/1.1
Server Hostname:        localhost
Server Port:            8050

Document Path:          /benu_crm/a.html
Document Length:        309344 bytes

Concurrency Level:      20
Time taken for tests:   0.916 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      309573000 bytes
HTML transferred:       309344000 bytes
Requests per second:    1091.64 [#/sec] (mean)
Time per request:       18.321 [ms] (mean)
Time per request:       0.916 [ms] (mean, across all concurrent requests)
Transfer rate:          330021.72 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       1
Processing:     4   18   3.6     17      45
Waiting:        0    2   2.8      1      22
Total:          4   18   3.6     18      45

Percentage of the requests served within a certain time (ms)
  50%     18
  66%     18
  75%     19
  80%     19
  90%     21
  95%     23
  98%     27
  99%     37
 100%     45 (longest request)

1 个答案:

答案 0 :(得分:0)

凭着tomcat-users邮件列表的功劳,并为此benchmark而努力,Tomcat的良好性能更有可能归因于Java运行时:

  

纯Java Tomcat如何提供静态资源   比Apache httpd更快?我们可以想到的主要原因:   Tomcat是用Java编写的,因为Java字节码可以是本地的   在运行时经过编译和高度优化,编写良好的Java代码可以   当它在实现许多功能的成熟Java VM上运行时,运行速度非常快   运行时优化,例如Sun Hotspot JVM。运行后,   服务许多请求,JVM知道如何为此进行优化   在特定硬件上的特定用途。另一方面,Apache   httpd是用C编写的,它是在运行时完全编译的。

但是,由于您的测试要多次访问一个小文件,因此,Tomcat的 design 可能比Node.js的效率更高,尤其是对于“接受连接和开始投放”部分。网络捕获可能会有助于了解Node.js中的这种延迟从何而来