ファイル転送と手動保存のための単純な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 - ナイフを使用する
上記の方法がうまくいかない場合は、クライアントが接続の維持を活用して、トラフィックの少ない接続を人為的にサポートしている可能性があります。このような場合、アイドル接続を解除するにはどうすればよいですか?
1つのアプローチは、特定の期間(シナリオで10分など)の間アイドル状態の接続を監視するcronjobを開発することです。
cutter
このスクリプトがこれらの接続の1つを検出すると、クライアントの意志に反してクライアントに接続を切断するように指示するなどのコマンドを使用できます。
$ 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
。