정보문화사
한동훈 저
이 책의 특징은 우선 네트워크 프로그래밍에 대한 간단한 소개 외에도 자체 만든 툴을 이용하여 여러가지 네트워크 프로그래밍에 대한 각각의 성능을 체크하고 있다는 것에 있다.
즉, 몇가지 조건 하에서의 테스트를 통해 그 효과와 처리 속도에 대한 비중을 점수로 표현하여 벤치마킹화 하였다.
소켓 이벤트 핸들링에 대한 벤치마크
1000개의 접속체크, 2000개의 접속체크, 3000천개의 접속체크를 통한 벤치마크
select
1000개 이하의 접속에서는 개발이 간단하고 처리 속도도 빠름
2000개 이상의 접속으로 용량이 많아질수록 Loop부분에서 많은 리소스를 차지하여 문제가 됨
WSAAsyncSelect
전체적인 성능은 select 방식보다 나쁨
WSAEventSelect
접속자가 많아질 수록 쓰레드가 많아지면서 각각의 컨텍스트 지연시간이 발생.
테스트 환경상 1997개 이상의 스레드 생성 불가로 접속을 받았지만 그 이후의 처리는 실패하는 상황 발생.
Overlapped Callback
모든 접속 테스트에서 3000개의 접속에도 안정적인 효과
IOCP
성능 테스트 결과 Overlapped Callback 과 비슷하거나 약간 나은 성능을 보임
결론
적은 접속에는 select 방식, 많은 접속 처리에는 IOCP, Overlapped Callback 방식이 좋은것으로 판단됨
Accept 처리와 관련된 벤치마킹
1000개, 2000개, 3000개 접속 시도에 대한 벤치마크
accept
접속이 많아질수록 처리에 걸리는 시간이 감소.
테스트 결과 1000개 기준으로 2000개는 1/2, 3000개에서는 1/4 정도의 성능 감소가 나타남
WSAAccept + Loop
accpet 방식보다 2배정도의 정도의 성능 개선이 나타남
AcceptEx + NoPooling
WSAAccept + Loop 방식과 비슷한 성능
AcceptEx + Pooling
단일 스레드 환경에서는 WSAAccept + Loop, AcceptEx + NoPooling 과 비슷한 성능.
하지만 AcceptEx + Pooling 환경에서는 Thread Pooling 을 사용하는 IOCP환경과 결합을 하면 좀더 나은 성능 기대를 할 수 있을것이라 판단됨.
메모리 관리와 관련된 벤치마킹
각각 1024 Bytes, 10240 Bytes, 102400 Bytes 만큼의 new / delete 를 1000회, 2000회, 3000회 진행
Dynamic Allocation
각 횟수가 증가 할 동안 성능 체크도 똑같은 배수만큼의 시간이 걸림
Static Allocation
Dynamic Allocation 보다 빠른 성능. 횟수가 증가할수록 걸리는 시간도 똑같이 증가
Memory Pool
할당시 블럭단위로 할당하게 되면서 다른 방식보다 우월한 성능을 보임
데이터베이스 접속 방식에 대한 성능 테스트
insert, delete, update 를 1000번, 2000번, 3000번 하는 것으로 성능 테스트
ODBC
ODBC에서 내부적인 스레드를 생성하는 것으로 판단되며, 각각의 횟수 테스트 결과 안정적인 결과가 나옴.
OLEDB, ADO
ODBC보다 약 2배의 성능 저하 결과가 나옴
Nagle
Nagle 은 작은 패킷을 자주 보내게 되면 성능상의 문제가 생길 수 있기 때문에 한번에 패킷을 여러개 모아 전송하는 방법
Nagle 을 사용하면 사용하지 않을때보다 응답속도는 감소됨. 하지만 전체적인 패킷 갯수가 감소하게 되는 성능 개선이 있음.
상황에 맞게 사용해야 하는것이 결론.
Process Data
IOCP 방식을 사용시 패킷 처리를 어떻게 사용하는가에 대한 방식으로써, WorkerThread 에서 처리, Circular Queue 를 사용하는 방식, Iocp의 Queue를 사용하는 방식으로 나눔
WorkerThread
각각의 멀티쓰레드 환경에서 패킷을 직접 처리하는 방식. 동기화 문제가 존재함
Circular Queue
동기화 문제를 막기 위해 하나의 Queue에 작업들을 넣은 다음 하나의 단일 스레드에서 이 작업들을 처리하는 방식.
Queue 에 데이터를 넣으면서 메모리 카피로 인한 성능 저하가 나타남
IOCP Queue
예제에서 선보인 방법으로 네트워크 함수에서 제공하는 IOCP Queue를 사용하는 방식. 가장 좋은 효과를 나타냄.
결론적으로 IOCP Queue 방식이 가장 효과적임.
[출처] : mystic24.egloos.com
한동훈 저
이 책의 특징은 우선 네트워크 프로그래밍에 대한 간단한 소개 외에도 자체 만든 툴을 이용하여 여러가지 네트워크 프로그래밍에 대한 각각의 성능을 체크하고 있다는 것에 있다.
즉, 몇가지 조건 하에서의 테스트를 통해 그 효과와 처리 속도에 대한 비중을 점수로 표현하여 벤치마킹화 하였다.
소켓 이벤트 핸들링에 대한 벤치마크
1000개의 접속체크, 2000개의 접속체크, 3000천개의 접속체크를 통한 벤치마크
select
1000개 이하의 접속에서는 개발이 간단하고 처리 속도도 빠름
2000개 이상의 접속으로 용량이 많아질수록 Loop부분에서 많은 리소스를 차지하여 문제가 됨
WSAAsyncSelect
전체적인 성능은 select 방식보다 나쁨
WSAEventSelect
접속자가 많아질 수록 쓰레드가 많아지면서 각각의 컨텍스트 지연시간이 발생.
테스트 환경상 1997개 이상의 스레드 생성 불가로 접속을 받았지만 그 이후의 처리는 실패하는 상황 발생.
Overlapped Callback
모든 접속 테스트에서 3000개의 접속에도 안정적인 효과
IOCP
성능 테스트 결과 Overlapped Callback 과 비슷하거나 약간 나은 성능을 보임
결론
적은 접속에는 select 방식, 많은 접속 처리에는 IOCP, Overlapped Callback 방식이 좋은것으로 판단됨
Accept 처리와 관련된 벤치마킹
1000개, 2000개, 3000개 접속 시도에 대한 벤치마크
accept
접속이 많아질수록 처리에 걸리는 시간이 감소.
테스트 결과 1000개 기준으로 2000개는 1/2, 3000개에서는 1/4 정도의 성능 감소가 나타남
WSAAccept + Loop
accpet 방식보다 2배정도의 정도의 성능 개선이 나타남
AcceptEx + NoPooling
WSAAccept + Loop 방식과 비슷한 성능
AcceptEx + Pooling
단일 스레드 환경에서는 WSAAccept + Loop, AcceptEx + NoPooling 과 비슷한 성능.
하지만 AcceptEx + Pooling 환경에서는 Thread Pooling 을 사용하는 IOCP환경과 결합을 하면 좀더 나은 성능 기대를 할 수 있을것이라 판단됨.
메모리 관리와 관련된 벤치마킹
각각 1024 Bytes, 10240 Bytes, 102400 Bytes 만큼의 new / delete 를 1000회, 2000회, 3000회 진행
Dynamic Allocation
각 횟수가 증가 할 동안 성능 체크도 똑같은 배수만큼의 시간이 걸림
Static Allocation
Dynamic Allocation 보다 빠른 성능. 횟수가 증가할수록 걸리는 시간도 똑같이 증가
Memory Pool
할당시 블럭단위로 할당하게 되면서 다른 방식보다 우월한 성능을 보임
데이터베이스 접속 방식에 대한 성능 테스트
insert, delete, update 를 1000번, 2000번, 3000번 하는 것으로 성능 테스트
ODBC
ODBC에서 내부적인 스레드를 생성하는 것으로 판단되며, 각각의 횟수 테스트 결과 안정적인 결과가 나옴.
OLEDB, ADO
ODBC보다 약 2배의 성능 저하 결과가 나옴
Nagle
Nagle 은 작은 패킷을 자주 보내게 되면 성능상의 문제가 생길 수 있기 때문에 한번에 패킷을 여러개 모아 전송하는 방법
Nagle 을 사용하면 사용하지 않을때보다 응답속도는 감소됨. 하지만 전체적인 패킷 갯수가 감소하게 되는 성능 개선이 있음.
상황에 맞게 사용해야 하는것이 결론.
Process Data
IOCP 방식을 사용시 패킷 처리를 어떻게 사용하는가에 대한 방식으로써, WorkerThread 에서 처리, Circular Queue 를 사용하는 방식, Iocp의 Queue를 사용하는 방식으로 나눔
WorkerThread
각각의 멀티쓰레드 환경에서 패킷을 직접 처리하는 방식. 동기화 문제가 존재함
Circular Queue
동기화 문제를 막기 위해 하나의 Queue에 작업들을 넣은 다음 하나의 단일 스레드에서 이 작업들을 처리하는 방식.
Queue 에 데이터를 넣으면서 메모리 카피로 인한 성능 저하가 나타남
IOCP Queue
예제에서 선보인 방법으로 네트워크 함수에서 제공하는 IOCP Queue를 사용하는 방식. 가장 좋은 효과를 나타냄.
결론적으로 IOCP Queue 방식이 가장 효과적임.
[출처] : mystic24.egloos.com
'DEV-Language > NetWorkServer Programming' 카테고리의 다른 글
게임서버프로그래머가 되는길 (0) | 2009.01.30 |
---|---|
[네트워크] 커널 오브젝트 동기화 (0) | 2009.01.26 |
tcp와udp의 공통점/차이점 (0) | 2009.01.23 |
WSAIoctl, SIO_KEEPALIVE_VALS 참고 사이트들 (0) | 2009.01.21 |
리눅스 계열의 IOCP 대응하는 기술(?) - C10K (0) | 2009.01.21 |