Java

記憶體不足問題 - 一旦我啟動我的 java 應用程序,Mongo 就會被殺死

  • September 6, 2017

我有一個獨立的應用程序,我正在嘗試為每個執行緒創建 5 個執行緒,我正在創建一個 mongoclient 並將詳細資訊保存在 MongoDB 中,然後關閉 mongoclient。

當我啟動我的 mongo 服務時,它正在執行,但是一旦我在一段時間後啟動我的 java 應用程序,我的 mongo 服務就會被殺死,我可以在 syslog 中看到以下錯誤。

Out of memory: Kill process 12715 (mongod) score 433 or sacrifice child\\
kernel: [2946780.340246] Killed process 12715 (mongod) total-vm:6646800kB, anon-rss:6411432kB, file-rss:0kB

我正在使用具有 10GB RAM 的 Linux 伺服器。據我所知,我們可以在 MongoDB 中進行數以千計的事務。在我開始之前,我可以在一段時間後看到可用記憶體,我收到上述錯誤。

不確定該怎麼做,我們是否需要在 linux 伺服器中設置任何內容來處理多個 mongo 請求?還是我需要在任何地方增加 mongo 服務的限制?

有人可以建議我嗎?

提前致謝。

我的java應用程序執行前後free -m的o/p如下:

前:

            total       used       free     shared    buffers     cached
Mem:         14032       7646       6385         54          4        153
-/+ buffers/cache:       7489       6542
Swap:            0          0          0

後:

            total       used       free     shared    buffers     cached
Mem:         14032      13845        186         54        106       4131
-/+ buffers/cache:       9607       4425
Swap:            0          0          0

以下是來自mongod.conf的詳細資訊

# mongod.conf

storage:
 dbPath: /xxx/xxx 
 journal:
   enabled: true

systemLog:
 destination: file
 logAppend: true
 path: /var/log/mongodb/mongod.log

net:
 port: 27017    
 bindIp: 127.0.0.1,xx.xx.xx.xx

processManagement:
  fork: true
security:
 authorization: enabled

輸出cat /proc/<PId>/limits

cat /proc/17694/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             112088               112088               processes
Max open files            1024                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       112088               112088               signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

ps 徐 | grep java 結果 :::

 root     17142  0.4  3.1 5645648 453180 pts/0  Sl   Sep04   2:27 java -d64 -Xms1024m -Xmx2048m -server -cp bin:lib/* javaclassname -resourceDir /xxx/bin -dataDir /xxx/data
  root     17491 22.1 11.2 5653432 1610716 pts/0 Sl   Sep04 115:14 java -d64 -Xms1024m -Xmx2048m -server -cp bin:lib_new/* javaclassname -resourceDir /xxx/bin -dataDir /xxx/data -outConfigPath /xxx/xxx.xml -outCatBrandPath /xxx/xxx.xml -outCatAndSunCatPath /xxx/xxx.xml
  xxx      19223  3.5 22.1 20396560 3184668 ?    Sl   Aug28 398:11 /usr/bin/java -Xms2g -Xmx2g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/elasticsearch-5.4.0 -cp /elasticsearch-5.4.0/lib/* org.elasticsearch.bootstrap.Elasticsearch
  root     21617  2.2 21.7 18549248 3124416 ?    Sl   Aug28 247:34 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-8.0.30/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/opt/apache-tomcat-8.0.30/endorsed -classpath /opt/apache-tomcat-8.0.30/bin/bootstrap.jar:/opt/apache-tomcat-8.0.30/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-8.0.30 -Dcatalina.home=/opt/apache-tomcat-8.0.30 -Djava.io.tmpdir=/opt/apache-tomcat-8.0.30/temp org.apache.catalina.startup.Bootstrap start

swapon -s 輸出:

Filename                                Type            Size    Used    Priority

作業系統似乎耗盡了物理記憶體,並且由於您的伺服器似乎沒有配置任何交換,核心的記憶體不足殺手(OOM-killer)啟動並終止程序以釋放一些 RAM(在這種情況下,它是 mongodb,但可以是任何其他的)。

您應該在該伺服器上創建一個交換分區。

引用自:https://serverfault.com/questions/872006