Rootop 服务器运维与web架构

java.lang.OutOfMemoryError: unable to create new native thread

日志监控系统报警,java日志不停报错:

07:02:44.168 [http-nio-8080-exec-3] ERROR com.xxx.common.base.SLExceptionHandler - Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: unable to create new native thread

看提示是OutOfMemoryError发生了OOM,也就是内存溢出,无法创建新线程,但是通过zabbix监控这台机器内存还有1.7G左右,并没有用完。

想重启服务,发现ssh也无法连接了,提示 reset by peer,只好登陆控制台强制重启。
进系统后发现 /var/log/secure 日志

Nov 11 07:10:25 node1 sshd[1043]: error: fork: Cannot allocate memory

竟然也提示无法分配内存,搜索资料说跟最大进程数有关,但未优化的系统默认是1024,不应该产生这么多进程,而且进程数多了zabbix有报警。
还有一条错误是 /var/log/messages中:

Nov 11 07:24:45 node1 chronyd[566]: Fatal error : pthread_create() failed

pthread_create 是系统创建线程的方法,提示失败,那是不是线程数量超过系统限制才无法创建。但是系统已经重启,已经看不到当时的在运行的线程数。

# 查看系统限制最大进程数
[root@localhost ~]# cat /proc/sys/kernel/pid_max 
32768
# 查看系统限制最大线程数
[root@localhost ~]# cat /proc/sys/kernel/threads-max 
30101

可以看到最大线程数是30101。
想起来前阵子有个服务占内存高,不停的在增长也导致服务器挂过一次,后来加了内存监控报警,小于1G就报警,重启。这次还没小于1G就挂了。
就查此模块的线程数,发现每分钟都在增加。算了下24小时大约会生成4000+个线程。

所以线程数满了后,也错误的提示了内存分配的错误,导致排错方向错误。
开发修改代码后,线程数不再增长了。

注意:系统也会对某个用户进行最大运行进程限制(ulimit -u)

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/4898.html

作者:Venus

服务器运维与性能优化

评论已关闭。