我有一个.NET 2.0服务器似乎遇到了扩展问题,可能是由于套接字处理代码设计不佳,我正在寻找有关如何重新设计它以提高性能的指导.
使用场景: 50到150个客户端,每个客户端的高速率(高达100秒/秒)的小消息(每个10字节).客户端连接是长期的 - 通常是几个小时.(服务器是交易系统的一部分.客户端消息被聚合成组以通过较少数量的"出站"套接字连接发送到交换机,并且当交换机处理每个组时,确认消息被发送回客户端. .)OS是Windows Server 2003,硬件是2 x 4核X5355.
目前的客户端套接字设计:一个TcpListener产生一个线程作为客户端连接到读取每个客户端套接字.线程阻塞Socket.Receive,解析传入的消息并将它们插入到一组队列中以供核心服务器逻辑处理.使用Socket.BeginSend来自与交换机侧通信的线程的异步调用,通过客户端套接字发回确认消息.
观察到的问题:随着客户端数量的增加(现在为60-70),我们开始在向客户端发送数据和从客户端接收数据时看到间歇性延迟高达100毫秒.(我们记录每条确认消息的时间戳,我们可以看到时间戳序列中偶尔会出现长时间间隔,这些间隙来自同一组中通常在几毫秒内完成的一串ack.)
整体系统CPU使用率很低(<10%),有足够的空闲RAM,核心逻辑和出站(面向交换)端表现良好,因此问题似乎与面向客户端的套接字代码隔离开来.服务器和客户端(千兆局域网)之间有足够的网络带宽,我们排除了网络或硬件层问题.
任何有用资源的建议或指示都将不胜感激.如果有人有任何诊断或调试技巧可以确定出错的地方,那么这些技巧也会很棒.
注意:我有MSDN杂志的文章Winsock:使用.NET中的高性能套接字更接近线路,我已经浏览了Kodart"XF.Server"组件 - 它看起来很粗略.