成千上万的IP地址/接口与较慢的程序性能

时间:2013-11-27 15:53:15

标签: c linux sockets network-programming

我有一台CentOS 5.9机器,为eth2设置了5000+ IP地址(次要)。 我的程序仅使用2个2个UDP套接字(1个RX,1个TX)。 当我运行应用程序时,CPU使用率几乎都是100%。 当我下拉IP地址的数量(10)时,一切都恢复正常 - 几乎没有1%的CPU使用率。

程序基本上是客户端 - 服务器应用程序。它使用非阻塞r / w和epoll_wait() 等待事件。

有人可以向我解释为什么二进制的CPU占用率如此之高,只能使用一小部分 已配置的地址。

2 个答案:

答案 0 :(得分:1)

处理数以千计的套接字需要专门的软件。大多数网络程序员天真地使用“选择”并期望能够很好地扩展到数千个套接字......但绝对不能。更加事件驱动的模型可以更好地扩展......事件是套接字上的新套接字或数据等。

对于Linux和Windows,我使用Libevent。它是一个套接字包装器,使用起来并不是很难,它可以很好地扩展到成千上万的插座。

http://libevent.org/

在这里查看网站,您可以看到对数图,显示成千上万的套接字,就好像它们是100一样。当然,如果套接字超级繁忙,那么您又回到了低性能,但是世界上大多数的插座都很安静,这就是libevent闪耀的地方。还有其他库,如ZeroMq(C#mono),libev,Boost.ASIO。

http://zeromq.org/
http://libev.schmorp.de/bench.html
http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio.html

这是我工作的超简单样本。您需要添加线程保护,但只需不到一个小时的工作量,您就可以轻松支持几千个并发连接。

http://pastebin.com/g02S2RTi

答案 1 :(得分:1)

我不认为发布的问题涉及套接字数量,而是接口上的地址数量。虽然看起来有点奇怪为什么你的程序在CPU中使用这个数字太高,但是一般地址数量会影响IP栈的性能来处理传入的数据包和传出的数据包。就像你调用send一样,并且你的套接字没有绑定时,内核需要根据目标地址确定要放入数据包的IP地址,如果这需要时间,它将显示在你的进程上下文中。

但这些仍然没有解释,我想放一个gprof将是一个好主意。