项目地址 :  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. 『cs231n』循环神经网络RNN

    循环神经网络 循环神经网络介绍摘抄自莫凡博士的教程 序列数据 我们想象现在有一组序列数据 data 0,1,2,3. 在当预测 result0 的时候,我们基于的是 data0, 同样在预测其他数据的 ...

  2. zzuli 1432(二进制特点)

      1432: 背包again Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 65 SubmitStatusWeb Board ...

  3. Android studio jni

    首先我们要明确几个概念,jni,ndk,共享库(.so). jni是java native interface的缩写,java 本地接口.它提供了若干的API实现了Java和其他语言的通信(主要是C/ ...

  4. 贪心(二)NYOJ14题

    #include <iostream> #include<cmath> #include "algorithm" using namespace std; ...

  5. JavaScript 对象的使用

    JavaScript支持面向对象的编程方法. 2.9.1 window对象(窗口对象)的常用方法 内部函数 alert ( ) ,实际上是 window 对象的方法,写成全称为 window . al ...

  6. EBS标准的查看供应商地址

    --获取供应商PARTY_ID SELECT * FROM HZ_PARTIES HP WHERE HP.PARTY_NAME='XXXXXX' VO数据源:oracle.apps.pos.suppl ...

  7. 常用OS获取信息命令

    一.linux#CPU信息(总核心数和型号) cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c #物理CPU数及每颗物理CPU中核心数(可能有 ...

  8. Awk 从入门到放弃(2)– 分隔符 学习笔记

    转:http://www.zsythink.net/archives/1336 学习输入分隔符FS及输出分隔符OFS 通过-v 修改内置的变量,在$1 $2 之间不指定 ‘,’, 会做合并输出.

  9. Drawing house

    截图如下: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  10. ios下 animation-play-state不起作用

    这个问题在 做H5音频播放的时候 困扰了好久,PC端一切正常,单单 移动端 出现各种杂乱的问题,也是醉了. 后来经过大量的检索,发现了一种方案很不错: 请看案例   原  创 完全兼容,各个设备,很不 ...