Бенчмаркинг производительности node.js (кластера) с пулами mysql: Lighttpd + PHP?

Правка (2): Теперь используется db-mysql с модулем generic-pool. Частота ошибок значительно снизилась и составляет 13%, но пропускная способность по-прежнему составляет около 100 запросов в секунду.

Edit (1): После того, как кто-то предположил, что ORDER BY RAND () замедлит работу MySQL, я удалил это предложение из запроса. Node.js теперь колеблется около 100 запросов / сек, но по-прежнему сервер сообщает «Ошибка СОЕДИНЕНИЯ: слишком много подключений».

Node.js или Lighttpd с PHP?

Вы, наверное, видели много тестов "Hello World" для node.js ... но тесты "hello world", даже те, которые задерживались на 2 секунды на запрос, не выполняются. даже близко к реальному использованию в производстве. Я также выполнил эти варианты тестов «Hello World» с использованием node.js и увидел пропускную способность около 800 запросов / сек с коэффициентом ошибок 0,01%. Однако я решил провести несколько более реалистичных тестов.

Возможно, мои тесты не завершены, скорее всего, что-то ДЕЙСТВИТЕЛЬНО не так с node.js или моим тестовым кодом, поэтому, если вы эксперт по node.js, пожалуйста, помогите мне написать несколько лучших тестов. Мои результаты опубликованы ниже. Я использовал Apache JMeter для тестирования.

Тестовый пример и системные спецификации

Тест довольно прост. Запрос mysql для количества пользователей упорядочивается случайным образом. Извлекается и отображается имя пользователя первого пользователя.Подключение к базе данных mysql осуществляется через сокет unix. ОС - FreeBSD 8+. 8 ГБ оперативной памяти. Процессор Intel Xeon Quad Core 2.x Ghz. Я немного настроил конфигурации Lighttpd еще до того, как наткнулся на node.js.

Настройки Apache JMeter

Количество потоков (пользователей): 5000 Я считаю, что это количество одновременных подключений

Период нарастания (в секундах): 1

Количество циклов: 10 ] Это количество запросов на пользователя

Конечные результаты Apache JMeter

Label                  | # Samples | Average  | Min   | Max      | Std. Dev. | Error % | Throughput | KB/sec | Avg. Bytes

HTTP Requests Lighttpd | 49918     | 2060ms   | 29ms  | 84790ms  | 5524      | 19.47%  | 583.3/sec  | 211.79 | 371.8

HTTP Requests Node.js  | 13767     | 106569ms | 295ms | 292311ms | 91764     | 78.86%  | 44.6/sec   | 79.16  | 1816

Выводы результатов

Node.js был настолько плохим, что мне пришлось преждевременно остановить тест. [ Исправлено Протестировано полностью]

Node.js сообщает «Ошибка ПОДКЛЮЧЕНИЯ: слишком много подключений» на сервере. [ Исправлено ]

Большую часть времени Lighttpd имел пропускную способность около 1200 запросов / сек.

Однако node.js имел пропускную способность около 29 запросов в секунду. [ Исправлено Теперь при 100 запросов / сек]

Это код, который я использовал для node.js (с использованием пулов MySQL)

var cluster = require('cluster'), http = require('http'), mysql = require('db-mysql'), generic_pool = require('generic-pool');

var pool = generic_pool.Pool({
    name: 'mysql',
    max: 10,
    create: function(callback) {
        new mysql.Database({
            socket: "/tmp/mysql.sock",
            user: 'root',
            password: 'password',
            database: 'v3edb2011'
        }).connect(function(err, server) {
            callback(err, this);
        });
    },
        destroy: function(db) {
        db.disconnect();
    }
});

var server = http.createServer(function(request, response) {  
    response.writeHead(200, {"Content-Type": "text/html"});  
    pool.acquire(function(err, db) {
        if (err) {
            return response.end("CONNECTION error: " + err);
        }

        db.query('SELECT * FROM tb_users').execute(function(err, rows, columns) {
            pool.release(db);

            if (err) {
                return response.end("QUERY ERROR: " + err);
            }
            response.write(rows.length + ' ROWS found using node.js<br />');
            response.end(rows[0]["username"]);
        });
    });   
});

cluster(server)
  .set('workers', 5)
  .listen(8080);

Это код, который я использовал для PHP (Lighttpd + FastCGI)

<?php
  $conn = new mysqli('localhost', 'root', 'password', 'v3edb2011');
  if($conn) {
    $result = $conn->query('SELECT * FROM tb_users ORDER BY RAND()');
    if($result) {
      echo ($result->num_rows).' ROWS found using Lighttpd + PHP (FastCGI)<br />';
      $row = $result->fetch_assoc();
      echo $row['username'];
    } else {
      echo 'Error : DB Query';
    }
  } else {
    echo 'Error : DB Connection';
  }
?>
7
задан j0k 26 June 2012 в 16:25
поделиться