은 " 할당 할 수 없습니다 요청 주소 오류 메시지에서"부분은 커널 TCP 스택에서 온다. 간헐적으로 발생하는 경우, 이는 일반적으로 대기 상태 ( TIME_WAIT
또는 이하 FIN_WAIT_1
또는 FIN_WAIT_2
) 에 너무 많은 소켓으로 인해 사용 가능한 소켓 공간이 소진되었음을 의미합니다.
소켓 포트 범위는로 출력 할 수 있습니다 cat /proc/sys/net/ipv4/ip_local_port_range
. 기본 Linux 커널의 기본값은 일반적으로 32768 61000
입니다.
netstat -ton|grep WAIT
시스템이 사용 중일 때 클라이언트와 pgBouncer의 호스트 에서 결과를 확인할 수 있습니다 . -o
플래그는 대기 상태에 관한 타임 아웃 카운터를 표시합니다.
총 TCP 소켓 61000-32768=28232
수가이 범위에 가까우면 이 범위가 소진 될 수 있습니다. 닫힌 상태의 소켓은 TIME_WAIT
정상적인 상태에서 60 초를 소비하기 때문에 클라이언트 호스트가 1 분 안에 28232 번 이상 연결하면 포트가 해제 될 때까지 언급 된 오류와 함께 새 연결이 실패합니다.
첫 번째 해결 방법으로 TCP 포트 범위를 확장 할 수 있습니다.
# echo "1025 65535" >/proc/sys/net/ipv4/ip_local_port_range
이 만족스럽지의 경우를 확인 tcp_tw_recycle
하고 tcp_tw_reuse
플래그도를 통해 조정 가능 /proc/sys/net/ipv4
하고 sysctl
.
그들은 (에서 man tcp
) 로 정의됩니다 .
tcp_tw_recycle (부울; 기본값 : 비활성화; Linux 2.4부터)
TIME_WAIT 소켓을 빠르게 재활용 할 수 있습니다. 이것을 가능하게하기
작업시 문제가 발생하므로 옵션을 권장하지 않습니다.
NAT (Network Address Translation)를 사용하여 연결합니다.
tcp_tw_reuse (부울; 기본값 : 비활성화; Linux 2.4.19 / 2.6부터)
TIME_WAIT 소켓을 새 연결에 재사용 할 수 있습니다.
프로토콜 관점에서 안전합니다. 없이 변경해서는 안됩니다
기술 전문가의 조언 / 요청.
개인적으로 나는 tcp_tw_recycle
MySQL 클라이언트 앱 에서이 문제에 직면했을 때 성공 했지만 TCP에 대한 나의 이해는 피상적이라고 생각합니다.