项目地址 :  https://github.com/kelin-xycs/Socket-Vs-WebSocket-TestTool

Socket-Vs-WebSocket-TestTool

一个用 C# 写的 Socket 和 WebSocket 性能测试工具

这个项目不是计划内的 。 我要 呵呵 了 。 因为 QQ 群里有网友提到 “WebSocket 的效率比 Socket 低” , 所以就想看一下实际情况到底怎么样 。

解决方案 里 包含 4 个项目, SocketTest , SocketTestTool , WebSocketTest , WebSocketTestTool 。

SocketTest : Socket 测试的服务器端

SocketTestTool : Socket 并发测试工具

WebSocket : WebSocket 测试的服务器端

WebSocketTestTool : WebSocket 并发测试工具

测试原理 : 测试工具发送 2 Byte 的数据 “aa” 到 服务器端 , 服务器端收到数据后回发这 2 Byte 的数据给测试工具,测试工具接收到回发数据算一次请求完成 。 本次请求完成后才会发出下一次请求 。

测试结果 :

Socket : 每秒请求数最高可达到 25000 , CPU 占用率 : 测试工具 15% , 服务器端 22% , System进程 27%

WebSocket : 每秒请求数最高可达 7500 - 8000 , CPU 占用率 : 测试工具 30% , 服务器端 48% , System进程 7%

注 : System 进程 应该就是 Win Socket 工作线程所在的进程 。

从这组测试数据看起来 , WebSocket 的效率大概是 Socket 的 1/3 - 1/4 之间 。

有一个现象值得注意 : 在测试中 , Socket 组 的 CPU 占用率普遍低于 WebSocket 组 , 还有一点 , Socket 测试中 CPU 占用率最高的是 System 进程 , 而 WebSocket 测试中 CPU 占用率 最高的是 服务器端 进程 , 并且 System 进程的 CPU 占用率 最低 和 很低 。

好的 , 上面是测试结果 。

下面对 测试工具 和 服务器端 程序作一些说明 :

WebSocketTest.exe 需要 “以管理员身份运行” , 不然会报 “拒绝访问” 的异常 。

测试工具 界面上有一个 文本框 “连接数” , 默认值 是 800 。

还有一个 文本框 “线程数” , 这个文本框的默认值是 4 , “线程数” 的 意思是 用于发送测试请求 的 线程数 ,通常设定为和 CPU 的 核数 相同即可 (可以把 虚拟线程(超线程) 算进去) 。 发送请求的线程数太多的话 , 会占用过多的 CPU 资源 , 同时 测试表现 会下降 。

还有一个 文本框 “发送内容” , 默认值是 “aa” , 目前 服务器端 的 程序 写死只接收 2 Byte 的数据 , 如果要发送更长的内容 , 服务器端 程序 需要相应的作一些修改 , 不然超出 2 Byte 的数据会在 Socket 和 WebSocket 的 缓冲区 里 堆积 起来 。

这次还发现了一些有趣的东西 :

async await 有些鸡肋 。 Thread , Monitor , Task , Task.Wait() 可以很好的完成 异步工作 。 async await 增加了 语言 的 复杂性 和 目标代码 的 复杂性 。 希望通过 async 一个 关键字 就能使一个 普通方法 变成 异步方法 , 这个想法很好 。 通过 await 来完成 等待异步调用 的 设计也很好 。 但 async 和 await 两者 应该可以单独使用 , 彼此之间不必有关联 。 这样的话 , 用 async 关键字就可以很容易的使一个方法变成 异步方法 , 而用 await 也可以很方便的 等待 异步方法 的 调用 。 两者之间不必有什么关联 。 实际上 , async await 要解决的 ,或者说 适合解决 的 一个场景 是 AJAX 里 充满异步调用 的 场景 。 在 AJAX 里 , 几乎每个事件都有 异步调用 , 每个 事件函数 都 对应 回调函数 , 只要有和服务器的交互的话 。 async await 可以来解决这样的场景 。 让 AJAX 事件函数里访问服务器的 WebApi 和 后端代码里访问 数据库 一样 , 同步执行 , 顺序执行 。 但 async await 之间不必有关联 。 实际上 , async 方法里 必须 有 await 正是 async await 的 败笔 所在 。

从这个项目中 , 我们再次体会到 , 测试 是 一个 专业 , 是 和 开发 不可分割 的 一部分 , 和 开发 一起组成 软件生产力 。 测试 是 DevOps 的 主干力量 。

