SocketIOCP
项目地址 : https://github.com/kelin-xycs/SocketIOCP
SocketIOCP
一个 用 C# Socket 实现 的 IOCP
这是一个 用 C# Socket 实现 的 IOCP 。
采用 Listener + Dispatch + Worker 的 设计, Listener 是一个线程, Dispatch 是一个线程, Worker 是 一组线程 。 一个 Socket 对应 一个 Worker , 一个 Worker 对应一个线程 。
Listener 负责监听 Accept() , 将 Socket 放到 SocketQueue 中, Dispatch 负责 从 SocketQueue 中 取出 Socket , 为 Socket 创建一个 Worker, 并 启动 Worker 。
测试结果, 可以 达到 每秒 15000 个请求, 和 常规写法 ReceiveAsync() 是 一个水平 。 两者 的 CPU 占用率 也 差不多 : Server 进程 20% 左右, System 进程 20% 左右 , 测试工具 12% 左右 。
但是, 效率 最好的, 是 常规写法 Receive(), 就是 1 线程监听 Accept(), n 线程 Receive() ,
每秒请求 也是 15000 的 水平 , 但是 短时间内 可以 上升 到 2 万 或者 23000 。
而且,有一点 重要 的 是, CPU 占用率 更低 。 Server 进程 10% 以下, 很多时候 5% 左右 , 有时候 5% 以下 。
System 进程 30% - 40% , 有时候 超过 40% 。 测试工具 10% 左右 。
从这里 可以 看出来, 常规写法 Receive() 的 loading 主要 是 在 System 进程 上 。 我想 Socket 的 工作线程 就在 System 进程 里。
System 进程 是 系统进程 。 操作系统 的 内核工作 应该 就是在 这个 System 进程 里 。 包括 Socket 虚拟内存 等 。
从这里可以 看出来, 并发测试 的时候, System 进程 正在做 跟我们 一样 的事, SocketIOCP 相当于 在 外面 又 把 Socket 做的 事 又 做了一遍 。 ^^ 这就好像 在 裤子外面 又 套了一条裤子 , 当然 会 显得 笨重 和 更加占用 CPU 资源。
但是 反过来, 如果 从 这个角度 来看的话, SocketIOCP 能做到 现在这样, 也是 不错 了 。 ^^
SocketIOCP 的 设计, 如果用来 处理 底层 数据 的 输入输出, 也会 表现的 很出色 的 。
最终 的 这个 版本, 实际上 和 常规写法 Receive() 一样, 为 每个 Socket 分配 一个 线程 。 这和我最初 的 “用 最小数量 的 线程 来 完成 数据处理 工作” 的 想法 不太一样 。
因为 , 对于 分时 多任务 , 线程 是 最自然 的 做法 。 另一方面 , 为了 保持 实时 响应性 , 也 只能 这样 做 。
所以, 如果 我们 要写 Socket 网络应用 , 那么 可能 常规写法 Receive() 还是 最好 的 写法 。 常规写法 Receive() 参考 这篇文章 : https://blog.csdn.net/andrew_wx/article/details/6629721/
SocketIOCP的更多相关文章
随机推荐
- Hololens 开发环境配置(转)
转自 Vangos Pterneas, 4 Apr 2016 CPOL 5.00 (1 vote) vote 1vote 2vote 3vote 4vote 5 The past few days h ...
- Oracle11g温习-第六章:控制文件
2013年4月27日 星期六 10:33 .控制文件的功能和特点 1) [定义数据库当前物理状态] 2) [维护数据的一致性] 如果控制文件中的检查点与数据文件中的一致,则说明数据一致,可以启动到 ...
- turbine是怎么收集指标数据的
turbine是怎么收集指标数据的 我们通过spring cloud图形化dashboard是如何实现指标的收集展示的知道了,图形化的指标是从turbine获取到指标数据的.那么turbine的数据是 ...
- 共享内存创建shmget控制操作shmat,shmctl
1.共享内存的数据结构 共享内存就是分配一块能被其他进程访问的内存.每个共享内存段在内核中维护着一个内部结构: struct shmid_ds { struct ipc_perm shm_perm; ...
- javaScript 变量提升 var let const,以及JS 的解析阶段和执行阶段
我们先来看一道面试题,大家猜想一下,下面这段代码,打印出来的结果是什么 var name = 'World!'; (function () { if (typeof name === 'undefin ...
- 根据id来实现小程序tab切换,
本例根据绑定id来实现tab切换,但本例仍有缺陷,用for循环数据,无法实现切换.如有大神能够有更好方法,欢迎留言更正 WXML: <view class="tab"> ...
- bzoj1092
题解: 按照时间枚举一下那些点有水 然后用物理方案来计算 代码: #include<bits/stdc++.h> ,M=; int n,m,x,y,z,i,A,B,T,g[N],v[M], ...
- ehlib 安装
EhLibProjGroup110.groupproj,依次编译所有的包,再安装所有的dcl设计时包. == EhLib 7.0.133 Full Source 使用安装器EhLibInstaller ...
- CUDA ---- Shared Memory
CUDA SHARED MEMORY shared memory在之前的博文有些介绍,这部分会专门讲解其内容.在global Memory部分,数据对齐和连续是很重要的话题,当使用L1的时候,对齐问题 ...
- centos7 docker 安装showdoc
可参考 http://www.showdoc.cc/help?page_id=65610 1.下载代码,并上传服务器 https://github.com/star7th/showdoc 解压之后我的 ...