ssh
로컬 Unix 도메인 소켓에서 다른 컴퓨터의 도메인 소켓으로 연결을 리디렉션하기 위해 macOS에서 실행 중입니다 . 호출되는 명령줄은 ssh
대략 다음과 같습니다.
$ ssh -nNT -L /var/run/some.socket:/var/run/some.socket -o TCPKeepAlive=yes \
-o ServerAliveCountMax=10 -o ServerAliveInterval=60 user@destination
일부 로드 테스트를 수행한 후 때때로 특정 클라이언트 연결이 실패하는 것을 발견했으며, 로그를 확인할 때 ssh
다음 오류 출력과 함께 연결이 실패했음을 발견했습니다.
channel 41: open failed: connect failed: open failed
channel 44: open failed: connect failed: open failed
channel 47: open failed: connect failed: open failed
channel 49: open failed: connect failed: open failed
channel 51: open failed: connect failed: open failed
channel 59: open failed: connect failed: open failed
channel 62: open failed: connect failed: open failed
channel 64: open failed: connect failed: open failed
부하 테스트 매개 변수는 100개의 동시 연결을 실행하는 것이었습니다(연결, 일부 데이터 전송, 일부 데이터 수신, 연결 끊기, 총 10,000개의 연결).
관찰된 동작은 테스트 시작 시 첫 번째 연결 세트가 매우 빠르게 생성되고 위 오류로 인해 연결이 실패하는 경우가 거의 없다는 것입니다. 실패 횟수는 실행마다 다르지만 일반적으로 몇 개에서 수십 개에 이릅니다. 대부분의 실패는 테스트 시작 시 발생하는 경향이 있지만 때로는 테스트 후반부(즉, 처음 100회 완료 후)에 발생하기도 합니다.
localhost
비슷한 설명이 있는 SO의 다른 게시물은 사용법 및 해결 방법 문제를 다루는 것으로 보이며 127.0.0.1
이는 TCP/IP 소켓이 아니기 때문에 관련이 없습니다. 또한 destination
위 명령 중 일부는 IP 주소로 지정되었습니다.
문제를 해결하고 추적하는 방법이 약간 혼란스럽습니다. 나는 다음 을 사용하여 작업에 대한 자세한 덤프를 -vvv
얻으려고 했습니다.ssh
호출은 ssh
스크립트에서 수행 되며 ulimit -n 1024
모든 소켓을 서비스하는 데 사용할 수 있으려면 호출 전에 충분한 파일 설명자가 제공되어야 합니다.
답변1
channel 41: open failed: connect failed: open failed
이 오류 메시지는 원격 SSH 서버가 터널 대상에 연결할 수 없기 때문에 TCP 전달 요청을 수행할 수 없음을 의미합니다. 메시지의 마지막 "열기 실패" 부분은 원격 SSH 서버의 오류 메시지입니다.
포트 전달을 사용하여 SSH를 실행하면 포트 전달이 다음과 같이 작동합니다.
- 로컬 SSH 클라이언트는 로컬 포트(귀하의 경우 /var/run/some.socket)에서 TCP 연결을 수신합니다.
- 개시자가 로컬 포트에 연결되면 SSH 클라이언트는 "direct-tcpip" 채널에 대한 요청을 서버에 보냅니다. 요청에는 터널 대상(귀하의 경우 원격 시스템의 /var/run/some.socket)이 포함됩니다.
- 원격 SSH 서버는 터널 대상과 TCP 연결을 설정합니다.
- 로컬 SSH 클라이언트와 원격 SSH 서버는 해당 TCP 연결과 direct-tcpip 채널 사이에서 양방향으로 데이터를 중계합니다.
귀하의 경우 SSH 서버는 어떤 이유로 터널 대상에 연결할 수 없기 때문에 3단계에서 실패합니다.
원격 서버의 SSH 로그를 확인해야 합니다. SSH 서버 프로세스가 실패 이유를 설명하는 메시지를 기록했을 수 있습니다. 그 외에도 부하 테스트 중에 간헐적으로 이런 현상이 발생한다고 하셔서 부하 관련 서버 측 문제를 살펴보도록 하겠습니다. 나는 몇 가지 가능성을 생각해 보았습니다.
- 원격 시스템의 /var/run/some.socket을 수신하는 애플리케이션이 연결 요청을 충분히 빠르게 처리하지 못하고 백로그되고 있습니다.
- SSH 서버 프로세스에서 일부 리소스 제한(예: 열린 파일 설명자 수)이 발생했습니다.