Правка (2): Теперь используется db-mysql с модулем generic-pool. Частота ошибок значительно снизилась и составляет 13%, но пропускная способность по-прежнему составляет около 100 запросов в секунду.
Edit (1): После того, как кто-то предположил, что ORDER BY RAND () замедлит работу MySQL, я удалил это предложение из запроса. Node.js теперь колеблется около 100 запросов / сек, но по-прежнему сервер сообщает «Ошибка СОЕДИНЕНИЯ: слишком много подключений».
Вы, наверное, видели много тестов "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.
Количество потоков (пользователей): 5000 Я считаю, что это количество одновременных подключений
Период нарастания (в секундах): 1
Количество циклов: 10 ] Это количество запросов на пользователя
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 запросов / сек]
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
$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';
}
?>