파일 전송 및 수동 저장을 위해 간단한 RHEL 서버가 있고 다른 모든 Linux 클라이언트는 SSH를 통해 연결됩니다.
클라이언트가 데이터에 액세스/저장하려고 할 때마다 서버에 연결되며, nautilus
데이터 전송이 중지되더라도 수동으로 제거하거나 클라이언트가 시스템을 종료할 때까지 연결은 유지됩니다.
서버에서 CPU 사용량을 모니터링할 때 대부분의 CPU 사용량은 이러한 설정된 연결로 인해 발생합니다.
[root@server]# top
top - 11:22:13 up 2:36, 6 users, load average: 2.79, 2.19, 1.90
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17247 share 20 0 55640 1924 972 S 26.7 0.1 7:36.72 sftp-server
17900 share 20 0 55640 1932 972 S 17.5 0.1 10:16.45 sftp-server
26152 share 20 0 55596 1872 972 S 17.5 0.1 8:12.04 sftp-server
17487 share 20 0 55636 1864 972 R 15.5 0.1 9:58.56 sftp-server
2852 root 20 0 195m 55m 7872 R 13.8 2.7 17:01.72 X
11768 share 20 0 55560 1684 832 S 8.9 0.1 3:12.00 sftp-server
17486 share 20 0 98172 1884 784 R 8.2 0.1 4:48.35 sshd
26151 share 20 0 98236 1872 784 S 7.9 0.1 4:03.29 sshd
17899 share 20 0 98204 1916 784 S 7.2 0.1 5:00.17 sshd
12569 tejas 20 0 322m 11m 7808 S 5.9 0.6 0:28.12 gnome-system-mo
17246 share 20 0 98204 1840 784 S 5.9 0.1 3:33.18 sshd
11767 share 20 0 98008 1716 772 S 4.3 0.1 1:28.73 sshd
15168 tejas 20 0 989m 64m 18m S 0.7 3.2 0:01.31 chrome
4077 tejas 20 0 109m 9312 5584 S 0.3 0.5 24:26.08 App
11360 tejas 20 0 304m 10m 5144 S 0.3 0.5 0:05.23 gnome-terminal
14236 root 20 0 15168 1380 928 R 0.3 0.1 0:00.36 top
1 root 20 0 19324 1056 844 S 0.0 0.1 0:00.67 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
그래서 저는 해당 SSH 연결을 오프로드하는 자동화된 방법(데이터가 흐르지 않는 경우 약 10분 정도)이나 CPU 사용량을 최소화하기 위한 다른 아이디어를 찾고 있습니다.
편집하다:slm의 의견에 따르면 can you explain how they're connecting from Nautilus?
이는 클라이언트가 일반적으로 SSH를 통해 서버에 연결하는 방법입니다.
- 필수 필드를 입력하고 비밀번호를 입력하세요.
- 파일을 전송/생성합니다.
- 디렉토리를 닫은 후 30분 동안 기다리십시오.
- 아직 연결이 표시되고 있습니다...
답변1
방법 #1 - SSHD/SFTPD를 통해 시간 초과 사용
SSH를 통해 연결하는 경우 SSHD 측 구성 파일에서 이러한 설정을 설정할 수 있습니다 /etc/ssh/sshd_config
.
ClientAliveInterval 30
ClientAliveCountMax 5
이러한 설정이 적용되는 위치는 다음과 같습니다.
ClientAliveInterval
: 클라이언트로부터 데이터가 수신되지 않으면 sshd가 암호화된 채널을 통해 메시지를 보내 클라이언트로부터 응답을 요청하는 시간 제한 간격을 초(30)로 설정합니다. 기본값은 0이며, 이는 이러한 메시지가 클라이언트에 전송되지 않음을 의미합니다. 이 옵션은 프로토콜 버전 2에서만 사용할 수 있습니다.ClientAliveCountMax
: sshd가 클라이언트에서 반환된 메시지를 수신하지 않고 보낼 수 있는 클라이언트 활성 메시지 수(5)를 설정합니다. 클라이언트 활동 메시지를 보내는 동안 이 임계값에 도달하면 sshd는 클라이언트 연결을 끊고 세션을 종료합니다.
10분을 얻으려면 그에 따라 시간을 조정해야 합니다. 예를 들면 다음과 같습니다.
ClientAliveInterval 120
ClientAliveCountMax 5
방법 #2 - 칼을 사용하세요
위의 방법이 작동하지 않으면 클라이언트가 연결 유지를 활용하여 트래픽이 적은 연결을 인위적으로 지원하고 있을 가능성이 있습니다. 이러한 경우 유휴 연결을 끊으려면 어떻게 해야 합니까?
한 가지 접근 방식은 특정 기간(예: 시나리오에서 10분) 동안 유휴 상태인 연결을 모니터링하는 cronjob을 개발하는 것입니다.
cutter
이 스크립트가 이러한 연결 중 하나를 감지하면 클라이언트의 의지에 반하여 클라이언트에 연결을 끊으라고 지시하는 등의 명령을 사용할 수 있습니다 .
$ cutter <ip> <port>
예
$ cutter 192.168.1.20 22
노트:Cutter는 대부분의 주요 배포판의 저장소에 있어야 합니다. Fedora/CentOS/RHEL은 물론 Debian/Ubuntu에도 이 방법으로 설치할 수 있었습니다.
디버그 연결
@Gilles는 유휴 연결이 실제로 CPU 부하를 유발해서는 안 된다는 Q 아래의 의견에서 좋은 지적을 했습니다. 이러한 모든 sftp-server
프로세스가 내가 생각하는 상당한 부하(20~30%)를 유발하고 있다는 사실은 top
뭔가 진행되고 있음을 나타내는 것 같습니다.
strace
먼저 프로세스 중 하나를 사용 하고 연결하여 sftp-server
용도를 확인하겠습니다. 예를 들어 PID 17247에 연결하는 경우:
$ sudo strace -p 17247
실제로 뭔가를 하고 있는지 확인해 보세요. 정말 이러면 안 됩니다. tcpdump
또는 wireshark
Nautilus 에서 들어오고 나가는 네트워크 트래픽을 모니터링하는 데 사용할 수도 있습니다 sftp-server
.