问题描述:服务器可用内存越来越少,导致部分服务(例如mysql服务)自动停止,商城打不开。
原因:MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。但坏处是没有方法很方便的控制MongoDB占多大内存,事实上MongoDB会占用所有能用的内存,所以最好不要把别的服务和MongoDB放一起。而且根据官方文档可知,一个mongod实例几乎要占用服务器一半以上的内存,mongodb缺内存就会跟OS要,多了也不会还。
解决办法:
方法一(不推荐):
重启mongod,或者调用 db.runCommand({closeAllDatabases:1})来清除内存;
方法二(推荐):
使用Linux命令清除缓存中的数据:echo 3 > /proc/sys/vm/drop_caches
将以上命令加入计划任务中,每三个小时执行一次。
(1)在宝塔面板添加计划任务方法:
(2)直接在服务器添加计划任务方法:
执行命令:crontab -e
添加内容:* */3 * * * echo 3 > /proc/sys/vm/drop_caches > /dev/null
方法三(推荐):使用云Mongodb(迁移本地Mongodb到云Mongodb)
(1)修改本地Mongodb启动绑定的地址,允许外网访问。
设置完成后重启Mongodb服务。
(2)服务器安全组和防火墙开放Mongodb服务端口。
(3)在云Mongodb设置ip白名单,登录云Mongodb创建数据库、用户、密码
(4)使用navicat登录服务器的Mongodb导出数据库;
(5)使用navicat登录云Mongodb导入备份;
(6)修改CKJSHOP/common/config/main-local.php中mongodb链接信息;
(7)修改CKJSHOP_client/CKJSHOP_client.ini中mongodb链接信息;
(8)重启CKJSHOP_client,执行pkill -9 CKJSHOP