我有一个独立的应用程序,我正在尝试为每个线程创建 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
我使用的是 Linux 服务器,它有 10GB RAM。据我所知,我们可以在 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 xua | 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
答案1
看起来操作系统的物理内存已经耗尽,而且由于您的服务器似乎没有配置任何交换,内核的内存溢出终止程序(OOM-killer)启动并终止进程以释放一些RAM(在本例中是mongodb,但也可能是其他的)。
您应该在该服务器上创建一个交换分区。