[TCP] non-block 소켓 환경에서 SEND시 전송 지연 문제 질문드립니다!
글쓴이: ansdus123 / 작성시간: 월, 2016/05/09 - 10:34오전
해당 코드는 서버이며 클라이언트가 2~12개까지 붙는 경우가 있구요, OS는 vxWorks 입니다.
논블럭 TCP 소켓으로 send 를 하는 절차가 있는데, 기존의 코드에서는 select를 이용하여 멀티플렉싱 방식으로 send를 수행했습니다.
select 구문은 필요가 없다고 판단되어 해당 부분을 제거한 후 send만 하도록 코드를 수정했는데
수정 후 운용을 하니 send 시 에 딜레이가 발생하네요
테스트를 하면서 소량의 데이터를 전송할 때는 문제가 없었는데 실제 운용환경에서 다량의 데이터를 보내면서 딜레이가 발생하는 듯 합니다.
위의 상황에서,
select 구문을 제거 함으로서 눈에 띄는 성능 저하 및 딜레이 발생이 가능한 것인지...
혹은 이로 인해서 우선순위에 영향을 미치는 여지가 존재할지에 대해서 고수님들의 의견을 여쭙고 싶습니다 ㅠㅠ
Forums:
안녕하세요. 제 생각은 이렇습니다. select를
안녕하세요. 제 생각은 이렇습니다.
select를 대신해서 서버 소켓들의 유휴 상태를 어떻게 감시하시는지는 모르겠지만,
서버 소켓의 유휴 상태를 정확히 파악하지 못한 코드가 존재한다면
send함수를 부르는 로직/타이밍이 기존 select 코드에 비해 불분명 해질 수도 있어 보입니다.
(서버 소켓들의 상태를 어떻게 감시하고 있는지가 중요하다고 생각이 듭니다.)
즉 select를 제거한 코드에서는 적절하지 않은 시점에 send를 부르는 경우가
기존 코드보다 더 많이 발생할 것으로 생각 해 볼 수도 있습니다.
(소켓버퍼의 상태에 따라 자주 EAGAIN가 발생할 수 있지 않을까 싶습니다.)
부족한 의견이지만 조금이나마 도움이 되셨으면 합니다.
non-blocking socket이라면
non-blocking socket이라면 select() 필수입니다. 안쓴다면 다른 소켓 이벤트 통지법 적용하셔야 하고.
보통 recv()에만 많이 적용하는데 그게 문제가 안되는 이유는 send()는 웬간해서는 한번호출로 OS의 전송버퍼에 다 들어가고 네트웍 대역폭도 남아돌아서 send()한게 다 보내져 버려서 문제가 안되는것처럼 보일 뿐입니다. 전송버퍼 다 차는 상황 생기면 얘기는 달라집니다.
client가 저속라인으로 연결된다든지 해서 전송버퍼에 send()로 집어넣은 데이터가 다차면 일부만 보내거나 보내지 않고 EAGAIN, EWOULDBLOCK 리턴합니다. 이때가 되면 전송 가능할때까지 계속 기다려 줘야 합니다.
Written By the Black Knight of Destruction
소켓의 구성과 상관없이 SELECT 같은 멀티
소켓의 구성과 상관없이 SELECT 같은 멀티 플렉싱은 필수입니다. 않써도 만들수는 있지만 구지 않쓸 이유는 없습니다.
먼저 TCP의 특성에 대해 파악을 하셔야만 합니다.
1. 반드시 전달된다.
2. 언제 전달될지는 모른다.
이중 2번이 중요합니다. 대부분 프로그래머가 예측한 시간에 전달되지만 그렇지 않을 경우도 있습니다. 따라서 전송 데이터의 송/수신시 내가 받아야될 데이터양만큼 혹은 내가 보내야될 데이터양만큼 송수신이 이루어지는지 확인해야만 합니다. 송수신 데이터의 양이 정해지지 않은 프로토콜도 존재하지만 구지 그렇게 만들어 부정확한 상황에 대한 예외 처리를 만들 필요는 없습니다.
그리고 넌블락 소켓의 경우는 송수신 함수의 리턴값만으로 판단을 하는게 아니라 리턴값+에러값으로도 판단해야만 합니다.
만드시는 서버 구성의 경우
멀티플렉스에서 접속이 이루어 지면 FORK내지는 쓰레드로 처리 하신후에 그 안에서 다시 멀티플렉스로 송수신 감지를 하시면 될거 같습니다. 단일 쓰레드 안에서 모두 처리를 해야만 하는 경우는 UDP 아니면 거의 힘들겁니다. 그럼 즐거운 하루 되세요.
select() 를 안써도 원래대로의 성능이 나올것
select() 를 안써도 원래대로의 성능이 나올것 같은데요. select가 원래 polling 하는 방식이니까 select를 뺀다고 하더라도 TCP send 동작을 busy polling 하게 처리하면 비슷한 성능이 나올 것이라고 봅니다. 그렇더라도 그냥 select를 쓰는 것이 약간 비용상 쓰루풋 상 효율적이긴 하겠지만요.
그 코드 부분만 짤라서 올리시면 어떨까요?
댓글 달기