当前位置: 首页 > 知识库问答 >
问题:

如何防止套接字/端口耗尽?

祁鸿晖
2023-03-14

然而,我遇到了一些问题。特别是带有内部异常的WebException(“无法连接到远程服务器”):

无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满127.0.0.1:52395

我正在尝试以每线程500次迭代的方式运行100个线程。

我可以使用更少的迭代和/或更少的线程来操作测试,因为看起来套接字最终会退出这个TIME_WAIT状态。但是,这不是一个解决方案,因为它没有充分测试web服务器的能力。

问题:

如何在每次线程迭代后显式关闭套接字(从客户端),以防止TIME_WAIT状态和套接字耗尽?

  public sealed class HttpGetTest : ITest {
    private readonly string m_url;

    public HttpGetTest( string url ) {          
        m_url = url;
    }

    void ITest.Execute() {
        using (WebClient webClient = new WebClient()){
            using( Stream stream = webClient.OpenRead( m_url ) ) {          
            }
        }
    }
}

ThreadWrapperClass中创建新线程的部分:

public void Execute() {
    Action Hammer = () => {
        for( int i = 1; i <= m_iterations; i++ ) {
            //Where m_test is an ITest injected through constructor
            m_test.Execute();
        }       
    };
    ThreadStart work = delegate {
        Hammer();
    };
    Thread thread = new Thread( work );
    thread.Start();
}

共有1个答案

卜飞鸣
2023-03-14

你明白time_wait的目的吗?在这段时间内,重新使用端口是不安全的,因为前一个事务中丢失的数据包(已成功重传)可能会在这段时间内交付。

您也许可以在注册表的某个地方对其进行调整,但我怀疑这是否是一个明智的下一步。

我在测试环境中创建实际负载的经验证明是非常令人沮丧的。当然,从localhost运行负载测试器是不现实的,而且我使用.NET http API进行的大多数网络测试似乎需要在客户机中进行更多的测试,而不是在服务器本身进行测试。

最后,我在.NET Http客户端API周围遇到了一些非常奇怪和意想不到的性能问题。在一天结束的时候,他们都使用HttpWebRequest来完成繁重的工作。IMO它的性能远没有达到它所能达到的水平。DNS是同步的,即使在异步调用API时也是如此(尽管如果您只从单个主机请求,这不是问题),并且在持续使用之后,CPU的使用会逐渐增加,直到客户端受到CPU的限制而不是IO的限制。如果您希望生成持续的高负载,那么任何依赖于HttpWebRequest的重请求应用程序都是一个虚假的投资。

总而言之,这是一项相当棘手的工作,而且最终,只有在野外才能证明这一点,除非你有足够的现金来购买更好的装备。

[提示:我使用异步套接字API和第三方DNS客户端库编写的自己的客户端性能好得多]

 类似资料:
  • 问题内容: 我正在学习Java套接字编程。我使用以下语句连接到网站: 当我调试应用程序并查看s的内容时,我看到: 1)我想知道此本地端口7846的来源以及确切的含义。 2)如果网站的IP地址是2.21.246.97,为什么我不能仅在浏览器的地址栏中输入2.21.246.97来连接到该网站? 谢谢 问题答案: 这是本地套接字端口号。通常由系统分配。 请参阅什么是套接字?。 在客户端:客户端知道运行服

  • 问题内容: 在Java中,可以将数字零作为Socket或DatagramSocket构造函数的单个参数。Java然后将该Socket绑定到一个空闲端口。是否可以将端口查找限制为特定范围? 问题答案: 嗯,阅读文档后,我认为您不能。您可以绑定到任何端口,然后在不可接受的情况下重新绑定,或者重复绑定到您范围内的端口,直到成功。第二种方法将是“最有效的”。 我对此回答感到不安,因为它很不雅,但我真的也找

  • 问题内容: 在我的应用中,我经常调用一个返回json字符串的外部api。 但是在某些情况下 PHP致命错误:内存中已耗尽xxx字节(尝试分配32字节)的内存大小… 我无法控制外部API,当然可以增加php的内存,但这有一些缺点。 1-无论我设置的大小,仍然可能太小。2-如果将内存大小设置为“ infinite”(无限),则可能会导致服务器被杀。 理想情况下,我想在调用json_decode(…)之

  • 开始使用akka-streams,我想构建一个简单的示例。在chrome中,使用web套接字插件,我可以通过并发送2个命令,简单地连接到这样的流https://blockchain.info/api/apiwebsocket 将在chromes web socket插件窗口中传输结果。 我试图在akka流中实现相同的功能,但面临一些问题: 执行了2个命令,但我实际上没有获得流输出 同一命令执行两次

  • 这就是我有点困惑的地方。 我在服务器端拿到的地址,有客户端连接的WiFi网络的公有地址(这是我预期的),还有一些端口号,基于我对NATs的理解,应该和客户端实际使用的端口号不一样,是用来翻译地址的。 但是,如果我在客户端上使用了getsockname()函数,则得到的端口号与服务器给出的端口号相同。

  • 终止TCP/IP连接的最佳方法是什么,该连接清理了系统上的开放套接字,但让远程方挂起。那就是我想要关闭一个插座的方式,对我来说是最低的成本,但对他们来说是最高的成本。 @尼古拉斯·威尔逊: 使用tcprepair似乎是个好主意。当套接字在TCP_REPAIR模式下关闭时,不会发送FIN或RST数据包。远程插座挂起。我要去试试看然后回去报告。下面是我的(未经测试的)代码: 只是不要关闭它。打开的插座