소켓 컨넥션 개수에 따른 성능 차이가 있을까요?
동일 호스트 상의 프로세스간 내부 통신은 메시지 큐를 사용하고,
서로 다른 호스트간 통신은 TCP 를 사용하여 개발을 하고 있습니다.
그리고, 다른 호스트들과 통신하고자 하는 모든 프로세스 (A, B) 들은
통신을 중개해 주는 통신 프로세스 (C) 에게 요청하여 외부와 송.수신을 하게 됩니다.
즉, X 호스트상의 A 프로세스가 Y 호스트상의 B 프로세스와 통신 하는 경우
다음과 같은 과정을 거치게 됩니다.
1) A -> M/Q -> C : A 가 C 에게 B 가 있는 Y 호스트로 보내도록 요청
2) X 호스트의 C -> TCP -> Y 호스트의 C : TCP 를 이용하여 Y 호스트에 데이터 보냄
3) Y 호스트의 C -> M/Q -> B : A 로부터 받은 데이터를 B 에게 전달
A 가 클라이언트이고 B 가 서버인 경우, 서버인 B 는 위의 역순으로 결과를 반환 합니다.
통신 프로그램 C 는 송신용 쓰레드와 수신용 쓰레드로 구성되어 있습니다.
그런데, 송신용 쓰레드와 수신용 쓰레드가
1) 동일 TCP 컨넥션을 공유하는 경우 (1개) 와
2) 각각 별도의 TCP 컨넥션을 갖는 경우 (2개)
에 따라, 테스트 대상 OS 중 Tru64 에서는 차이가 없어 보이는데 레드햇 EL Linux 에서는 성능에 큰 차이를 보이고 있습니다.
일정정도의 차이는 가능할 것 같은데, 약 수십 배 이상 차이가 있는 것 같습니다 ...
하나의 컨넥션을 공유하는 경우의 성능이 낫습니다.
Tru64 와 Linux 상에서 차이를 보이는 이유는 뭘까요?
물론, 하드웨어와 OS 가 다르기는 하지만 구현상 특징이 있어서 그런것인지? 아니면 차이가 없어야 하는 것인지? 가 궁금하네요...
그리고, Linux 상에서 컨넥션 수에 따라 성능 차이가 있는 이유는 뭘까요?
프로그램 또는 커널에서 옵션을 설정하여 개선할 수는 없는지요?
참고로, Nagle 알고리즘은 Off 로 하여 시험하고 있습니다.
의견 부탁 드립니다.
감사합니다.
1개의 JOB에 대해
1개의 JOB에 대해 시간을 측정 해보시면 어떨까요? 100,000개를 테스트 한다고 할때 각 개별 JOB에 대해
시간을 측정해서 평균을 내보시면 어느쪽에서 병목이 생기는지 확인이 가능하지 않으실까 생각이 됩니다. 보통 M/Q의 경우 일반 TCP/IP 통신과는 달리 병목이 생길 여지가 좀 있습니다. 이 부분을 한번 검토해보시는것도 좋으실거 같구요.
보통 여러개의 접속을 만들어 하는것과 1개의 접속을 이용해 공유해 사용하는 방식중 어느것이 좋다 나쁘다 할수는 없을겁니다. 상호 장단점이 있을것 같습니다. 질문 하신 내용을 보니 혹시 미들웨어를 만드실려고 하시는건 아니신지요.?
이런 경우도 있습니다. DB를 동시에 엑세스해야 되는 시스템의 경우 단지 1 장비당 1개의 접속만 DB에 해놓고 이것을 공유해서 사용하는 방식이 빈번히 이루어지고 있습니다. 상호 장단점이 있을거 같습니다. 지금 테스트 하시는 방법은 중간에 병목 지점이 장비에 따라 다르게 나타날거 같은데 그 부분을 찾아 보시는게 어떠실지 생각됩니다.
댓글 달기