火炮SocketIO流吞吐量测试

问题描述

我想进行一次大炮测试,启动n个socket.io客户端,这些客户端全部侦听来自服务器的定期数据包。这个想法是服务器以一定的时间间隔广播json“帧”,我想看看客户端接收这些“帧”的速度有多快。

我在服务器上生成帧,然后将其广播给所有客户端。然后,客户端具有该帧的相同本地副本,以检查它们在接收时是否相等。我这样做是为了确保数据包完整性,因此我可以放心地使用数据包的大小和延迟来衡量吞吐量。

但是,我没有得到想要的行为。这是我的服务器代码,我的火炮脚本和相应的帮助功能

server.js

// Dependencies
const express = require('express');
const http = require('http');
// note: socketIO uses JSON.stringify() natively to send and receive any objects
const socketIO = require('socket.io');
const app = express();
const server = http.Server(app);
const io = socketIO(server);
const port = 6969
app.set('port',port);

// keep time of session
let t0 = null
let command_sequence_number = 0

// Starts the server.
server.listen(port,function() {
    console.log('Starting server on port ',port);
  });

let num_items = 1000;
items = {}
for (let i = 0; i < num_items; i++) {
  items[`item${i}`] = [0,0];
}

/**
 * WebSocket handlers (every time a connection is made)
 * @param {Object} socket
 */
io.on('connection',function(socket) {
  console.log('new connection');

});

/**
* simulate data stream
*/
let frame_delay = 30; // milliseconds
setInterval(function() {
  io.sockets.emit('FRAME',items);
},frame_delay);

artillery_test.yml


config:
    target: "http://localhost:6969"
    processor: "build_frame.js"
    phases:
      - duration: 10
        arrivalRate: 5
        name: Simple Test Phase
scenarios:
  - name: Simple Throughput Test Scenario
    engine: socketio # Enable the Socket.io engine
    flow:
        - function: "build_frame"      
        - loop:
          - emit:
              channel: "dummy"
              data: ""
              response:
                channel: "FRAME"
                data: "{{ items }}"
          count: 3600 #30frames/s * 120s = 3600 frames

build_frame.js

module.exports = { build_frame };

function build_frame (userContext,events,done) {
  let num_items = 1000;
  let items = {}
  for (let i = 0; i < num_items; i++) {
    itesm[`item${i}`] = [0,0];
  }
  // set the "items" variable for the virtual user to use in the subsequent action
  userContext.vars.items = items;
  return done();
  }

我知道我“侦听”帧的方式很简单。我不认为仅发送伪消息来侦听传入的帧是可行的方法,但我很想知道如何仅将客户端停放在侦听模式下,然后在每次进行新操作时都检查传入数据的完整性包到达。

下面是我的客户旋转后的输出示例: 报告@ 01:40:08(-0700)2020-09-02 经过时间:30分钟37秒 启动的场景:0 方案完成:0 完成的请求:746 平均响应/秒:37.49 响应时间(毫秒): 最低:1161.8 最多:1468.1 中位数:1317.1 p95:1388.5 p99:1444.4 代码: 0:746

警告:cpu使用率过高警告(pids:2056)。 有关详细信息,请参见https://artillery.io/docs/faq/#high-cpu-warnings

会喜欢任何提示

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)