缓存网络流

wei*_*mat 3 c# performance kernel tcp windows-7

我的 C# 程序正在通过多个套接字接收大量数据,而且我似乎遇到了 Windows 内核上的 TCP 缓存过载的问题。
这可以通过来自服务器的 tcpdump 的以下结果看出:

18:02:18.963370 IP xxxx > yyyy.zzz:。确认 10017011 赢 0

您将使用哪种数据结构/策略来缓存读取数据以避免 C# 过载?
我目前正在为一个单独的线程中的每个套接字使用一个委托,该线程在每次读取记录后调用,但这似乎是一个问题,因此我可能需要将其拆分为两个线程。
或者我应该看看在 Windows 端调整 TCP 参数?我使用的是 Windows 7。
有关于内核优化的书籍吗?
尽管整个机器的负载约为 20-25%,而最高负载内核的负载为 50-60%,但程序却变慢了,这让我感到非常震惊。

Kei*_*thS 5

在不太了解你的程序架构的情况下,我猜你的程序本身就是瓶颈。如果您的应用程序不使用后台工作程序来收集 TCP 消息并将其存储以供执行“繁重工作”的代码使用,那么您的程序正在读取现有缓冲区,然后在 TCP 缓冲区重新填充时处理它所拥有的内容. 这种恶性循环只能有一个结局;最终缓冲区将在等待您的程序完成处理上次得到的内容时溢出。

我会考虑将您的 TCP 接收重构为 ETL 类型的模型。您需要一个线程,其工作是侦听 TCP 输入,从缓冲区中提取数据并将其排入对程序其余部分可见的集合中。除了将数据从缓冲区中拉出并将原始消息推送到此队列中之外,它不应该做任何其他事情,并且它应该尽可能快地执行此操作。

将接收到的消息保存在内存中后,程序的其余部分几乎可以花费与消耗每条消息一样长的时间。您仍然必须确保不会使这个内存队列超载,但由于单个 .NET 对象可以引用高达 2GB 的内存,因此遇到麻烦的可能性要小得多。如果您正在使这个程序内队列溢出,您需要考虑提高处理效率,或者在进程的第二阶段抛出更多线程。