mongo
mongo
1.在数据迁移的过程中,写入量每秒达到1000次,在这个量级下,memcache会一直占用内存不释放。
原因:mongo是异步写入,收到写入请求之后,先放入内存,然后异步写入,
解决方案
(1)用closeAllDataBase,释放内存,3.0之后命令已经不支持了
(2)用ulimited在mongo启动的时候,指定mongo占用的内存
(3)用linux的drop_cache命令释放内存
使用方案:
(1)这3种都没有用,因为这3种方案都是在迁移过程中用到。在思考了业务模型之后,发现新时景的数据是有冷热之分的,即图片的实时性很强,那么获取图片点赞列表的实时性也很强,而且250个G的点赞,真正能用到的可能不足10%,所以就使用一种方案,写了一套rpc服务。
(2)当请求点赞列表时,先查询其赞数是否为0,图片是否为老时景的图片,点赞列表是否为空,如果同时满足这3个条件,那么说明图片
的点赞列表没有迁移,就调用rpc服务,查询全部的点赞列表,第一页返给客户端,然后异步插入mongo。下次请求从新mongo请求即可
(3)通过观察,实时迁移量不是很大,每天有几百个请求
2.mongoDB
(1)mongoDB使用的是 内存映射 存储引擎 ,它会把数据文件映射到内存中。如果是读操作,内存中的数据起到缓冲作用;
如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,大幅度提升性能。
(2)mongoDB不干涉内存的管理工作,而是把这些管理交给操作系统去管理,好处是简化了mongoDB的工作,坏处是没有办法很方便去控制内存,致使mongoDB有时候占内存过多。
(3)mongoDB连接数过多的话,会拖类性能,每个连接者是一个线程,需要一个stack(栈),linuxt每个栈的大小默认10240K,所以连接数过多的话,会消耗过多的内存,从而拖累性能
(4)mongoDB应分配的内存大小:内存 > 索引 + 热数据
http://www.cnblogs.com/foxracle/p/3421893.html