non-block socket이 일반 socket보다 속도가 느린가요?
글쓴이: superkkt / 작성시간: 화, 2006/02/28 - 8:33오후
block socket을 사용할때는 랜상에서 초당 10메가의 속도로 파일 전송이 되었습니다. 그런데 non-block으로 바꾸고 EAGAIN or EWOULDBLOCK 에러를 리턴할때 못보낸 데이터를 재전송해주는 코드를 추가했더니 초당 5~6메가 정도밖에 속도가 안나오네요.
데이터 재전송 해주는 코드는 다시 파일을 읽는게 아니라 메모리에 있는 내용을 다시 보내주는거라서 특별히 오버헤드가 발생할 부분은 없습니다. 다만 한번에 보낼걸 두번에 보내는거 빼고는요..
그리고 non-block에서 파일전송시 EAGAIN을 리턴할때는 send buffer에 write하는 속도를 네트워크가 받쳐주지 못해서 그런건가요? 그렇게 보기엔 EAGAIN 나올때마다 write 된 사이즈가 일관되게 나오는게 좀 이상해서요.. 예를들어 write에 8192바이트를 요청했는데 5142바이트만 쓰고 리턴하는것처럼 항상 일정한 값만 쓰고 리턴을 합니다.
non-block이 느리다면 다른 대안은 어떤게 있나요? 지금 생각나는건 socket options에 SO_SNDTIMEO를 설정하는 방법과 write전에 alarm을 설정하는 방법인데.. 또 다른 방법이 있나요?
Forums:
제가 개념이 안서서 그런걸지도 모르겠습니다만,block socket
제가 개념이 안서서 그런걸지도 모르겠습니다만,
block socket 이란것은 thread 로 구현할 수 있도록
서버의 한 포트에 non-block 하게 오는 정보를 세션별로 block 하게 동작시키는것 아닌가요?
결국 내부적으로는 non-block 의 확장형태가 아닌가 해서요.
델파이를 보다보니 indy 라는 컴포넌트가 block 만을 지원하는데,
쓰레딩이 알아서 잘 되더라고요. 얘만 그런건가... :oops:
https://xenosi.de/
poll 등을 이용해서 POLLOUT 이벤트가 발생할 때 보내보세요. 성
poll 등을 이용해서 POLLOUT 이벤트가 발생할 때 보내보세요. 성능 저하가 심할것 같지만 그렇지 않습니다
nonblock 소켓 사용시 자꾸 EAGAIN이 발생하는 이유 중 큰 것은 말씀하신대로 네트웍보다 소켓버퍼로 복사하는 속도가 빠르기 때문입니다
그리고.. 타이머나 usleep 등으로 시간텀을 주는건 엄청난 성능 저하가 올겁니다;;
그리고 파일을 소켓으로 보내실 때는 sendfile(2) 를 참조해 보세요. 파일 읽어서 버퍼에 놓고 보내는 것보다 약간 빠릅니다~ 경험상 sendfile은 block쪽보다 nonblock쪽이 전송이 더 빨랐습니다.. 이건 상황마다 좀 달라질 수 있겠구요..
아 그리고 시스템콜들(2)은 횟수가 적으면 적을 수록 좋습니다. 특히 쓰레드로 작업 시 크리티컬 섹션에서는 없으면 없을수록 좋습니다. -.-;;
제가 write를 잘못 사용해서 속도저하가 발생했습니다. write의 리
제가 write를 잘못 사용해서 속도저하가 발생했습니다. write의 리턴값이 요청값과 다르면 재전송 코드가 실행되도록 해야되는데 그자리에서 다시 한번 write를 하는 wrapping 함수를 사용하고 있어서 문제가 생겼던거네요.
적어도 제가 테스트한 LAN 환경에서는 non-block과 block socket의 속도 차이는 발생하지 않는군요. 구형 스팍 머신(솔라리스 8)에서 테스트 해본결과 예상외로 재전송이 많이 발생하더군요. 그래서 성능 저하가 생길줄 알았는데 별반 차이가 없네요.
======================
BLOG : http://superkkt.com
non-block, block 소켓이라고 성능에 크게 영향이 있는게 아니
non-block, block 소켓이라고 성능에 크게 영향이 있는게 아니라 아주 약간 있습니다. 클라이언트 하나 접속해서는 그 차이를 측정 조차 할 수 없을 정도가 대부분이죠.. sendfile같은 zero-copy나 온갖 폴링 관련(select, poll, epoll, kqueue, RTS 등등)된 테스트도 몇 개 수준의 클라이언트들로는 성능 차이를 측정조차 힘듭니다.
적어도 세션 천개는 물리고 요청은 몇만번을 해봐야 그 차이가 눈에 띄는 정도걸랑요
그래서 어떤 소켓 모델을 쓰느냐 어떤 폴링 모델을 쓰느냐 보다는 IO계획이나 전체적인 구조가 성능에 훨씬 많은 영향을 미치게 됩니다 ㅎ
댓글 달기