websocket 70K连接测试




最近使用socket.io做了一个实时应用,实时性、稳定性还是很让人满意的。如果拿socket.io来做小型应用,综合效率应该是最高的。但是网上少有socket.io做大量连接测试的案例,这是比较让人担心的一点,socket.io是否适合做具有大量连接场景的需求呢?Trello其实就是用socket.io来处理实时通信的,而且trello目前已经有数百万的用户了,所以从这点看,socket.io的规模应用应该还是可行了。

为了以防万一,我想拿websocket(([https://github.com/websockets/ws][1])) 做后备应用,并且找到了国外网友的测试代码,我稍微改了下,代码比较简单,自己写一份也可以,但对于了解一台普通的PC能够支撑的连接数量,已经够了。测试的结果也比较满意,以后可以放心用websocket来做应用了。

测试的内容包括:

  • win7测试
  • win7修改PC最大连接数
  • ubuntu14.04测试
  • ubuntu14.04修改最大连接数

1. 代码说明

服务端代码功能:
  • 接收连接,连接到来时计数器加1
  • 连接断开时,计数器减1
  • 在定时器中打印系统资源占用状态
客户端代码功能:
  • 循环建立10K(或20K)连接【建议10K,数量过大时,成功连接的数量可能会比较小,所以小批量,多个实例】
  • 连接建立时,将连接压入数组
  • 连接断开时,将连接移出数组
  • 在定时器中打印连接数量
  • 每个连接建立时,发送一定的消息到server【如果消息发送量过大,注意修改server的接收缓冲区大小
  • 建立client代码的副本,方便修改连接数。【不管是windows还是linux环境,建议使用多个client副本,以方便调整连接数

2. win7测试

在win7中测试时,如果不修改win7的注册表连接限制,server只能接收13K左右的连接,再继续建立连接时,就会报event.js的错误

3. win7修改PC最大连接数

步骤:

  • 打开注册表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,
  • 新建一个名为MaxUserPort的键,设置其值为65534
  • 再新建一个名为TcpTimedWaitDelay的键,设置其值为50

保存,然后重新运行client连接,可以发现已经可以突破默认的限制了。我只加到了30K连接,没有再继续加多。【在linux服务测试中,需要win7有足够的连接。】

注意:如果注册表中找不到需要的键值,自己新建

4. ubuntu14.04测试

测试条件:

  • 我的ubuntu14.04运行在visualBox中,最开始分配的内存是2G。
  • 我一开始就修改了ubuntu的file限制,将上限改成了500,000
  • 直接把win7下的测试代码拷贝到linux中运行,开启多个client实例。

测试现象:

  • 当建立大约4oK连接时,连接数停留在这里了。查看linux file数量,发现已经到500000,再次修改file限制,改为1,000,000
  • 在ubuntu中启动的连接数达到45K左右时,继续在ubuntu中开启client实例,不能够继续建立连接了。(此时开始在win7中建立到ubunut的连接)
  • 在win7中开启client连接,当建立连接数达到55K左右时,server总是被linux Killed。此时,我关闭了虚拟机,调整虚拟机的分配内存为3GB,再次开始测试。
  • 继续在win7中开启client,我一共开启了3个实例,共30K连接。ubuntu中开启了4个实例(20K一个,10K3个,只能保持45K左右的连接),ubuntu内存占用大概1.2GB,此时建立的连接数达到了75K。

    5. ubuntu14.04修改最大连接数

    步骤

  • 配置 /etc/security/limits.conf,文件尾追加

    • hard nofile 1000000
    • soft nofile 1000000
  • 编辑/etc/pam.d/common-session

    加入一行

    session required pam_limits.so

  • 编辑/etc/profile,加入

    ulimit -SHn 51200

注意:我没有调整linux内存方面的设置,仅仅只是调整了分配给虚拟机的内存

websocket 70K连接测试的更多相关文章

  1. websocket 连接测试端口服务是否正常代码

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 使用四种框架分别实现百万websocket常连接的服务器

    著名的 C10K 问题提出的时候, 正是 2001 年.这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务这个问题,当时因为硬件和软件的**,单机1万还是一个非常值 ...

  3. 实现单台测试机6万websocket长连接

    本文由作者郑银燕授权网易云社区发布. 本文是我在测试过程中的记录,实现了单台测试机发起最大的websocket长连接数.在一台测试机上,连接到一个远程服务时的本地端口是有限的.根据TCP/IP协议,由 ...

  4. 使用四种框架分别实现百万websocket常连接的服务器--转

    原文地址:http://colobu.com/2015/05/22/implement-C1000K-servers-by-spray-netty-undertow-and-node-js/#Nett ...

  5. Spring+Stomp+ActiveMq实现websocket长连接

    stomp.js+spring+sockjs+activemq实现websocket长连接,使用java配置. pom.xml(只列出除了spring基本依赖意外的依赖,spring-version为 ...

  6. 雨露均沾的OkHttp—WebSocket长连接的使用&源码解析

    前言 最近老板又来新需求了,要做一个物联网相关的app,其中有个需求是客户端需要收发服务器不定期发出的消息. 内心OS:

  7. Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试

    Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试一.下载相关安装包 1.下载nginx最新版本(nginx1.3.13版之后才支持websocket协议) 下载地址 ...

  8. 【Centos】Postgresql连接测试(Perl和Ruby)

    Centos安装了PostgreSQL之后,将考虑如何让Perl与Ruby连接它. Perl连接方式 1,安装Perl的数据库连接包 perl-DBD-Pg perl-DBI yum install ...

  9. 当web应用包含了websocket长连接,如何在web应用前加一层nginx转发

    1 通过在web应用的前面加一层nginx ,可以实现一台主机部署多个应用,每个应用都可以用不同的域名去访问,并且端口都是80 2 nignx 转发websocket长连接 1 每个web应用,他们运 ...

随机推荐

  1. 3.ubuntu如何安装搜狗输入法

    1.http://blog.csdn.net/qq_21792169/article/details/53152700 2.http://jingyan.baidu.com/article/54b6b ...

  2. Ext TabPanel tabbar添加按钮

    tabPanel tabbar添加按钮 this.tabPanel = Ext.create('Ext.tab.Panel', { tabBar:{ items:[{ //组件靠右 xtype: 't ...

  3. Vijos 1025 小飞侠的游园方案 0-1背包

    描述 经过抽签选择,小智将军第一个进入考场. 菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!! 小智:--(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么 ...

  4. 最长非降子序列的O(n^2)解法

    这次我们来讲解一个叫做"最长非下降子序列"的问题及他的O(n^2)解法. 首先我们来描述一下什么是"最长非下降子序列". 给你一个长度为n的数组a,在数组a中顺 ...

  5. golang路上的小学生系列--使用reflect查找package路径

    本文同时发布在个人博客chinazt.cc 和 gitbook 今日看到了一个有趣的golang项目--kolpa(https://github.com/malisit/kolpa). 这个项目可以用 ...

  6. 仿网易新闻app下拉标签选择菜单

    仿网易新闻app下拉标签选择菜单 仿网易新闻app下拉标签选择菜单,长按拖动排序,点击增删标签控件 ##示例  ##EasyTagDragView的使用 在layout布局里添加:  

  7. 原生js数组

     forEach()遍历:在原来数组上进行操作 var arrF = [2,3,4]; var arrS = arrF.forEach(function (value,index,a) { //val ...

  8. js字符串与数组的相互转换

    一.数组转字符串,通过join()拼接数组元素 var a, b,c; a = new Array(a,b,c,d,e); b = a.join('-'); c = a.join('');consol ...

  9. 虚拟机配置静态IP地址

    使用VMware配置虚拟机静态IP地址 一.安装好虚拟后在菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择Vmnet8 Net网络连接方式,随意设置子网IP,点击NAT设置页面,查看子 ...

  10. Liunx上传下载和压缩问题分享

    昨天紧急需求需要测试,开发远程发了个包需要部署到生产环境.我通过FileZila连接到服务器,然后把补丁包发送到服务器对应路径,通过CRT操作,进行包的解压.重启. 同时,为了配合开发定位问题,需要从 ...