C#网络编程 多线程和高并发
- 在任何 TCP Server 的实现中,一定存在一个 Accept Socket Loop,用于接收 Client 端的 Connect 请求以建立 TCP Connection。
- 在任何 TCP Server 的实现中,一定存在一个 Read Socket Loop,用于接收 Client 端 Write 过来的数据。
如果 Accept 循环阻塞,则会导致无法快速的建立连接,服务端 Pending Backlog 满,进而导致 Client 端收到 Connect Timeout 的异常。如果 Read 循环阻塞,则显然会导致无法及时收到 Client 端发过来的数据,进而导致 Client 端 Send Buffer 满,无法再发送数据。
从实现细节的角度看,能够导致服务阻塞的位置可能在:
- Accept 到新的 Socket,构建新的 Connection 需要分配各种资源,分配资源慢;
- Accept 到新的 Socket,没有及时触发下一次 Accept;
- Read 到新的 Buffer,判定 Payload 消息长度,判定过程长;
- Read 到新的 Buffer,发现 Payload 还没有收全,继续 Read,则 "可能" 会导致一次 Buffer Copy;
- Payload 接收完毕,进行 De-Serialization 转成可识别的 Protocol Message,反序列化慢;
- 由 Business Module 来处理相应的 Protocol Message,处理过程慢;
1-2 涉及到 Accept 过程和 Connection 的建立过程,3-4 涉及到 ReceiveBuffer 的处理过程,5-6 涉及到应用逻辑侧的实现。
Java 中著名的 Netty 网络库从 4.0 版本开始对于 Buffer 部分做了全新的尝试,采用了名叫 ByteBuf 的设计,实现 Buffer Zero Copy 以减少高并发条件下 Buffer 拷贝带来的性能损失和 GC 压力。DotNetty,Orleans ,Helios 等项目正在尝试在 C# 中进行类似的 ByteBuf 的实现。
1 单独测试不停的有新的client连接server时:
测试方法:写个client创建软件,调用timer,每隔几秒就创建一个新的client到server之间的连接,测试时打开多个client创建软件
异步编程模式leafsoft软件所写的服务器在上百万个可时连接状态,单单只有连接没有其他数据交互时,200万、300万都没问题的,300万以上时UI界面刷新就有些吃力,而连接数目到一定程度时,此时server阻塞,无法分配新的资源给接下来的client,相当于server停止监听,此时client软件和server软件都会有异常发生,异常位置在client连接server的方法内,异常如下:
最新文章
- 修改Centos 6.5的yum源
- crossplatfrom---electron入门教程
- build.fxbuild打不开 Failed to create the part's controls
- Maximum Depth of Binary Tree
- CSS 简介
- HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)
- Wcf Client 异常和关闭的通用处理方法
- 查看mysql 的物理存储路径
- UVa 497 - Strategic Defense Initiative
- localStorage 的基本使用
- 传感器仿真平台——UI绘制模块(二)
- apache服务器中设置目录不可访问
- leetcode【sql】 Delete Duplicate Emails
- 3分钟利用TurnipBit制作电子时钟
- 【基础】26个命令玩转linux,菜鸟及面试必备
- Alpha冲刺Day12
- Android手机ROM刷机简介
- Spring boot 的application.properties 全局配置
- python变量和变量赋值的几种形式
- 通过inotify实现反调试
热门文章
- Python---Tkinter---计算器
- 【SaltStack官方版】—— states教程, part 2 - 更复杂的states和必要的事物
- Oracle RAC业务bug导致部分数据丢失处理
- 前端面试题常考&;必考之--清除浮动的方法
- spring中试用junit4测试
- 有了二叉查找树、平衡树(AVL)为啥还需要红黑树?
- 老男孩python3.5全栈开发第9期+课件笔记(1-15部全 共125天完整无加密)
- 《SQL Server 2012 T-SQL基础》读书笔记 - 10.可编程对象
- EXCEL生成随机密码函数
- (转)oracle触发器使用:after insert 与before insert的简单使用注意