一、问题描述
登录root用户,切换业务用户的时候卡顿
准备重启jar包的时候报错:
"fork: retry: No child processes"
"Resource temporarily unavailable"
或者报错:
"error: do_exec_no_pty: fork: Resource temporarily unavailable"
服务器做过连接数设置
vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
二、解决办法
ss -anp|grep java|grep u_str|grep ESTAB
发现一个进程为12345的连接数特别多
ls /proc/12345/fd|wc -l #显示有3000多
将进程12345杀死,问题解决
三、补充suse12报错解决
1、问题原因
ulimit -u ==> 65535
ulimit已经设置的够大了,说明不是这个引起的
在R7或是S12系列,使用了 systemd,在R6或 S11上没有,当这个启动后,忽略掉/etc/security/limits.conf 下的设置。
UserTasksMax=
Sets the maximum number of OS tasks each user may run concurrently. This controls the TasksMax= setting of the
per-user slice unit
设置每个用户可以同时运行的操作系统任务的最大数量。
TasksMax=N
Specify the maximum number of tasks that may be created in the unit. This ensures that the number of tasks accounted
for the unit (see above) stays below a specific limit.
指定可在单元中创建的最大任务数。这可确保该单元的任务数(见上文)保持在特定限制以下
对于登录会话,UserTasksMax缺省值为内核限制pids_max(通常为12,288)的33%,可以在/etc/systemd/logind.conf中进行覆盖。
对于服务,DefaultTasksMax默认值为内核限制pids_max(通常为512)的15%。您可以通过在“ systemctl edit”中设置TasksMax或在
/etc/systemd/system.conf中更新DefaultTasksMax来覆盖该服务。
2、root无法登录
1、使用工具root登录直接报错
"Server refused to start a shell/command"
2、登录控制台,不管输入啥命令,基本上都是
"fork: retry: No child processes"
"Resource temporarily unavailable"
3、按网上的步骤:
echo "DefaultTasksMax=51200" >> /etc/systemd/system.conf
systemctl daemon-reexec #重新加载,也有的说要重启,有业务跑着重启不现实
systemctl show --property=DefaultTasksMax
虽然改变了,但是工具还是连不上
4、勉强打开messages日志
tail /var/log/messages
cgroup: fork rejected by pids controller in /user.slice/user-0.slice/session-2210467.scope
cgroup: fork rejected by pids controller in /user.slice/user-0.slice/session-2210466.scope
#说明对进程数是有限制的
cat /sys/fs/cgroup/pids/user.slice/user-0.slice/pids.max
12288
echo "65535" > /sys/fs/cgroup/pids/user.slice/user-0.slice/pids.max
问题解决,重启了一下sshd,工具可以正常登陆
systemctl restart sshd
3、普通用户无法直接登录
1、可以登陆root,但是直接连接普通用户被拒绝
su - 业务用户 #无法切换到业务用户,并且报错:
"failed to execute /bin/bash: Resource temporarily unavailable"
2、解决办法
ss -anp #看一下那个进程id出现的次数特多,将进程关闭或者重启临时解决问题
3、查看messages日志
cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/session-157880.scope
cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/session-157879.scope
cat /sys/fs/cgroup/pids/user.slice/user-1000.slice/pids.max
12288
感觉也可以通过手动增大数值进行解决
echo "65535" > /sys/fs/cgroup/pids/user.slice/user-1000.slice/pids.max
4、补充解决办法
查看系统支持最大线程数(一般会很大,相当于理论值)
cat /proc/sys/kernel/pid_max
查看当前问题账号的pid.max线程数限制(发现单独账号对线程数限制默认为12288)
cat /sys/fs/cgroup/pids/user.slice/user-1001.slice/pids.max
12288
处理:
对账号的/sys/fs/cgroup/pids/user.slice/user-1000.slice/pids.max进行调整,从12288调整为65535
至此,问题解决
为了避免之后出再现相关问题,对内核级线程的限制与systemd对线程的限制进行更改如下:
# SLE 12 修改内核级对线程的限制
vi /etc/sysctl.conf
kernel.pid_max = 65535
kernel.threads-max = 65535
执行sysctl –p 生效
# SLE 12 修改systemd 对线程的限制
cat /etc/systemd/system/user.slice.d/override.conf
[Slice]
TasksMax=65535
cat /etc/systemd/logind.conf.d/override.conf
[Login]
UserTasksMax=65535
cgroup限制:
有个重要的限制就是最大任务数TasksMax,通过设置cgroup的pids.max来限制。
对于登录会话,有个默认的限制UserTasksMax,配置在/etc/systemd/logind.conf,限制了某个用户的默认的总任务数
查看SP4的发行说明,并没有发现相关限制反而发现这句
“Starting with SLE 12 SP4, libcgroup1 has been removed. Migrate to the equivalent functionality in systemd.”
cgroup处理可能与systemd的处理相冲突从 SLE12SP4开始,libcgroup1已被删除。迁移到 systemd 中的等效功能
所以我们只需要对systemd相关限制进行更改就可以