recvmsg가 "EAGAIN(리소스를 일시적으로 사용할 수 없음)"을 반환합니다.

recvmsg가 "EAGAIN(리소스를 일시적으로 사용할 수 없음)"을 반환합니다.

최근 서버 이동 후, 우리는 한 서버가 뚜렷한 이유 없이 네트워크 연결을 끊었다가 몇 초 또는 몇 분 내에 다시 연결되는 이상한 문제를 해결하기 위해 노력하고 있습니다. /var/log/messages dmesg아니면 흔적이 없습니다 mcelogs. 이 문제를 디버깅하는 동안 나는 발행했습니다.

strace ping google.com

그것은 돌아온다

= -1 EAGAIN (Resource temporarily unavailable)

이 메시지가 무엇을 의미하는지 설명할 수 있는 사람이 있나요? pinggoogle.com을 구문 분석하지만 마치 방화벽에서 ping 응답이 거부로 설정된 것처럼 아무런 응답도 표시되지 않습니다.

sendmsg(3, {msg_name(16)={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("74.125.131.113")}, msg_iov(1)=[{"\10\0005\321?i\0\3v\301lT\0\0\0\0\335\331\3\0\0\0\0\0\20\21\22\23\24\25\26\27"..., 64}], msg_controllen=0, msg_flags=0}, 0) = 64
recvmsg(3, 0x7fffd48b9cc0, 0)           = -1 EAGAIN (Resource temporarily unavailable)

추신: 이것은 RHEL 6.5를 실행하는 VMware VM입니다.

답변1

소켓(또는 파이프 또는 기타 비동기 소스)에서 데이터를 읽을 때 데이터를 즉시 사용할 수 없는 경우 어떻게 될지 선택할 수 있습니다. 일부 데이터가 도착할 때까지 읽기를 기다리거나(차단 모드) 오류와 함께 즉시 반환되도록 할 수 있습니다(비차단 모드).

두 번째 경우에 반환된 오류는 입니다 EAGAIN.

따라서 이 EAGAIN오류는 실제로 아무 것도 알려주지 않습니다. 그것은 단지 recvmsg()그 당시에 받아들일 것이 아무것도 없다는 것을 의미합니다.

관련 정보