Node.js VS Twisted (Just For Fun)
Мини-тест по мотивам восхвалений Node.JS. Хм, а оно действительно неплохо работает...
UPDATE: также см. COMET: серверная часть - паттерны реализации.
Возьмем пример с сайта node.js и поставим там 10 секунд вместо 2. Т.е. будем считать, что COMET-сообщения приходят раз в 10 секунд:
var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
setTimeout(function () {
res.writeHeader(200, {'Content-Type': 'text/plain'});
res.write('Hello World');
res.close();
}, 10000);
}).listen(8000);
sys.puts('Server running at 127.0.0.1:8000/');
Создадим аналог на twisted в старых добрых традициях дефередов (ну или если по-русски, то не кривой):
# node.py
from twisted.web import server, resource
from twisted.internet import reactor
from twisted.internet.defer import Deferred
class Simple(resource.Resource):
isLeaf = True
def sayHi(self, request):
request.write('Hello, world!')
request.finish()
def render_GET(self, request):
d = Deferred()
reactor.callLater(10, d.callback, None)
d.addCallback(lambda _: self.sayHi(request))
return server.NOT_DONE_YET
site = server.Site(Simple())
reactor.listenTCP(8001, site)
reactor.run()
Будем тестировать - по 500 одновременных клиентов, всего 10000 запросов.
ab -n 10000 -c 500 http://127.0.0.1:8001/
Запустим на twistd:
Concurrency Level: 500
Time taken for tests: 210.635430 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1200000 bytes
HTML transferred: 130000 bytes
Requests per second: 47.48 [#/sec] (mean)
Time per request: 10531.772 [ms] (mean)
Time per request: 21.064 [ms] (mean, across all concurrent requests)
Transfer rate: 5.56 [Kbytes/sec] received
Обратим внимание:
Time per request: 10531.772 [ms] (mean)
Означает, что вместо 10 сек сервер выполнял каждый запрос в среднем на 0.5 сек дольше. То есть, 5% overhead.
А теперь - на node.js:
Concurrency Level: 500
Time taken for tests: 200.672573 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 750000 bytes
HTML transferred: 110000 bytes
Requests per second: 49.83 [#/sec] (mean)
Time per request: 10033.629 [ms] (mean)
Time per request: 20.067 [ms] (mean, across all concurrent requests)
Transfer rate: 3.65 [Kbytes/sec] received
Здесь имеем оверхед не 5%, а всего лишь 0.3%. Неплохо!
По памяти расклад примерно одинаковый:
13m node
12m twistd
|
Пример на сайте выглядит так:
var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
setTimeout(function () {
res.writeHeader(200, {'Content-Type': 'text/plain'});
res.write('Hello World');
res.close();
}, 2000);
}).listen(8000);
sys.puts('Server running at http://127.0.0.1:8000/');
По-моему, в последних релизах Node.js было много кардинальных изменений, а пример не обновили... Да и сообщение об ошибке недвусмысленно намекает, что надо сделать, чтобы заработало
Кстати, чем node.js принципиально отличается от серверного v8? Надо сказать, на простом тесте с выводом строки в цикле он меня несколько разочаровал.
Это и есть v8, только к нему прикручен асинхронный API и другие мелкие вкусности.
UPDATE: тест, представленный здесь, лучше бы сделать с другой тестилкой, больше заточенной под много одновременных соединений (не ab).
Пользовал в проекте. По личным впечатлениям - Node.JS быстр, но очень молод. И сегфолтился и тупо прекращал работать, что только не было. Такие дела..