Linux的SSH无法连接(shell request failed on channel 0)
一、背景
今天要上一台Linux主机,通过ssh连接之前都是正常可以进去的,今天突然就上不去了。监控平台也没收到相关告警,期初还以为是漏监控或者漏告警的。登录Grafana查看,主机运行正常,负载很低、CPU、内存各方面也是正常的。
尝试使用root用户登录,可以登录。但是使用业务的linux用户死活就是上不去,报错信息如下: shell request failed on channel 0
shell request failed on channel 0
二、limits.conf限制配置文件
咨询一下AI DeepSeek,得到如下解释.
/etc/security/limits.conf
是 Linux 系统中一个重要的配置文件,主要用于设置用户或用户组对系统资源使用的限制,它通过 PAM(可插拔认证模块,Pluggable Authentication Modules)来生效,以下为你详细介绍它的作用:
1、资源限制类型
1. 最大打开文件数(nofile)
- 含义:限制用户或用户组能够同时打开的文件描述符数量。文件描述符是操作系统用于访问文件、网络套接字等 I/O 资源的一种抽象机制。
- 作用场景:在处理大量文件或网络连接的应用程序中非常重要,例如 Web 服务器(如 Nginx、Apache),若同时有大量客户端请求,需要足够的文件描述符来处理这些连接。如果没有合理设置该限制,可能会导致应用程序因无法打开更多文件描述符而出现错误。
2. 最大进程数/线程数(nproc)
- 含义:限制用户或用户组能够创建的最大进程数量。每个进程都需要一定的系统资源,如内存、CPU 时间等。
- 作用场景:可以防止某个用户或用户组创建过多的进程,从而耗尽系统资源,影响其他用户或系统的正常运行。例如,恶意用户可能会编写脚本来无限创建进程,通过设置
nproc
限制可以避免这种情况。
3. 最大虚拟内存(as)
- 含义:限制用户或用户组能够使用的最大虚拟内存量。虚拟内存是操作系统为每个进程提供的一种抽象内存空间,它允许进程使用比物理内存更多的内存。
- 作用场景:可以防止某个进程或用户过度使用虚拟内存,导致系统出现内存不足的问题,影响系统的稳定性和性能。例如,某些内存泄漏的程序可能会不断申请虚拟内存,通过设置
as
限制可以避免系统因内存耗尽而崩溃。
4. 最大栈大小(stack)
- 含义:限制用户或用户组的进程能够使用的最大栈空间。栈是用于存储函数调用信息、局部变量等数据的内存区域。
- 作用场景:对于递归调用较深的程序,栈空间的使用会比较大。如果栈空间不足,可能会导致栈溢出错误。通过设置合理的
stack
限制,可以避免因栈溢出而导致程序崩溃。
2、配置灵活性
1. 用户和用户组级别配置
可以针对特定的用户或用户组设置不同的资源限制。例如,对于系统管理员用户,可以给予较高的资源限制,以方便他们进行系统维护和管理工作;而对于普通用户,则可以设置较低的限制,以保证系统资源的合理分配。
2. 软限制和硬限制
在 limits.conf
文件中,可以分别设置软限制和硬限制。软限制是一个警告性的限制,当用户或进程达到软限制时,系统会发出警告,但仍然允许继续使用资源;而硬限制是一个绝对的限制,用户或进程不能超过这个限制。软限制可以由用户自行调整,但不能超过硬限制。
3、系统稳定性和安全性
1. 防止资源耗尽
通过合理设置资源限制,可以防止个别用户或进程过度使用系统资源,从而避免因资源耗尽导致系统性能下降或崩溃。例如,限制每个用户的最大进程数和最大内存使用量,可以确保系统在高负载情况下仍然能够稳定运行。
2. 增强系统安全性
限制用户的资源使用可以减少潜在的安全风险。例如,限制用户能够打开的文件描述符数量可以防止某些恶意程序通过打开大量文件来耗尽系统资源或进行文件系统遍历攻击。
三、解决方式与总结
1、异常分析
查阅多方资料和排查,锁定在了用户能创建的(进程数+线程数 nproc)的数量已经到达了最大值,无法创建出新SSH的线程/进程,导致报错。
查看用户的nproc限制数量发现如图: 最大值65536
异常时,通过root能上ssh,查看这个用户所占的进程、线程数量总和如下: 65537 > 63336
ps -u $user -Lo pid | wc -l
2、解决步骤
1、首先保留现场,进程是一个Java进程,使用stack命令保存了这个进程的stack快照信息便于后期分析原因。 使用root无法直接打印出这个Java进程的信息,需要切换到对应用户,但是对应用户nproc满了,所以杀了其它该用户进程,腾出空间。
2、使用该用户ssh就可以上去了,打印jstack快照保存后,重启该进程, ssh整体恢复,nproc数量下降
3、Prometheus这块针对这块的监控需要补充,我觉得也是十分重要的,就是业务linux账号下的文件句柄限制、当前占用文件句柄数量、进程/线程数量限制、当前已经开辟的进程/线程数量,可以帮助我们提前发现这些问题,尽早规避。