对于文件传输和手动存储,我们有一个简单的 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
:设置超时间隔(以秒为单位(30)),在此之后如果没有从客户端接收到数据,sshd 将通过加密通道发送消息以请求客户端的响应。默认为0,表示这些消息不会发送到客户端。此选项仅适用于协议版本 2。ClientAliveCountMax
:设置客户端活动消息的数量 (5),在 sshd 不接收客户端返回的任何消息的情况下可以发送该数量。如果在发送客户端活动消息时达到此阈值,sshd 将断开客户端连接,终止会话。
要获得 10 分钟,您需要相应地调整时间,也许像这样:
ClientAliveInterval 120
ClientAliveCountMax 5
方法#2 - 使用刀具
如果上述方法不起作用,那么客户端完全有可能正在利用保持活动状态,人为地支撑低流量连接。如果这是您的情况,那么您可以采取哪些操作来断开这些空闲连接。
一种方法是开发一个 cronjob 来监视在特定时间段内空闲的连接,例如在您的场景中为 10 分钟。
一旦此脚本检测到这些连接之一,您就可以使用诸如cutter
告诉客户端断开连接之类的命令,这违背了客户端的意愿。
$ cutter <ip> <port>
例子
$ cutter 192.168.1.20 22
笔记:Cutter 应该位于大多数主要发行版的存储库中。我能够以这种方式将它安装在 Fedora/CentOS/RHEL 以及 Debian/Ubuntu 上。
调试连接
@Gilles 在您的 Q 下的评论中提出了一个很好的观点,即空闲连接实际上不应该导致任何 CPU 负载。事实上,所有这些sftp-server
进程都导致了我认为的显着负载(20-30%),这top
似乎表明正在发生某些事情。
首先,我将使用strace
并连接到其中一个sftp-server
进程来查看它的用途。例如连接到 PID 17247:
$ sudo strace -p 17247
看看它是否真的在做任何事情。确实不应该这样。您还可以使用tcpdump
或wireshark
来监视 Nautilus 和 Nautilus 之间来回的网络流量sftp-server
。