문제

각 서버에 연결하고 데이터를 수신하는 여러 앱 프로세스가 있습니다. 종종 연결중인 서버와 데이터를 검색하는 데이터는 프로세스간에 겹칩니다. 따라서 네트워크 전체에 걸쳐 데이터의 불필요한 복제가 많이 있으며, 필요한 것보다 더 많은 연결 (서버에 세금을 부과)이 있으며 데이터는 앱에서 메모리에 중복되게 저장됩니다.

한 가지 솔루션은 여러 앱 프로세스를 하나의 앱 프로세스로 결합하는 것입니다. 그러나 대부분의 경우 실제로 논리적으로 뚜렷하고 수년간의 작업 일 수 있습니다.

불행히도, 대기 시간은 매우 중요하며 데이터의 양은 엄청납니다. 20MB/s, 그리고 가능한 가장 짧은 지연이있는 요청 앱에 모두 제공되어야합니다).

떠오르는 솔루션은 로컬 데몬 프로세스를 코딩하는 것입니다. 앱 프로세스는 데이터를 요청합니다. 데몬은 적절한 서버에 대한 연결이 이미 존재하는지 확인하고 만들지 않은 경우를 확인합니다. 그런 다음 데이터를 검색하고 공유 메모리를 사용하여 (대기 시간 문제로 인해 소켓을 사용하지 않으면) 요청 앱에 데이터를 제공합니다.

중복 연결 만 해결하는 단기간에 더 간단한 아이디어는 UNIX 도메인 소켓을 사용하는 것입니다 (UNIX OS에서 실행되지만 가능한 경우 CrossPlatform Libs를 고수하는 것을 선호). 프로세스이므로 단일 연결을 공유합니다. 이 문제는 버퍼를 소비하는 것입니다. 모든 프로세스가 소켓 위로 올라오르는 모든 것을보고 싶습니다.이 접근 방식을 이해하면 소켓의 한 프로세스에서 읽기가 다른 프로세스에서 동일한 데이터를 보지 못하게합니다. 다음 읽기 (공유 디스크립터 내의 오프셋은 충돌됩니다).

도움이 되었습니까?

해결책

공유 메모리를 통해 데이터를 노출시키는 전용 서비스가 최선의 방법이라고 생각합니다. 이로부터 보조는 Windows가 아닌 Unix 변형을 목표로하는 것을 제외하고는 명명 된 파이프를 통해 데이터를 멀티 캐스트하는 서비스입니다.

또 다른 옵션은 UDP 멀티 캐스트이므로 데이터 복제가 하드웨어 또는 드라이버 레벨에서 발생합니다. 유일한 문제는 UDP 데이터 전달이 순서대로 보장되지 않으며 전혀 제공 할 수 없다는 것입니다.

물리적 소켓을 공유하는 것은 해킹이며 피해야한다고 생각합니다. 데몬이 투명하게 수행하기를 원하는 운전자를 구현하는 것이 좋습니다 (예 : 프로세스는 소켓이 내부적으로 소켓이 가상 소켓 간의 데이터를 다시 브로드 캐스트하기 위해 논리가 존재했던 단일 소켓.) 불행히도 올바르게 얻기위한 노력의 수준은 중요 할 것이며, 소켓을 공유하는 것이 실제로 좋은 경로는 아닙니다. 드라이버 레벨에서 또는 소켓 디스크립터 크로스 프로세스 공유와 같은 다른 해킹 수단을 통해 수행하든간에.)

소켓 공유는 또한 푸시 전용 연결이라고 가정합니다. 예를 들어 트래픽 협상은 앱 수준에서 발생하지 않습니다 (예 : 데이터 요청 또는 데이터 수신의 승인).

완료에 대한 빠른 경로는 BNC와 같은 프로젝트를보고 코드를 변환하거나 일반적인 아이디어를 납치하여 필요한 작업을 수행하는 것입니다. 로컬 소켓에 트래픽을 복제하는 것은 큰 대기 시간이 없어야하지만 모든 데이터 복제에 대한 NIC (및 관련 버퍼)를 운동하고 하드웨어의 한계에 가까워지는 경우 (또는 드라이버 및/또는 열악한 드라이버 및/또는 가난한 경우. TCP 스택 구현) 그러면 Dead Server가 발생할 수 있습니다. 내가 일하는 곳에서 우리는 데이터 복제 탱크가 드라이버 레벨에서 기가비트 에테르 카드를 보았으므로 들어 본 적이 없습니다.

공유 메모리는 플랫폼 독립적이고 성능을 유지하려는 경우 커널 또는 하드웨어/드라이버 변경으로 인해 5 년 안에 지원할 수없는 것을 소개하지 않으면 최선의 방법입니다.

다른 팁

Zeromq를 살펴 보는 것이 좋습니다. 이것은 문제를 해결하는 데 도움이 될 수 있습니다. 나는 20MB/s가 매우 높다고 생각하지 않습니다 ... Zeromq에서 TCP 전송을 사용하여 해당 수준의 처리량을 달성 할 수 있어야합니다. OpenPGM을 사용하는 신뢰할 수있는 멀티 캐스트를 포함하여 다른 전송 메커니즘에 대한 지원도 있습니다. 전송 메커니즘으로 유닉스 파이프를 추가 할 계획이 있습니다.

메시징은 아마도 공유 메모리보다 안전하고 쉬울 것입니다. 특히 공유 메모리 대신 메시징을 사용하는 경우 서버 클러스터에 응용 프로그램 구성 요소를 분할 할 수 있습니다. 이는 병목 현상의 위치에 따라 공유 메모리보다 훨씬 더 나은 성능을 제공 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top