Как профилировать веб-сервис? - PullRequest
1 голос
/ 15 марта 2012

В настоящее время я занимаюсь разработкой учебного приложения в 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)

Ответы [ 2 ]

0 голосов
/ 15 марта 2012

Я настоятельно рекомендую взглянуть на поддержку DTrace Restify. Скорее всего, он станет вашим лучшим другом при профилировании.

http://mcavage.github.com/node-restify/#DTrace

0 голосов
/ 15 марта 2012

Можно ли детально профилировать приложения узла?

Да.Используйте node --prof app.js для создания v8.log, затем используйте linux-tick-processor, mac-tick-processor или windows-tick-processor.batdeps/v8/tools в каталоге src узла) для интерпретации журнала.Вы должны встроить d8 в deps/v8, чтобы иметь возможность запускать тиковый процессор.

Вот как я делаю это на моей машине:

apt-get install scons
cd ~/development/external/node-0.6.12/deps/v8
scons arch=x64 d8
cd ~/development/projects/foo
node --prof app.js
D8_PATH=~/development/external/node-0.6.12/deps/v8 ~/development/external/node-0.6.12/deps/v8/tools/linux-tick-processor > profile.log

Есть также несколько инструментовчтобы сделать это проще, включая node-profiler и v8-profiler node-inspector ).

По поводу вашего другого вопроса, яхотелось бы получить дополнительную информацию о том, как вы извлекаете данные из Mongo и как они выглядят (я согласен с beny23, что они выглядят как подозрительно малый объем данных).

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