В настоящее время я занимаюсь разработкой учебного приложения в node.js. Это приложение состоит из веб-службы JSON REST, которая допускает две службы.
- Вставить журнал (запрос PUT в / log, с сообщением для входа)
- Последние 100 журналов (запрос GET к / log, который возвращает последние 100 журналов)
Текущий стек сформирован сервером node.js, который имеет логику приложения и базу данных mongodb, которая заботится о постоянстве. Чтобы предложить веб-сервисы JSON REST, я использую модуль node-restify .
В настоящее время я выполняю некоторые стресс-тесты с использованием Apache Bench (используя 5000 запросов с параллелизмом 10) и получаю следующие результаты:
Execute stress tests
1) Insert log
Requests per second: 754.80 [#/sec] (mean)
2) Last 100 logs
Requests per second: 110.37 [#/sec] (mean)
Я удивлен разницей в производительности, выполняемый запрос использует индекс. Интересно, что кажется, что генерация выходных данных JSON все время требует более глубоких тестов, которые я выполнил.
Можно ли детально профилировать приложения узла?
Это нормальное поведение? Получение данных занимает гораздо больше, чем вставка данных?
EDIT:
Полная информация о тестировании
1) Insert log
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
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)
Server Software: log-server
Server Hostname: localhost
Server Port: 3010
Document Path: /log
Document Length: 0 bytes
Concurrency Level: 10
Time taken for tests: 6.502 seconds
Complete requests: 5000
Failed requests: 0
Write errors: 0
Total transferred: 2240634 bytes
Total PUT: 935000
HTML transferred: 0 bytes
Requests per second: 768.99 [#/sec] (mean)
Time per request: 13.004 [ms] (mean)
Time per request: 1.300 [ms] (mean, across all concurrent requests)
Transfer rate: 336.53 [Kbytes/sec] received
140.43 kb/s sent
476.96 kb/s total
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 3
Processing: 6 13 3.9 12 39
Waiting: 6 12 3.9 11 39
Total: 6 13 3.9 12 39
Percentage of the requests served within a certain time (ms)
50% 12
66% 12
75% 12
80% 13
90% 15
95% 24
98% 26
99% 30
100% 39 (longest request)
2) Last 100 logs
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
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)
Server Software: log-server
Server Hostname: localhost
Server Port: 3010
Document Path: /log
Document Length: 4601 bytes
Concurrency Level: 10
Time taken for tests: 46.528 seconds
Complete requests: 5000
Failed requests: 0
Write errors: 0
Total transferred: 25620233 bytes
HTML transferred: 23005000 bytes
Requests per second: 107.46 [#/sec] (mean)
Time per request: 93.057 [ms] (mean)
Time per request: 9.306 [ms] (mean, across all concurrent requests)
Transfer rate: 537.73 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 28 93 16.4 92 166
Waiting: 26 85 18.0 86 161
Total: 29 93 16.4 92 166
Percentage of the requests served within a certain time (ms)
50% 92
66% 97
75% 101
80% 104
90% 113
95% 121
98% 131
99% 137
100% 166 (longest request)
Получение данных из базы данных
Для запроса базы данных я использую модуль mongoosejs . Схема журнала определяется как:
{
date: { type: Date, 'default': Date.now, index: true },
message: String
}
и запрос, который я выполняю, следующий:
Log.find({}, ['message']).sort('date', -1).limit(100)