信令服务器性能问题:Python与NodeJS



我正在开发一个需要特定信令服务器实现的WebRTC应用程序。最初我在NodeJS中开发服务器,但后来我决定迁移到Python(使用Django Channels AsyncWebsocketConsumer通过Websocket与客户端通信)。迁移后,我使用WebSocket基准测试工具Thor对两种实现进行了比较,结果如下(5000个WebSocket连接,每个连接发送1000条消息):

Python(Django Channels)实现:

class SignallingConsumer(AsyncWebsocketConsumer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.peer = None
self.signal = None
self.is_peer_registered = False
async def connect(self):
await self.accept()
async def disconnect(self, close_code):
pass
async def receive(self, text_data=None, bytes_data=None):
pass

NodeJS实现:

method.start = function () {
this.webServer = this.createWebServer();
this.webServer.listen(this.config.port, function (){
console.log("Web server is listening");
});
this.socket = this.createWebSocket(this.webServer);
this.socket.on('connection', function(ws) {
var pingsCompleted = 0;
ws.on('message', function(evt) {
}.bind(this));
// Set out ping/pong mechanism
var pingInterval = setInterval(function() {
if(pingsCompleted > 2) {
ws.close();
} 
else {
ws.ping();
pingsCompleted++;
}
}.bind(this), config.pingPeriod);
ws.on('pong', function(evt) {
pingsCompleted = 0;
}.bind(this));
ws.on('close', function(evt) {
}.bind(this));

Python(Django Channels)结果:

Online               30792 milliseconds
Time taken           30792 milliseconds
Connected            3714
Disconnected         0
Failed               1286
Total transferred    4.43MB
Total received       525.91kB
Durations (ms):
min     mean     stddev  median max
Handshaking          4795    11410      5517   10824 23923
Latency              NaN     NaN         NaN     NaN NaN

NodeJS结果:

Online               41307 milliseconds
Time taken           41307 milliseconds
Connected            4051
Disconnected         0
Failed               949
Total transferred    952.72kB
Total received       693.4kB
Durations (ms):
min     mean     stddev  median max
Handshaking          2       1124       1044     860 5200
Latency              NaN     NaN         NaN     NaN NaN

因此,尽管两种实现中失败连接的数量或多或少相同,但Django Channels中握手协商的持续时间比NodeJS中慢得多,这让我重新考虑了Python的迁移。

那么这些结果正常吗?在这种情况下使用NodeJS更好吗?

NodeJS在相当低的级别上进行非阻塞I/O,并由V8支持,V8可以很好地进行JIT优化。

Django通道是一个更高级的构造,性能也将在很大程度上取决于Python实现。CPython直接解释字节码并使用全局执行锁。

我希望NodeJS在CPython上比Django表现得更好。然而,如果您出于其他原因更喜欢Django,您可能需要比较PyPy、IronPython和Jython的性能。

最新更新