当前位置:  开发笔记 > 编程语言 > 正文

如何在Linux中创建很多(我的意思是很多)套接字?

如何解决《如何在Linux中创建很多(我的意思是很多)套接字?》经验,为你挑选了3个好方法。

我试图用不同的语言(C#,Java,C++,PHP)创建一个简单的程序来连接服务器,所有程序都以相同的方式运行.所以我认为这个问题更像是OS级别的问题.

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

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

现在,这类问题熟悉像Apache这样的服务器,其中建议使用实用程序(如ab/siege)使用keep-alive协议对Apache进行基准测试.即,创建少量TCP连接但通过它们发出多个请求以用于基准测试.然而,在我们的情况下这是不可能的,因为我们的专有服务器不提供HTTP并且不支持HTTP 1.1 keep-alive模型.

那怎么能实现呢?我检查了以下限制

    ulimit 被设置为非常高的数字

    TCP TIME_WAIT通过设置/proc/sys/net/ipv4/tcp_rw_recycle/proc/sys/net/ipv4/tcp_rw_reuse1 消除(我确实netstat没有TIME_WAIT插座确认)

    这与线程/进程数量的限制无关.我尝试重新启动我的客户端应用程序,它是相同的.一旦操作系统拒绝新的套接字,没有什么可以帮助.

PS.这不是服务器端限制.我们通过购买另一个盒子并在第一个客户端盒子拒绝制作新套接字时在其上运行相同的客户端代码来测试这个.服务器处理得很好.我们不想购买5-10个盒子并在它们之间旋转以克服这个问题.

操作系统:Fedora 10 Linux 2.6.24-23-xen#1 SMP



1> Charlie Mart..:

老笑话:男人去看病,说:"医生,我这样做,当它伤害这个,"扭他的胳膊成一个奇怪的位置.

医生回答说:"好吧,不要那样!"

看,你正在做的是一个非常不自然的过程.建立TCP连接需要握手,发送的字节远远超过每个消息的一个字节.设置和拆卸时间将非常重要.您正在做的事情很可能是使用与该握手相关联的内核资源; 果然,如果你随后让它单独停止拍打它,它最终会赶上来.

那么,你真正想要衡量的是什么?你真的想做什么?如果你真的想一次发送一个字节 - 上帝禁止 - 至少考虑使用udp; 没有可怕的设置/拆解.与开销相比,它仍然是非常低效的 - 即使UDP数据包需要20字节的框架 - 但它更好.



2> kquinn..:

看看Richard Jones的文章,Mochiweb的A Million-user Comet Application,第3部分.它是关于在Erlang中实现一个Comet应用程序,但是"将其提高到一百万"部分描述了他如何对他的服务器进行基准测试; 它打开时声明"从一个主机创建一百万个TCP连接是非常重要的".这应该会让你知道你在做什么.



3> justinhj..:

您是否尝试在套接字上设置标志SO_REUSEADDR?

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有