我有一个.NET 2.0服务器似乎正在运行到缩放问题,可能是由于套接字处理代码设计不佳,我正在寻找关于如何我的指导可能会重新设计它以提高性能。高性能C#服务器套接字的技巧/技巧
使用场景: 50 - 150个客户端,每个客户端的小型消息(每个10字节)的高速率(高达100秒/秒)。客户端连接是长期的 - 通常是几个小时。 (服务器是交易系统的一部分,客户端消息被聚合成组以通过更少数量的“出站”套接字连接发送给交换机,并且确认消息被发送回客户机,因为每个组由交换机处理)操作系统是Windows Server 2003,硬件是2 x 4核心X5355。
当前客户端套接字设计: A TcpListener
产生一个线程来读取客户端连接时的每个客户端套接字。线程在Socket.Receive
上阻塞,解析传入消息并将它们插入一组队列中供核心服务器逻辑处理。确认消息通过客户端套接字使用与交换端交谈的线程调用异步Socket.BeginSend
发回。
发现的问题:随着客户数量的增长(目前60-70),我们已经开始看到的间歇延迟长达数百毫秒的同时发送和从客户端接收数据/。 (我们记录每个确认消息的时间戳,并且我们可以看到在同一组中的一组ack通常以几毫秒总计出现的时间戳序列中的偶尔长时间间隔。)
总体系统CPU使用率较低( < 10%),有足够的可用RAM,核心逻辑和出站(交换)方面表现良好,所以问题似乎与面向客户端的套接字代码隔离。服务器和客户端之间有充足的网络带宽(千兆局域网),并且排除了网络或硬件层的问题。
任何建议或指向有用的资源将不胜感激。如果任何人有任何诊断或调试技巧来弄清楚到底发生了什么问题,那么这些也会很棒。
注意:我有MSDN杂志文章Winsock: Get Closer to the Wire with High-Performance Sockets in .NET,我已经浏览了Kodart的“XF.Server”组件 - 它看起来很简单。
同意了,虽然我想补充一点,即使你“排除”网络问题,我会考虑更换各种部件(特别是服务器网卡),并确保您拥有所有最新的固件和驱动程序。 – 2008-11-26 05:26:10