最近基于socket.io写了个消息服务,使用websocket-bench 在进行压力测试
websocket-bench -a 5000 -c 500 http://ip:9080
发现只要连接超过1000多点,就会失败:
Launch bench with 5000 total connection, 500 concurent connection 0 message(s) send by client 1 worker(s) WS server : socket.io #### steps report #### ┌────┬────── ┬─── ┬───────┐ │ Number │ Connections │ Errors │ Duration(ms) │ ├────┼────── ┼────┼───────┤ │ 500 │ 500 │ 0 │ 1787 │ ├────┼── ────┼────┼───────┤ │ 1000 │ 500 │ 0 │ 2609 │ ├────┼── ────┼────┼───────┤ │ 1500 │ 0 │ 500 │ 2610 │ ├────┼───── ─┼────┼───────┤ │ 2000 │ 13 │ 487 │ 1609 │ ├────┼ ──────┼────┼───────┤ │ 2500 │ 0 │ 500 │ 1114 │ ├────┼──── ──┼────┼───────┤ │ 3000 │ 0 │ 500 │ 1135 │ ├────┼─ ─────┼────┼───────┤ │ 3500 │ 0 │ 500 │ 634 │ ├────┼──── ──┼────┼───────┤ │ 4000 │ 0 │ 500 │ 597 │ ├────┼── ────┼────┼───────┤ │ 4500 │ 0 │ 500 │ 1119 │ ├────┼─── ───┼────┼───────┤ │ 5000 │ 0 │ 500 │ 618 │ └────┴──── ──┴────┴───────┘ #### total report #### ┌────┬────── ┬────┬───────┬───────┬───────┐ │ Number │ Connections │ Errors │ Message Send │ Message Fail │ Duration(ms) │ ├────┼──── ──┼────┼───────┼───────┼───────┤ │ 5000 │ 1013 │ 3987 │ 0 │ 0 │ 9627 │ └────┴─── ───┴────┴───────┴───────┴───────┘
为什么会是1000多点这个数?websocket-bench 的README.md文档也特别提醒:
Tip: You may find it useful to increase the maximum number of open file descriptors on your system during testing: ulimit -n 60000
ulimit 有什么特殊作用?网上搜到这篇文章 通过ulimit改善系统性能 ,原来是系统默认的文件打开数影响了连接数 ,通过命令 ulimit -a 可以看到:
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 31107 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 31107 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
open files 为 1024 大概明白为什么socket连接只能有1000多点,使用 ulimit -n 60000来调整可打开文件数,再进行测试,连接数果然就正常了
题外话:socket长连接保持着“文件”(Linux上一切都可以看成是文件)被打开,所以1024的文件连接数很快被耗尽,虽然websocket-bench 文档中也提到ulimit -n 参数调整,但是对操作系统性能类的参数了解很少,没明白什么意思,就无视了,等发现问题的时候,猜可能是该参数影响了性能,才去查资料,所以说专业的事情还真得专业的人来解决,主机工程师或者性能测试人员对这类的参数也许就比较熟悉,知道该类参数的调整,程序员碰到可能真得一头雾水,现在明白为什么高校的计算机专业需要开设操作系统的课程了,这才是基础,虽然学的也是一头雾水^_^
相关推荐
1. **服务器端设置**:在Node.js项目中,导入`socket.io`模块,初始化服务器并监听特定端口,然后使用`io.on('connection', (socket) => {})`来处理新连接和事件。 2. **客户端连接**:在Java或Android应用中,导入...
4. **socket.js** 或类似的文件 - 用于初始化socket.io连接,处理信令消息的发送和接收。 5. **util** 文件夹 - 可能包含了一些工具函数,如处理WebRTC API的辅助方法。 项目的实现流程大致如下: 1. 用户打开应用...
1. **初始化连接**:在微信小程序中启动Socket.IO连接,通常需要指定服务器地址和端口,以及可能的连接参数。 2. **事件监听与发送**:提供发送和接收数据的接口,如`emit`用于发送事件,`on`用于监听事件。这使得...
2. **连接**:创建一个Socket.IO客户端实例,并指定服务器地址。例如: ```javascript const socket = io('http://localhost:3000'); ``` 3. **事件监听**:Socket.IO提供了丰富的事件机制,如`connect`、`...
Socket.IO 是一个流行的实时应用程序框架,它提供了一种简单的方式来处理浏览器和服务器之间的双向通信。然而,微信小程序并不直接支持原生的Socket.IO库,因为它的运行环境与常规的Web环境有所不同。因此,我们需要...
2. **连接管理**:Swift Socket.IO客户端负责建立和维护与服务器的连接。它会自动处理网络波动,包括重连策略,确保在各种网络环境下都能保持连接。 3. **传输协议**:为了保证跨平台兼容性和在网络条件差的情况下...
在客户端,使用 Socket.IO.min.js 可以轻松地建立 WebSocket 连接,并进行实时数据传输。 应用场景: Socket.IO 在以下场景中特别有用: 实时通信应用程序: 如聊天应用、在线游戏、协作工具等,需要即时更新和...
基于 WebSocket 协议,Socket.IO 提供了更高级别的接口,能够处理各种网络条件下的连接问题,确保数据的可靠传输。在这个“基于socket.io聊天室功能”的项目中,我们将探讨如何使用 Socket.IO 构建一个简单的聊天室...
Vue-Socket.io, vuejs的socket.io 实现 Vue-Socket.io Vuejs 2和Vuex的socket.io 实现安装npm install vue-socket.io --save用法配置从URL字符串自动连接import V
session.socket.io, 在 socket.io 中,表示/连接会话 session.socket.io ( SessionSockets ) 这个小模块简化了 socket.io 使用express或者连接中间件的http会话的使用。 它没有依赖项,可以使用任何与表示或者连接...
这个名为"socket.io-mp-client-master.zip"的压缩包包含了专门为微信小程序和支付宝小程序设计的Socket.IO客户端库,名为"socket.io-mp-client"。 1. **WebSocket协议**:Socket.IO基于WebSocket协议,WebSocket是...
对于支付宝小程序,集成socket.io的过程基本类似,但需要注意的是,支付宝小程序的API有所不同,如使用`my.socketOpen`来建立连接,`my.socketSend`来发送数据,以及`my.socketClose`关闭连接等。 在实际开发中,你...
`socket.io.js`通常包含客户端的Socket.IO连接代码,而服务器端则在Express中通过`require('socket.io')`引入并配置。 **AngularJS 1.3**: AngularJS是Google维护的一个前端MVC框架,它极大地简化了单页应用(SPA)...
在这里,Node.js与Express框架结合,创建了一个轻量级的服务器,处理HTTP请求,管理socket.io连接,并协调视频流的传输。Express提供了简洁的路由和中间件系统,使得构建RESTful API变得容易。 在项目结构中,...
3. **基本使用**:一旦你有了所需的jar包,就可以在Java代码中创建Socket.IO客户端实例,连接到服务器。通常,这涉及到以下步骤: - 导入必要的库:`import io.socket.client.IO; import io.socket.client.Socket;`...
### Socket.IO API 文档知识点详解 #### 一、Socket.IO简介 Socket.IO 是一个非常流行的JavaScript库,它能够实现浏览器与服务器之间的实时双向通信。它不仅支持WebSocket协议,还能够通过其他方式(如轮询)作为回...
2. **连接与断开**:Socket.IO 提供了连接(connect)和断开(disconnect)方法,用于建立和结束与服务器的连接。连接过程可能需要处理网络状态变化和重试策略。 3. **事件监听**:Socket.IO 支持多种事件,如...
关于cookie的配置,socket.io客户端允许你在连接时发送cookies。在连接之前,你可以设置`socket.options.headers`,如下所示: ```swift socket.options.headers = ["Cookie": "your-cookie-value"] ``` 这将在...
然后,我们可以在代码中导入`io.socket:socket.io-client`包,初始化Socket.IO客户端,并连接到服务器。 以下是一个简单的Socket.IO Java客户端示例: ```java import io.socket.client.IO; import io.socket....
为了实现聊天功能,我们需要监听Socket.IO的连接和消息事件。当用户连接到服务器时,我们可以将其添加到一个名为`users`的数组中。收到新的消息时,将消息广播给所有连接的用户: ```javascript let users = []; ...