2010-11-22 2 views
2

대부분의 경우 응용 프로그램은 필요한 배율로 수행하기 위해 몇 대의 컴퓨터를 사용해야합니다. 기본 응용 프로그램 (마스터)은 다른 컴퓨터에 연결하여 작업자 프로세스를 실행합니다. 컴퓨터는 네트워크에 연결될 것으로 예상되지만 실제 연결은 순수한 이더넷을 통해 이루어질 수 있으며 별도의 인터넷을 통해 연결될 수 있습니다. 실행하는 동안 많은 메시지가 마스터와 각 작업자 프로세스간에 전송됩니다. 문제는 코드의 여러 부분에서 메시지를 보낼 수 있으며 사용자 정의 된 코드도 가능하다는 것입니다. 메시지 크기와 빈도를 예측하는 것은 불가능합니다. 사용자는 자신의 요구에 충분히 강한 네트워크를 연결할 것으로 예상되지만 가능한 한 성능을 최적화하려고합니다.성능을 위해 분산 응용 프로그램의 대기열 및 네트워크 메시지 버퍼링을 최적화하는 방법은 무엇입니까?

응용 프로그램의 모든 부분은 동일한 통신 모듈 API를 사용하여 메시지를 보냅니다.

내 질문에 : 너무 많은 별도의 작은 메시지를 자주 보내는 것과 관련하여 네트워크/인터넷 성능 문제가 있습니까? 이 경우, 통신 모듈이 여러 개의 메시지를 모아 하나의 큰 메시지로 보내야합니까? 큰 메시지를 작은 메시지로 나누어야합니까? 성능 문제를 일으킬 수있는 정확한 빈도와 크기는 무엇입니까 (네트워크/인터넷 성능을 의미합니까)? OS/하드웨어가이 모든 작업을 자동으로 수행합니까? 모듈이 그것을해야한다면, 저와 도울 수있는 C++ 라이브러리가 있습니까? (상업적 사용이 가능한 오픈 소스가 바람직 함) 메시지를 수집하는 것이 바람직하므로 대부분의 메시지는 프로세스가 요청할 때 바로 전송되지 않지만 나중에는 요청합니다. 메시지를 보낼 메시지를 보내는 응용 프로그램에서 메시지를 지연시킬 수있는 코드를 요구할 수 있습니다 (요구 사항을 방해하지 않고). 대부분의 메시지는 몇 초 지연 될 염려가 없습니다.

분명히 네트워크 구현에 대한 배경 지식이 많지는 않지만 분명히 사용해야 할 API가 있으면 모든 메시지가 성공해야한다는 것을 분명히해야한다는 것을 알고 있습니다. 실패하면 응용 프로그램을 중지하고 사용자에게 알립니다. 복구가 불가능합니다.

+0

프로그램이 TCP를 통해 통신합니까? UDP? 다른 것? –

+5

LBM (Latency Busters Messaging)을 사용 해본 적이 있습니까? –

+0

@Jeremy Friesner - 통신 모듈을 다시 설계해야하기 때문에 사용할 수있는 기능을 파악하려고합니다. 대기 시간은 큰 문제는 아니지만 대부분의 메시지는 몇 초 내에 도달해야합니다. 문제는 많은 양의 메시지 일 수 있습니다. 어떤 경우 든 메시지가 목적지에 도달 할 것을 보장하는 모듈을 기반으로 할 것이고, 나는 UDP를 직접 사용하지 않을 것이다. – itaj

답변

0

에 따라 다릅니다. 일반적으로 많은 작은 메시지를 보낼 때보다 큰 메시지를 보낼 때 네트워크 계층에서 오버 헤드가 더 커집니다. 대기 시간 (latency)은 또한 윈도 윙 (windowing) 때문에 더 작은 데이터 그램의 오버 헤드를 악화시킨다. 이것은 WAN 환경에서 더 많은 문제입니다.

많은 변수가 있기 때문에 특정 환경에서 몇 가지 소규모 테스트를 수행해야하며 추정치를 제공하기 위해 네트워크 환경에 대한 자세한 정보가 필요합니다.

+0

여러 사용자가 서로 다른 네트워크에서 응용 프로그램을 사용하기 때문에 단일 환경 설명을 제공 할 수 없습니다. 각 환경에 맞는 최적의 메시지 크기/빈도로 응용 프로그램을 구성 할 수 있습니다. 하지만 제 질문은 주로 내 통신 모듈이 그걸 할 필요가 있는지 아니면 하드웨어/OS가 나를 위해 할 수 있느냐하는 것입니다. – itaj

