gpt4 book ai didi

c# - 缓存网络流

转载 作者:可可西里 更新时间:2023-11-01 02:37:45 26 4
gpt4 key购买 nike

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

18:02:18.963370 IP xxxx > yyyy.zzz: . ack 10017011 win 0

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

最佳答案

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

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

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

关于c# - 缓存网络流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5237384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com