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的更多相关文章
随机推荐
- (转载)-关于sg函数的理解
最近学习了nim博弈,但是始终无法理解sg函数为什么sg[S]=mex(sg[S'] | S->S'),看到一篇博文解释的不错,截取了需要的几章节. 四.Sprague-Grundy数的提出 我 ...
- OC 类的本质和分类
一.分类 (一)分类的基本知识 概念:Category 分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件结构图: 在分类中添加一 ...
- Splunk Enterprise architecture——转发器本质上是日志收集client附加负载均衡,indexer是分布式索引,外加一个集中式管理协调的中心节点
Splunk Enterprise architecture and processes This topic discusses the internal architecture and proc ...
- React脚手架create-react-app+elementUI使用
一.介绍 1.create-react-app是FaceBook官方发布了一个无需配置的.用于快速构建开发环境的脚手架工具. 2.优点 a.无需配置:官方的配置堪称完美,几乎不用你再配置任何东西,就可 ...
- Python中变量、赋值、浅拷贝、深拷贝
https://www.cnblogs.com/LetMe/p/6724555.html 在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的: 变量的类型是分值引用与地址引用 ...
- struts2.1.6 action 01
目录(?)[-] 安装与设置 HelloWorld 常见问题 Action struts 官网下载 http://www.apache.org/ http://struts.apache.org/ ...
- 团队作业之现场UML设计
项目UML设计(团队) 团队信息 团队名:第三视角 各成员学号及姓名 姓名 学号 博客链接 张扬(组长) 031602345 http://www.cnblogs.com/sxZhangYang/p/ ...
- 未能加载文件或程序集“Microsoft.Office.Interop.Excel
解决方法:未能加载文件或程序集“Microsoft.Office.Interop.Excel...” 2010-07-25 08:06:15 来源:源码之家 站长整理 [大 中 小] ...
- spring集成redis——主从配置以及哨兵监控
Redis主从模式配置: Redis的主从模式配置是非常简单的,首先我们需要有2个可运行的redis环境: master node : 192.168.56.101 8887 slave node: ...
- Giter Link
Giter Link Anton Chen https://github.com/antonchen Bear Zheng https://github.com/bearzlh Mac Directo ...