почему Tomcat работает быстрее, чем nodejs, обслуживающий статический ресурс - PullRequest
0 голосов
/ 27 июня 2018

Мне сказали, что tomcat работает медленно при обслуживании статического ресурса, такого как js / css / img. (Я только знаком с nodejs)

Я не понимаю, почему tomcat медленнее, чем nodejs / nginx. Должны ли все они использовать кэш-память или, по крайней мере, использовать неблокирующие операции ввода-вывода при обслуживании статических ресурсов?


Я провел тест AB, и результат неожиданный (tomcat быстрее, чем nodejs). Я использовал Windows 7 Pro с Intel Core i5-5200 @ 2,20 ГГц и 8 ГБ ОЗУ (ноутбук Dell). Моя версия nodejs v8.9.0 и java версия 1.8.045 и tomcat 5.5.17.

Код узла:

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 я просто создал a.html без какого-либо java-кода)

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)

Результат кота:

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 голосов
/ 28 июня 2018

С кредитами в список рассылки tomcat-users и в devshed для этого теста , хорошая производительность Tomcat, скорее всего, будет приписана среде выполнения Java:

Как Tomcat с чистой Java может обслуживать статический ресурс быстрее чем Apache httpd? Основная причина, по которой мы можем думать: потому что Tomcat написан на Java и потому, что байт-код Java может быть изначально хорошо скомпилированный и оптимизированный во время выполнения хорошо написанный Java-код может работать очень быстро, когда он работает на зрелой виртуальной машине Java, которая реализует много оптимизация времени выполнения, такая как JVM Sun Hotspot. После того, как он работает и обслуживает много запросов, JVM знает, как это оптимизировать конкретное использование на этом конкретном оборудовании. С другой стороны, Apache httpd написан на C, который полностью компилируется перед выполнением.

Тем не менее, поскольку ваш тест предполагает многократный доступ к небольшому файлу, возможно, что дизайн Tomcat более эффективен, чем у Node.js, особенно для «принять соединение и запустить». обслуживающий "часть. Захват сети, возможно, поможет увидеть, откуда возникает эта задержка в Node.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...