随着数据量的增加,查询速度越来越慢。原因是排序所需要的数据在内存占的空间越来越大。现在大概占了900M的内存,由于机器上跑了其他很多的服务,导致内存不够。
现在的查询服务是多进程结构,父进程内存中加载了了很多数据,由于父进程中的数据不被访问,而内存不足,父进程的页面被换出到swap分区,当客户查询来时,创建的子进程复制了父进程的地址空间,尽管是与copy on write理论上共享了父进程的页面文件,但是由于父进程的页面已经被换出,所以每个子进程都要从swap中加载自己需要的数据。页面换入换出很频繁。
准备的优化措施:
1.对父进程的数据存储用C扩展来写。Python对象太占空间了,大概要比C方式多一倍的空间。这样内存消耗预计可以缩小一半。
2.让查询服务父进程的数据常驻内存不换出。这个要自己实现一个内存分配模块。可以用mmap+mem_locked参数来实现。由于上面的1准备用STL的map来保存数据,这意味着需要重新写一个map的allocator。
没有评论:
发表评论