2013-11-27 3 views
3

Eth2에 대해 5000+ IP 주소 (보조)로 설정된 CentOS 5.9 시스템이 있습니다. 내 프로그램은 2 개의 UDP 소켓 (RX 1 개, TX 1 개)에만 2 개를 사용합니다. 응용 프로그램을 실행할 때 CPU 사용률은 항상 거의 100 %입니다. IP 주소 (10)의 수를 줄이면 모든 것이 정상적으로 진행됩니다. 거의 1 %의 CPU 사용량입니다.수천 개의 IP 주소/인터페이스 대 느린 프로그램 성능

기본적으로 프로그램은 클라이언트 - 서버 응용 프로그램입니다. 이벤트 대기를 위해 non blocking r/w와 epoll_wait() 을 사용합니다.

누군가가 구성 주소의 작은 부분 만을 사용하는 이진에 대해 너무 높은 CPU 사용량을 설명해 주실 수 있습니까?

+4

어쩌면 능숙하지 않은 수의 IP 주소로 구성했을 때 효율적이지 않으니까요? 하지만이 질문은 아마 StasckOverflow가 아닌 ​​ServerFault에 속해 있습니다 ... – Roddy

+1

아무런 코드없이 문제를 진단하기가 어렵습니다. – aust

+0

Roddy의 진술이 유효 할 수 있습니다. CentO는 이러한 많은 수의 주소 요청을 처리하도록 설계되지 않았을 수 있습니다. 레드햇, 우분투 서버 에디션과 같은 리눅스 버전을 사용해 보셨습니까? –

답변

1

수천 개의 소켓을 처리하는 데는 특수한 소프트웨어가 필요합니다. 대부분의 네트워크 프로그래머는 순진하게 "select"를 사용하고 수천 개의 소켓까지 확장 할 것을 기대합니다 ... 확실히 그렇지 않습니다. 더 많은 이벤트 위주의 모델은 이벤트의 새로운 소켓 또는 소켓 등의 새로운 소켓입니다.

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 

내 간단한 샘플입니다. 스레딩 보호 기능을 추가해야하지만 1 시간 미만의 작업으로 수천 개의 동시 연결을 쉽게 지원할 수 있습니다.

http://pastebin.com/g02S2RTi 
+0

OP는 '수천 개의 소켓 처리'에 대해 한 마디도 말하지 않았습니다. 그와 반대로 그는 두 개의 소켓과 수천 개의 주소를 명시 적으로 언급했습니다 * 분명히이 질문을 실제로 읽지는 않았습니다. -1 – EJP

1

게시 된 질문은 소켓 수에 대한 것이 아니라 인터페이스의 주소 수에 대한 것으로 생각됩니다. 프로그램이이 숫자로 CPU에서 너무 높게 나타나는 이유는 다소 이상하게 보일 수 있지만 일반적인 주소 수는 들어오는 패킷과 나가는 패킷을 처리 할 IP 스택의 성능에 영향을 미칩니다. send를 호출하고 소켓이 연결되어 있지 않은 것처럼, 커널은 목적지 주소를 기반으로 패킷에 넣을 IP 주소를 결정해야하며, 시간이 걸리면 프로세스 컨텍스트에 표시됩니다.

그러나 이것들은 아직 많이 설명하지 못한다. gprof를 넣는 것이 좋은 생각 일 것이다.