Centos中普通用户启动多个Dubbo服务出现java.lang.OutOfMemoryError: unable to create new native thread
2016-07-06 21:15
766 查看
当在同一台Centos服务器上用普通用户启动多个dubbo服务时出现调用异常,查看日志发现是以下错误:
2016-07-06 16:23:48.806 [New I/O server boss #1 ([id: 0x55fcd7d6, /0:0:0:0:0:0:0:0:20882])] WARN o.j.n.c.socket.nio.NioServerSocketPipelineSink - [DUBBO] Failed to accept a connection., dubbo version: 2.5.3, current host: 127.0.0.1
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method) [na:1.7.0_79]
at java.lang.Thread.start(Thread.java:714) [na:1.7.0_79]
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949) [na:1.7.0_79]
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371) [na:1.7.0_79]
at org.jboss.netty.channel.socket.nio.NioWorker.register(NioWorker.java:115) ~[netty-3.2.5.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink$Boss.registerAcceptedChannel(NioServerSocketPipelineSink.java:279) ~[netty-3.2.5.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink$Boss.run(NioServerSocketPipelineSink.java:246) ~[netty-3.2.5.Final.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
从异常中红色部分可知:
以上的异常是因为不能创建线程造成的
分析其原因为:
根据dubbo官方文档分档可知,如果没有配置线程模型的情况下,默认为固定的一个dubbo服务启动时固定创建一个100个线程的线程池,而Centos默认的普通用户的线程限制为1024,所以多个dubbo服务启动时,就可能出现以上的普通用的线程数已经用户,而无法创建线程的异常,所以我们现在可以做的就是增大普通用户的线程数。那么增加到多少是合适的呢。
首先我们可以通过ulimit -u来查看当前系统可以支持的最大的线程数。
比如我的8G的服务器得到的数值为62727,那我们就可以在这一个数值之内根据实际情况来设置该值,但是一定要比这一个值小,如果设置得比这一个值大,那么普通用户就能把这一个数量耗完,那么可能那时远程工具都不能连上服务器,只能到机房硬启动服务器才能解决了。
接下来修改这个值:
在CentOS6之前修改/etc/security/limits.conf 即可,如果是CentOS6后的版本则推荐修改/etc/security/limits.d/90-nproc.conf 文件,因为系统会先读/etc/security/limits.conf,如果/etc/security/limits.d/目录下还有配置文件的话,也读进来,一起分析。这就意味/etc/security/limits.d/里面的文件里面的配置会覆盖/etc/security/limits.conf的配置。
2016-07-06 16:23:48.806 [New I/O server boss #1 ([id: 0x55fcd7d6, /0:0:0:0:0:0:0:0:20882])] WARN o.j.n.c.socket.nio.NioServerSocketPipelineSink - [DUBBO] Failed to accept a connection., dubbo version: 2.5.3, current host: 127.0.0.1
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method) [na:1.7.0_79]
at java.lang.Thread.start(Thread.java:714) [na:1.7.0_79]
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949) [na:1.7.0_79]
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371) [na:1.7.0_79]
at org.jboss.netty.channel.socket.nio.NioWorker.register(NioWorker.java:115) ~[netty-3.2.5.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink$Boss.registerAcceptedChannel(NioServerSocketPipelineSink.java:279) ~[netty-3.2.5.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink$Boss.run(NioServerSocketPipelineSink.java:246) ~[netty-3.2.5.Final.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
从异常中红色部分可知:
以上的异常是因为不能创建线程造成的
分析其原因为:
根据dubbo官方文档分档可知,如果没有配置线程模型的情况下,默认为固定的一个dubbo服务启动时固定创建一个100个线程的线程池,而Centos默认的普通用户的线程限制为1024,所以多个dubbo服务启动时,就可能出现以上的普通用的线程数已经用户,而无法创建线程的异常,所以我们现在可以做的就是增大普通用户的线程数。那么增加到多少是合适的呢。
首先我们可以通过ulimit -u来查看当前系统可以支持的最大的线程数。
比如我的8G的服务器得到的数值为62727,那我们就可以在这一个数值之内根据实际情况来设置该值,但是一定要比这一个值小,如果设置得比这一个值大,那么普通用户就能把这一个数量耗完,那么可能那时远程工具都不能连上服务器,只能到机房硬启动服务器才能解决了。
接下来修改这个值:
在CentOS6之前修改/etc/security/limits.conf 即可,如果是CentOS6后的版本则推荐修改/etc/security/limits.d/90-nproc.conf 文件,因为系统会先读/etc/security/limits.conf,如果/etc/security/limits.d/目录下还有配置文件的话,也读进来,一起分析。这就意味/etc/security/limits.d/里面的文件里面的配置会覆盖/etc/security/limits.conf的配置。
相关文章推荐
- PCIe之DMA (一)
- Linux上安装织梦DEDE时 提示GD不支持和mysql不支持 问题解决
- Linux first try
- Linux vim Java
- 主机之间ping命令互通设置及解决方案
- CentOS 6.5/6.6 安装mysql 5.7 最完整版教程
- linux系统用户登陆时脚本执行顺序
- CentOS 7运维管理笔记(11)----PHP安装与配置
- Linux基础知识[1]【ACL权限】
- linux pmap命令
- 【LINUX 学习】Ext3 的三种日志记录方式
- gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化
- GCC的浅层理解
- Linux vmstat命令详解
- linux top 命令分析
- CentOS上配置rsyslog客户端用以远程记录日志
- Linux结束线程的方法,深度好文
- MySql5.6Linux安装后my.cnf配置文件位置
- 认识Linux
- 33.每日一个Linux命令----free