今天上班之后,研发反应通过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程序在内存释方面存在问题,出现了内存泄露,这个需要研发去优化程序了。
转载于:https://blog.51cto.com/yjh625/1282636