서버에 많은 소켓 연결을 열고 인증하고 연결을 닫은 다음 반복하여 Java 서버를로드 테스트하려고합니다. 내 앱이 잠시 동안 실행되지만 결국에는 다음과 같은 결과가 나타납니다.
와이즈 비즈 내가 읽은 문서에 따르면, 닫힌 소켓이 close ()가 호출 된 후 일정 기간 동안 할당 된 로컬 주소를 여전히 차지하기 때문입니다. 이것은 OS에 따라 다르지만 몇 분 정도 걸릴 수 있습니다. 나는를 호출하려고java.net.BindException: Address already in use: connect
setReuseAddress(true)
직후 주소를 재사용 할 수 있기를 희망하는 소켓에
호출되었다. 불행히도 이것은 사실이 아닙니다.
소켓 생성 코드는 다음과 같습니다 :
close()
그러나 여전히이 오류가 발생합니다 :
와이즈 비즈내가하려는 일을 수행하는 다른 방법이 있습니까? 예를 들어, 100 개의 소켓을 열고 모두 닫고 200 개의 소켓을 열고 모두 닫고 300을 여는 등 최대 2000 개 정도의 소켓이 필요합니다.
어떤 도움이라도 대단히 감사하겠습니다!
Socket socket = new Socket();
socket.setReuseAddress(true);
socket.connect(new InetSocketAddress(m_host, m_port));
- 답변 # 1
- 답변 # 2
bind ()를 사용하지 않지만 setReuseAddress (true)는 이상합니다. 그 의미를 이해하기를 바랍니다. setReuseAddress (및 시점). 100-2000은 열어야 할 소켓 수가아닙니다. 그러나 연결하려는 서버 (같은 가산기/포트 쌍으로 보이므로)는 정상적인 백 로그에서 드롭 할 수 있습니다. 50 개 중
편집 : 여러 소켓을 빠르게 열어야하는 경우 (ermm 포트 스캔?) NIO 및 connect ()/finishConnect () + 선택기를 사용하는 것이 좋습니다. 같은 스레드에서 1000 개의 소켓을 여는 것은 속도가 느립니다. 코드에서 finishConnect ()가 필요할 수 있습니다.
- 답변 # 3
사용할 포트를 계획해야한다고 생각합니다. 이 말은 주어진 포트를 사용하여시도를 의미합니다. 연결이 실패하거나 예외가 발생하면 다음 포트 번호를 사용하여 연결을 시도하십시오.
와이즈 비즈를 감싸보세요
connect
의 진술 .여기서 내가 작동 할 것으로 생각되는 의사 코드가 있습니다 :
이 코드는 "모든 포트가 사용 중일 때 어떤 일이 발생합니까?"try/catch
portNumber = x //where x is the first port number you will try numConnections = 200 // or however many connections you want to open while(numConnections > 0){ try{ connect(host, portNumber) numConnections-- }catch(){} portNumber++ }
관련 자료
- get - python - requestsexceptionsconnectionerror :일반적으로 각 소켓 주소 (프로토콜/네트워크 주소/포트)를 한 번만 사용할 수 있습니다
- nginx - Tomcat 9는 항상 http/https 커넥터에 이미 사용중인 주소를 제공합니다
- linux - 노드 익스포터 바인드 주소가 이미 실행 중입니다
- c# - 소켓에 연결하려고 할 때 UI가 지연됩니까?
- .net - 이미 제거한 참조를로드하려는 Sitefinity 12 프로젝트
- c++ - fd_set 내에서 소켓의 IP 주소를 가져 오는 방법은 무엇입니까?
- go - Golang에서 IP 주소 형식 소켓 io를 얻는 방법
- cl-async를 사용하여 Lisp에서 소켓 피어의 주소를 검색하는 방법
- Python은 소켓을 사용하여 외부 /공용 IP 주소를 바인딩 할 수 없으며 오류가 발생하지만 로컬 IP 주소를 사용할 때 오류가 표시되지 않습니다.
- java : HttpURLConnection getResponseCode() API 호출이 POST 요청에서 ~30분 동안 멈춘 다음 IOException을 반환합니다.
- sockets : Bittorrent 피어가 TCP를 통해 서로 연결할 수 있도록 하는 요구 사항 이해
- java : 서버에서 안드로이드로 이미지를 전송하고 화면에 이미지를 표시
- java : Android 클라이언트 새 소켓 명령이 작동하지 않는 이유
- 소켓을 통한 C++와 Java 간의 이미지 전송
- http/https 대신 Java Spring/Springboot 프레임워크에서 TCP 서버 실행
- Python은 서로간에 메시지를 보내고 받기 위해 두 개의 소켓을 설정 했습니까?
- Java -로컬 호스트 및 포트 수신
- Java 다중 스레드 소켓은 데이터를 한 번만 수신합니다.
2 분의 TIME_WAIT 기간 내에 많은 아웃 바운드 소켓을 열어 아웃 바운드 포트 공간을 소진합니다. 가장 먼저해야 할 질문은 이것이 실제적인로드 테스트를 나타내는 것입니까? 실제 고객이 실제로 그렇게 할 것입니까? 그렇지 않은 경우 테스트 방법을 수정하면됩니다.
BTW SO_LINGER는응용 프로그램이 close () 동안 데이터가 플러시 될 때까지 대기하는 시간 (초)입니다. 일반적으로 0입니다. 포트가 종료를 종료 한 경우 TIME_WAIT 간격 동안 포트가 정지됩니다. 이것은 같은 것이 아닙니다. SO_LINGER 옵션을 남용하여 문제를 패치 할 수 있습니다. 그러나 이것은 피어에서 예외적 인 동작을 유발하며 다시 테스트의 목적이 아닙니다.