Socket-Vs-WebSocket-TestTool的更多相关文章

  1. C# Socket 实现WebSocket服务器端

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  2. TCP UDP socket http webSocket 之间的关系

    ---恢复内容开始--- OSI&TCP/IP模型 要弄清tcp udp socket http websocket之间的关系,首先要知道经典的OSI七层模型,与之对应的是TCP/IP的四层模 ...

  3. Socket与WebSocket以及http与https重新总结

    Socket与WebSocket以及http与https重新总结 一.Socket 网络中的Socket是一个抽象的接口 ,而是为了方便使用TCP或UDP而抽象出来的一层 ,可以理解为网络中连接的两端 ...

  4. Http、Socket、WebSocket之间联系与区别

    WebSocket和Socket区别 可以把WebSocket想象成HTTP(应用层),HTTP和Socket什么关系,WebSocket和Socket就是什么关系. HTTP 协议有一个缺陷:通信只 ...

  5. Hosting socket.io WebSocket apps in IIS using iisnode

    In this post I explain how to configure a socket.io node.js application to use of WebSockets when ho ...

  6. PHP Socket实现websocket(一)基本函数介绍

    WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). 一开始的握手需要借助HTTP请求完成. WebSocket是基于TCP来实 ...

  7. Socket 与 WebSocket

    本文转载自:http://zengrong.net/post/2199.htm 1. 概述 选择了 WebSocket 技术之后,不可避免的,我要将它和其他协议以及技术做一下比较.最常见的,就是需要比 ...

  8. 9、socket.io,websocket 前后端实时通信,(聊天室的实现)

    websocket 一种通信协议 ajax/jsonp 单工通信 websocket 全双工通信 性能高 速度快 2种方式: 1.前端的websocket 2.后端的 socket.io 一.后端so ...

  9. socket.io websocket

    不能不知道的事: 在Http协议中,客户端向服务器端发送请求,服务器端收到请求再进行回应,整个过程中,服务器端是被动方,客户端是主动方: websoket是H5的一种基于TCP的新通信协议,它与Htt ...

  10. socket、WebSocket

    WebSocket 协议本质上是一个基于TCP的协议,它由通信协议和编程API组成,WebSocket能够在浏览器和服务器之间建立双向连接,以基于事件的方式,赋予浏览器实时通信能力. socket本质 ...

随机推荐

  1. 关于初级dp的一些记忆

    01背包和数塔都是寒假看的,数塔还算明白,但01背包虽然会做其实也是背下来的,一直不是很清楚它的可行性,昨天老师讲了以后恍然大悟,和数塔类似生成了一颗二叉树: 利用数组/dfs  自下而上/自上而下 ...

  2. POJ-3894 迷宫问题 (BFS+路径还原)

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  3. Spark任务提交底层原理

    Driver的任务提交过程 1.Driver程序的代码运行到action操作,触发了SparkContext的runJob方法.2.SparkContext调用DAGScheduler的runJob函 ...

  4. 共享内存创建shmget控制操作shmat,shmctl

    1.共享内存的数据结构 共享内存就是分配一块能被其他进程访问的内存.每个共享内存段在内核中维护着一个内部结构: struct shmid_ds { struct ipc_perm shm_perm; ...

  5. linux-网络使用

    linux网络的基本使用 "ifconfig" 查看已经被激活的网卡详细信息 "ifconfig eth0" 查看特定的网卡信息 [root@ssgao ~]# ...

  6. Get gcc built-in macros using command gcc -dM -E - < /dev/null

    root@vmuser-virtual-machine:/home/vmuser# gcc -dM -E - < /dev/null #define __SSP_STRONG__ 3#defin ...

  7. SQL Server 调优系列基础篇 - 并行运算总结(二)

    前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版 ...

  8. NETGEAR WNDR3800CH openwrt 不能用新版, Barrier Breaker 14.07

    15系列主要是不能正常端口映射,这个很不方便了. 尽管80端口被封了,我们可以用别的端口啊. 刷完以后,不懂英文的,跟着下面的步骤就可以进入中文环境了. 记得先上网,再通过路由下载安装中文包,才可以. ...

  9. hibernate缓存清除(转)

    文章有点杂,这不是原文,谢谢贡献者 http://www.360doc.com/content/16/0413/16/32415095_550307388.shtml 一.hibernate一级缓存( ...

  10. webservice之wsdl

    最近项目中需要将原来的通信协议改成webservice,由于业务需要,我们需要向server端传送数据,故server方提供给我们一个.wsdl文件,内容如下: WSDL即Web Services D ...