历史存储服务pkhisdb占用内存
- 在缺省情况下,使用时间越长,访问次数越多内存分配的越大
- mongodb通过操作系统内存映射方式分配内存,自己并不管理内存,导致缺省情况下,物理内存占用总是趋向于100%。
- mongodb的存储引擎缺省分配物理内存策略:
- 最大物理内存大小算法如下:(电脑总物理内存-1G)/2。如服务器物理内存64G,pkhisdb最大内存可以占用(64-1)/2=31.5G物理内存
- 如果通过下面方法修改存储引擎大小,如wiredTigerCacheSizeGB=4。但在2012上实测内存还是占用到95%。
- 可以通过下面方法修改
- 在windows 2008下可以通过安装操作系统自带工具WSRM(系统资源管理器)来限制内存
- 在windows2012下没有WSRM,需要通过Hyper-V
- Linux可以通过cgroups工具限制物理内存
- 服务器内存很大时,虽然看起来使用的内存很多,不会影响mongodb使用,但影响该服务器上其他程序的使用。
- 如1500点的历史数据,运行1天后,内存达到20G左右(服务器内存总64G),使用processexplore工具(查看方法:进程探测器,查看程序内存和虚拟内存、启动时间等信息)看到pkhisdb内存为19G,这样其实不会出现问题:
修改方法
- 如希望修改pkhisdb占用内存大小,最大为4G,可以通过修改配置文件config/pkhisdb.conf文件,该文件缺省为:
dbpath=d:/hisdb logpath=../log/hisdb.log port=30002
- 在文件最后增加一项,如要限制最大物理内存为4G:wiredTigerCacheSizeGB=4
- 重新启动pkhisdb,或者启动整个eview服务端
- 此时查看log/hisdb.log,可以看到大约第11行的log中,有:wiredTiger: { engineConfig: { cacheSizeGB: 4.0 } } },说明设置生效
CONTROL [initandlisten] options: { config: "..\config\pkhisdb.conf", net: { port: 30002 }, storage: { dbPath: "d:/hisdb", engine: "mmapv1", journal: { enabled: true }, mmapv1: { smallFiles: true }, wiredTiger: { engineConfig: { cacheSizeGB: 4.0 } } }, systemLog: { destination: "file", path: "../log/hisdb.log" } }