1. 程式人生 > >Centos中普通使用者啟動多個Dubbo服務出現java.lang.OutOfMemoryError: unable to create new native thread

Centos中普通使用者啟動多個Dubbo服務出現java.lang.OutOfMemoryError: unable to create new native thread

當在同一臺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的配置。