3

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

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

但是,我没有得到我正在寻找的行为。这是我的服务器代码,我的火炮脚本,以及相应的帮助函数。

服务器.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, 0, 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);

火炮测试.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, 0, 0, 0];
  }
  // set the "items" variable for the virtual user to use in the subsequent action
  userContext.vars.items = items;
  return done();
  }

我知道我“听”帧的方式很老套。我不认为仅仅为了侦听传入帧而发出虚拟消息是要走的路,但我很想知道如何将客户端停在侦听模式下,然后每次新的时候检查传入数据的完整性数据包到达。

这是客户端启动后我的输出示例: Report @ 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

会喜欢任何提示!

4

0 回答 0