0

예, 많은 작은 메시지를 자주 보내는 것과 관련된 오버 헤드가 있으며, 좋은 대역폭 사용 솔루션을 구현하는 것은 응용 프로그램에 달려 있습니다.

네트워크 트래픽을 최대한 활용하는 방법에 대한 엄격한 규정이 없으며 대부분 응용 프로그램에 따라 다릅니다. 게임 개발에서 우리는 자주 작은 패킷을 많이 보내는 경향이 있으므로, 우리는 최대 페이로드 크기까지 패킷에 추가하려고 시도합니다. 이것은 우리가 좋은 대역폭 활용을 보장합니다.

최대 페이로드 크기는 무엇입니까? 엄지 손가락의 좋은 규칙은 네트워크 MTU를 가져 와서 프로토콜 헤더와 재 조립에 필요한 오버 헤드를 빼는 것입니다. 이들은 사용자 환경에 특정한 변수입니다.

여기서 트레이드 오프가 있습니다. 최대 페이로드 크기까지 채울 때까지 영원히 기다릴 수 없으므로 버퍼가 애플리케이션 성능에 적합한 시간 내에 플러시되어야하고 사용자의 대기 시간 인식 .

+0

좋아요. 그렇다면 모든 메시지 발신자가 사용하는 API는 무엇입니까? 메시지를 지연시킬 수있는 최대 시간을 지정해야합니까? 직접 모듈을 구현 했습니까? 아니면 게시 된 모듈 (C++)에 대한 제안 사항이 있습니까? – itaj

+0

플랫폼에 따라 다릅니다. 일부 플랫폼 SDK는 기능을 제공하지만 다른 SDK는 제공하지 않습니다. 게임 개발을위한 훌륭한 오픈 소스 라이브러리는 enet (http://enet.bespin.org/)이지만 신뢰할 수있는 UDP 구현과 같이 필요한 것 이상을 제공합니다. 또한 게임 개발에 많은 도움이됩니다. 거기에는 다른 많은 라이브러리가 있지만 소켓을 사용하여 API를 롤링하는 것은 그리 어렵지 않습니다. – Paul

0

메시지 버스는입니다. 첫째, 이러한 유형의 설치 (메시징 버스)에서 발견 할 수있는 메트릭은 소금으로 막아야합니다. 특정 솔루션을 사용하고 특정 환경에서 가능한 능력을 먼저 테스트해야합니다. 상자 밖으로 당신에게 메시지 버스를 줄 것이다 OS 제품으로

, 여기에 몇 가지 :

  1. ZeroMQ
  2. AMQP (레드햇은 구현이)

모두를 위의 MQ는 MQ 기반입니다.

  1. OpenDDS (이것은 더 단단한 구현)

위의 장점은 전체 버스를 제공하고, 응용 프로그램이 단순히 생산 및 "메시지"를 소비한다는 것이다. (TCP/UDP 등) 조정할 때까지 낮은 수준의 물건 (직렬화, "큐", "라우팅"등)에 대해 걱정할 필요가 없습니다. 귀하의 요구 사항에 전적으로 달려 있다고 생각하십니까? 지연을 처리 할 수 ​​있습니까? 아니면 대기 시간이 짧아야합니까?이 모든 것들에 대한 빠르고 명확한 답변은 없습니다. 모두가 실험에 ...

원한다면 자신의 롤을 올리거나, boost :: asio, google 프로토콜 버퍼와 자신의 "라우팅"및 pub/sub 추상화 조합을 고려하십시오. 즉, 위의 OS 제품 중 하나를 테스트하십시오. RYO는 꽤 까다 롭습니다.

물론 상용 제품이 있으며 비용은 수천 달러에서 수백만 달러까지 다양합니다. :)

+0

감사합니다. 나는 OpenDDS를 점검했다. DDS QoS 옵션 LATENCY_BUDGET은 내가 찾고있는 것을하기 위해 정의 된 것 같습니다. 이는 메시지가 최대한 빨리 보내야 할 필요는 없지만 더 많은 메시지를 압축하여 효율성을 높이기 위해 어느 정도 지연 될 수 있음을 알려줍니다.그러나 3.2.15의 개발자 가이드는이 옵션이 구현되지 않았다고 말하면서 그것에 대해 제안 할 수 있습니까? OS에 관해서는, 나는 선택할 수 없다. 현재 윈도우와 리눅스 버전에서 돌아 가야하지만, OS는 기본적으로 사용자가 선택한다. – itaj

관련 문제