如何在Linux中创建大量(我指的是大量)套接字? 我尝试用不同的语言(C++,java,C++,PHP)创建一个简单的程序,连接到服务器,所有的行为都是相同的。所以我相信这个问题更多的是操作系统级别的问题

如何在Linux中创建大量(我指的是大量)套接字? 我尝试用不同的语言(C++,java,C++,PHP)创建一个简单的程序,连接到服务器,所有的行为都是相同的。所以我相信这个问题更多的是操作系统级别的问题,linux,networking,sockets,tcp,Linux,Networking,Sockets,Tcp,基本上,我希望程序通过TCP套接字连接到服务器,发送1个字节,然后关闭套接字。这需要每秒进行数千次,并持续一段时间。这是为了对服务器进行基准测试 到目前为止,在数千个客户端套接字之后,系统完全停止。它只能在冷却一分钟左右后开始创建套接字。我已确保在传输后关闭每个插座 现在,类似Apache这样的服务器已经很熟悉这种问题,建议实用程序(如ab/Sakee)使用keep-alive协议对Apache进行基准测试。也就是说,创建少量TCP连接,但出于基准测试目的通过它们发出多个请求。但是,在我们的情况

基本上,我希望程序通过TCP套接字连接到服务器,发送1个字节,然后关闭套接字。这需要每秒进行数千次,并持续一段时间。这是为了对服务器进行基准测试

到目前为止,在数千个客户端套接字之后,系统完全停止。它只能在冷却一分钟左右后开始创建套接字。我已确保在传输后关闭每个插座

现在,类似Apache这样的服务器已经很熟悉这种问题,建议实用程序(如ab/Sakee)使用keep-alive协议对Apache进行基准测试。也就是说,创建少量TCP连接,但出于基准测试目的通过它们发出多个请求。但是,在我们的情况下,这是不可能的,因为我们的专有服务器不提供HTTP服务,也不支持HTTP 1.1保持活动模式

那么如何才能做到这一点呢?我已经检查了以下限制

  • ulimit
    设置为非常高的数字
  • 通过将
    /proc/sys/net/ipv4/TCP\u rw\u recycle
    /proc/sys/net/ipv4/TCP\u rw\u reuse
    设置为1,可以消除
    TCP TIME\u WAIT
    。(我确实与
    netstat
    确认没有
    TIME\u WAIT
    sockets)
  • 这与线程/进程的数量限制无关。我已经尝试重新启动我的客户端应用程序,但结果是一样的。一旦操作系统拒绝新的套接字,就没有任何帮助
  • 注:这不是服务器端限制。我们通过购买另一个盒子并在第一个盒子拒绝制作新的套接字时在上面运行相同的客户机代码来测试这一点。服务器处理得很好。我们不想买5-10盒,然后在它们之间轮换来解决这个问题


    OS:Fedora 10 Linux 2.6.24-23-xen#1 SMP

    老笑话:男人去看医生,说“医生,我这样做很疼”,把他的手臂扭到一个奇怪的位置

    医生回答说:“好吧,别那么做!”

    听着,你所做的是一个非常不自然的过程。建立TCP连接需要握手,每个消息传输的字节远远超过一个字节。设置和拆卸时间将非常重要。很可能您正在做的是耗尽与握手相关的内核资源;果不其然,如果你不去管它,不再打它,它最终会追上你


    那么,你到底想测量什么?你到底想干什么?如果你真的想一次发送一个字节——上帝禁止——至少考虑使用udp;没有糟糕的设置/拆卸。与开销相比,它仍然非常低效——即使是UDP数据包也需要大约20个字节的帧——但它更好。

    连接然后发送1个字节不是任何东西的基准,除了TCP协议本身。正如查理·马丁(Charlie Martin)在上文中所说,大部分时间都浪费在连接然后断开插座上


    我知道你想做基准测试,但这真的能很好地体现你的应用程序的功能吗?您真的要设置一个连接来发送1个字节吗?

    端口是否可能用完了?除非您愿意在循环中调用bind()以查找下一个可用端口,否则只能获得5000-1024个端口

    端口为0的bind()返回1024-5000范围内的空闲端口。具有指定端口的bind()将获取该端口(如果可用)

    int bindnextport(int s, struct sockaddr sa)  
    {  
       static int nextport = 1025;  
       int lastport;  
       lastport = nextport;  
       do {  
          sa.sa_data[0] = nextport >> 8;  
          sa.sa_data[1] = nextport & 255;  
          if (!bind(s, &sa, sizeof(sa))  
             return 0;  
          ++nextport;  
          if (nextport >= 65536) nextport = 1024;  
       } while (lastport != nextport);  
       return 1;  
    }
    

    http服务器声称能够保持10000个非活动http保持活动连接。你可以看看它们是怎样的。

    你是否尝试过设置标志以便在插座上重新使用EADDR?

    看看Richard Jones的文章。这是关于在Erlang中实现Comet应用程序的,但“将其增加到100万”一节描述了他如何对服务器进行基准测试;它以语句“从一台主机创建一百万个tcp连接是不平凡的”开头。这应该让您了解您的目的。

    一旦无法打开任何新套接字,您在netstat中会看到什么/do/you?客户端是否拒绝创建套接字,或者连接?我觉得必须有一些sysctl旋钮才能将5000更改为不同的值,但我不知道它可能是什么…/proc/sys/net/ipv4/ip_local_port_range,参见“5000”,你的意思是“65535”,或者什么?他似乎想对连接建立时间进行基准测试——如果与其他检查吞吐量的测试结合起来,这可能是一个有效的基准。哇,这篇文章真是太棒了。谢谢