之前遇见一个问题,程序启动时要加载大量的静态数据,导致启动速度很慢。
这带来了两个弊端:
- 线上服务的重启成本太高,发布更新时服务不可用的时间较长。
- 增加开发调试的成本。
将需要加载的数据放在tmpfs中,程序启动时用mmap挂载内存,可以达到“零”秒启动的效果。
如果是map、unordered_map等比较复杂的数据结构,则需要重新组织一下。
比如:map可以用二分查找代替,unordered_map也可以映射到线性地址空间上。
关于运行效率,由于是静态数据,所以就不存在竞争写数据的问题,读取速度和堆上的内存几乎没差别。
总结
优点:
- 启动速度快,数据加载时间几乎为零。
- 可以解决多进程时加载重复的数据复本,从而节省内存。
缺点:
- 需要将数据提前放到tmpfs下。
- 程序退出时也不能释放内存,需要手动释放。
- 可能需要重新组织数据结构。