Java
記憶體不足問題 - 一旦我啟動我的 java 應用程序,Mongo 就會被殺死
我有一個獨立的應用程序,我正在嘗試為每個執行緒創建 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,但可以是任何其他的)。
您應該在該伺服器上創建一個交換分區。