방금 의 존재를 발견했습니다 sslh
.
Debian 7을 실행하는 512MB RAM VPS에 설치해 보았습니다. 구성이 완료된 후 sslh
apache2 가상 호스트 중 하나에 연결을 시도했는데 CPU 사용량이 즉시 50~60%까지 올라갔고 심지어 리소스 부족으로 인해 SSH를 통해 VPS에 연결할 수도 없게 되었습니다.
- 이게 정상인가요?
- 유효한 대안이 있습니까?
제가 해결하려고 하는 문제 sslh
는 많은 무료 Wi-Fi 핫스팟이 80과 443을 제외한 거의 모든 포트를 차단하고 있으며 ISP에서 제공하는 홈 서버에 연결하기 위해 OpenVPN을 사용해야 하는 경우가 많다는 것입니다.
제안할 수 있는 다른 솔루션이 있나요?
답변1
출처를 무심코 검토한 결과, 저자가 지나치게 열성적으로 set_nonblock
사용한 것으로 보입니다.SSLH-select.c.
각 소켓이 비차단으로 표시되면(그렇듯이) 루프는
while(1) {
select(… a bunch of non-blocking sockets …);
}
링크된 파일의 230라인 부근에서 대기 중이 됩니다. 즉, 읽을 소켓에 데이터가 없더라도 select는 즉시 반환되고 즉시 다시 호출됩니다. 이는 상당히 프로세서 집약적입니다.
작성자는 조건부로 매개변수를 사용하여 거의 올바르게 처리했지만 timeout
어쨌든 select
비차단으로 설정된 경우 아무런 효과가 없습니다.
sslh
이것이 실제 원인인지 확인하는 가장 좋은 방법은 다루지 않았습니다 .
답변2
이제 질문은 여기에 있습니다.https://github.com/yrutschle/sslh/issues/24
msw의 답변은 철저할 수 있지만 또한 잘못된 것입니다. select()
소켓 상태에 관계없이 차단합니다. 이는 기본적으로 그 목적이며 실제로 차단 소켓을 사용하는 코드는 O_NONBLOCK
사용할 때 select()
잘못되었습니다 . Linux에서' select(2)
: "Linux에서는 select()
후속 읽기가 차단되는 동안 소켓 파일 설명자가 "읽기 준비 완료"로 보고될 수 있습니다."
즉, O_NONBLOCK
설정하지 않고 사용하면 select()
프로그램이 완전히 차단될 수 있습니다.
따라서 문제가 있을 수 있지만 그렇지 않습니다.