test.mjs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. import { io } from "socket.io-client";
  2. import customParser from "socket.io-msgpack-parser";
  3. const url = process.argv[2];
  4. const count = process.argv[3];
  5. const userStartId = process.argv[4];
  6. const testSceneNum = process.argv[5] || "t-test";
  7. const roomStartId = process.argv[6] || "00001";
  8. const isMockCamera = process.argv[7] || 0;
  9. const cameraInterval = process.argv[8] || 100;
  10. const roomNumber = process.argv[9] || 50;
  11. const path = process.argv[10] || "/new-zfb";
  12. let testCamera;
  13. console.log(
  14. "argv:",
  15. count,
  16. userStartId,
  17. testSceneNum,
  18. roomStartId,
  19. isMockCamera,
  20. cameraInterval,
  21. roomNumber
  22. );
  23. console.log("socket-info::url:config-->", url, path);
  24. console.log("socket-info::url:count-->", count);
  25. console.log("socket-info::start-->压力测试正在开始");
  26. const URL = url || process.env.URL;
  27. // http://zhang9394@zhangyupeng:face3d.4dage.com:7005/zhangyupeng/chatIM.git
  28. const MAX_CLIENTS = Number(count) || 500;
  29. // const CLIENT_CREATION_INTERVAL_IN_MS = 0;
  30. // // const EMIT_INTERVAL_IN_MS = 100;
  31. // const EMIT_INTERVAL_IN_MS_camera = Number(cameraInterval);
  32. // let sendcameraIntervalTimer;
  33. // wws://test-socket.4dkankan.com/watch
  34. let clientCount = 0;
  35. let lastReport = new Date().getTime();
  36. let packetsSinceLastReport = 0;
  37. // let testSceneNum = "t-test";
  38. // let roomId = "00001";
  39. let userLimitNum = MAX_CLIENTS;
  40. let agentId = 0;
  41. function sleep(ms) {
  42. return new Promise((resolve) => setTimeout(resolve, ms));
  43. }
  44. function range(start, end) {
  45. return Array(end - start + 1)
  46. .fill()
  47. .map((_, idx) => start + idx);
  48. }
  49. const groups = (arr, chunkSize) => {
  50. return arr
  51. .map((e, i) => {
  52. return i % chunkSize === 0 ? arr.slice(i, i + chunkSize) : null;
  53. })
  54. .filter((e) => {
  55. return e;
  56. });
  57. };
  58. // new Array(Number(count)).fill(0).forEach((_, index) => {
  59. // // console.log("agent", index);
  60. // const isLast = (index + 1) % roomNumber === 0;
  61. // if (isLast) {
  62. // console.log("isLast", index);
  63. // }
  64. // });
  65. const createAgent = () => {
  66. agentId += 1;
  67. const nickName = `test_name_${userStartId}${agentId}`;
  68. const userId = `${userStartId}${agentId}`;
  69. const oid = `oid-${userStartId}${agentId}`;
  70. const role = agentId === 1 ? "leader" : "customer";
  71. const roomId = "";
  72. console.log("agentId", agentId);
  73. // createClient({ userId, nickName, from: "0", role: role, oid });
  74. // createClient({ userId, nickName, from: "1", role: role, oid });
  75. // createClient({ userId, nickName, from: "2", role: role, oid });
  76. };
  77. const createClient = ({ userId, nickName, from, role, oid, roomId }) => {
  78. // for demonstration purposes, some clients stay stuck in HTTP long-polling
  79. const socket = io(URL, {
  80. path: path,
  81. transports: ["websocket"],
  82. parser: customParser,
  83. extraHeaders: {
  84. oid: oid,
  85. },
  86. query: {
  87. userId: userId,
  88. from: from || 2,
  89. sceneNum: testSceneNum,
  90. role: role,
  91. nickName: nickName,
  92. roomId: roomId,
  93. voiceStatus: 0,
  94. enableTalk: true,
  95. isAuthMic: 0,
  96. isAllowMic: 0,
  97. userLimitNum,
  98. myHeadUrl:
  99. "http://downza.img.zz314.com/edu/pc/wlgj-1008/2016-06-23/64ec0888b15773e3ba5b5f744b9df16c.jpg",
  100. },
  101. });
  102. if (Number(isMockCamera) === 1 && Number(from) === 0 && role === "leader") {
  103. console.log(
  104. `房间${roomId} 房主${userId} from:${from}--> v3开启发送定时${cameraInterval}ms镜头`
  105. );
  106. setInterval(() => {
  107. const data = {
  108. testUserId: userId,
  109. item: {
  110. qua: {
  111. _x: -0.11495106988815072,
  112. _y: 0.13408027376477993,
  113. _z: 0.015660797097947755,
  114. _w: 0.9841562229407423,
  115. },
  116. mode: "panorama",
  117. pos: {
  118. x: 1.7477431297302246,
  119. y: -0.1338435709476471,
  120. z: 1.3797638416290283,
  121. },
  122. type: "Rotate",
  123. pano: "1",
  124. target: {
  125. x: 1.4874317088952322,
  126. y: -0.3643028004004215,
  127. z: 0.442146378191566,
  128. },
  129. },
  130. };
  131. socket.emit("webSyncAction", data);
  132. }, cameraInterval);
  133. }
  134. // setInterval(() => {
  135. // socket.emit("client to server event");
  136. // }, EMIT_INTERVAL_IN_MS);
  137. // socket.on("server-benmark-client", (data) => {
  138. // packetsSinceLastReport++;
  139. // testCamera = data;
  140. // // console.log("客户端收到服务端-镜头-MOCK", data);
  141. // });
  142. // socket.emit("server-interval-room-broadcast", { time: 1000 });
  143. // socket.on("client-interval-room-broadcast", (data) => {
  144. // console.log(`客户端${userId}收到房间播报-MOCK"`, data);
  145. // });
  146. socket.on("webSyncAction", (data) => {
  147. // console.log();
  148. testCamera = `webSyncAction:${userId}收到-->${data.testUserId}的webSyncAction`;
  149. packetsSinceLastReport++;
  150. });
  151. socket.on("disconnect", (reason) => {
  152. console.log(`disconnect due to ${reason}`);
  153. });
  154. clientCount++;
  155. // if (++clientCount < MAX_CLIENTS) {
  156. // setTimeout(createAgent, CLIENT_CREATION_INTERVAL_IN_MS);
  157. // }
  158. };
  159. const chunkSize = Number(roomNumber);
  160. const arr = range(1, Number(count));
  161. groups(arr, chunkSize).forEach((group, gIndex) => {
  162. // console.log("group", group);
  163. Array.from(group).forEach(async (agent, index) => {
  164. try {
  165. // console.log("agent-1", agent, gIndex + 1);
  166. const nickName = `test_name_${userStartId}${agent}`;
  167. const userId = `${userStartId}${agent}`;
  168. const oid = `oid-${userStartId}${agent}`;
  169. const roomId = `${roomStartId}${gIndex + 1}`;
  170. let role = index === 0 ? "leader" : "customer";
  171. createClient({ userId, nickName, from: "0", role: role, oid, roomId });
  172. createClient({ userId, nickName, from: "1", role: role, oid, roomId });
  173. createClient({ userId, nickName, from: "2", role: role, oid, roomId });
  174. } catch (error) {
  175. console.log("初始化");
  176. }
  177. });
  178. });
  179. // createAgent();
  180. const printReport = () => {
  181. const now = new Date().getTime();
  182. const durationSinceLastReport = (now - lastReport) / 1000;
  183. const packetsPerSeconds = (
  184. packetsSinceLastReport / durationSinceLastReport
  185. ).toFixed(2);
  186. console.log(
  187. `client count: ${clientCount} ; average packets received per second: ${packetsPerSeconds} ${
  188. testCamera ? " carmera:" + testCamera : ""
  189. }`
  190. );
  191. packetsSinceLastReport = 0;
  192. lastReport = now;
  193. };
  194. setInterval(printReport, 5000);