我有一个 .NET 2.0 服务器似乎遇到了扩展问题,可能是由于套接字处理代码的设计不佳,我正在寻找有关如何重新设计它以提高性能的指导。
使用场景:50 - 150 个客户端,每个客户端以高速率(高达 100 秒/秒)发送小消息(每条 10 字节)。客户端连接的寿命很长——通常是几个小时。 (服务器是交易系统的一部分。客户端消息被聚合成组,通过较少数量的“出站”套接字连接发送到交易所,并且当交易所处理每个组时,确认消息被发送回客户端.)操作系统是Windows Server 2003,硬件是2 x 4核X5355。
当前的客户端套接字设计: A TcpListener
当客户端连接时生成一个线程来读取每个客户端套接字。线程阻塞Socket.Receive
,解析传入消息并将它们插入到一组队列中以供核心服务器逻辑处理。使用异步方式通过客户端套接字发回确认消息Socket.BeginSend
来自与交换端对话的线程的调用。
观察到的问题:随着客户端数量的增加(现在为 60-70),我们开始看到在向客户端发送和从客户端接收数据时出现高达 100 毫秒的间歇性延迟。 (我们记录每条确认消息的时间戳,并且我们可以看到来自同一组的大量确认的时间戳序列中偶尔会出现很长的间隙,这些确认通常总共会在几毫秒内发出。)
整体系统 CPU 使用率较低(
任何有用资源的建议或指示将不胜感激。如果有人有任何诊断或调试技巧来准确找出问题所在,那也很好。
注意:我有 MSDN 杂志文章Winsock:通过 .NET 中的高性能套接字更接近线路 http://msdn2.microsoft.com/en-us/magazine/cc300760.aspx,我浏览了 Kodart“XF.Server”组件 - 它看起来充其量是粗略的。
.NET 3.5 环境中的套接字 I/O 性能得到了改进。您可以使用 ReceiveAsync/SendAsync 代替 BeginReceive/BeginSend 以获得更好的性能。检查一下:
http://msdn.microsoft.com/en-us/library/bb968780.aspx http://msdn.microsoft.com/en-us/library/bb968780.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)