今天上班之后,研发反应通过su切换用户时,出现-bash: fork: Resource temporarily unavailable的报错信息,导致用户无法切换。


环境:

   OS:Redhat 5.3 64bit 内存:16G SWAP 4G


问题解决:

一般出现这个错误的第一反应就是是否是该账号的文件打开数和线程打开数不够,单数通过查询发现并未发现这两项出现问题,具体查询信息如下:

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 131072
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 16384
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
# ps -U content |wc -l
2
# lsof |grep content |wc -l
181

通过查看可以发现进程数2远远小于用户最大进程数16384,文件打开数181远远小于文件打开数65535,既然不是不是这方面的问题,那么就很有可能该用户是否占用过多的系统资源,如下是通过top查询到的信息:

   

# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                  
11503 content   20   0 20.4g 776m  10m S  0.0  4.7   0:07.29 java                                                                                                     
14241 content   18   0  850m 101m 9808 S  0.0  0.6   3:09.87 java

发现11503这个java进程暂用虚拟内存达到20.4G,远远大于系统内存16G,怀疑是这个java进程导致无法su切换到这个用户,通过root权限kill -9掉这个进程,之后用户可以正常su切换。


通过上面的分析引起这次故障的发生,应该是上面那个java程序在内存释方面存在问题,出现了内存泄露,这个需要研发去优化程序了。