我目前正在开发一个缓存服务器,它本身就使用大量RAM(我正在一个具有大量HTTP流量的服务器上测试它,并且WordPress和一个自定义 Web 应用程序都使用它来缓存内存中的数据) .
服务器显然执行了很多昂贵的 malloc/realloc/free 操作,所以我想知道是否应该使用自定义内存分配器,也许是在开始时预分配一个大“内存池”然后使用它来释放执行 malloc/realloc 时请求大小的“块”,并在调用 free 时将它们标记为已释放。
我走的是正确的道路还是我真的不需要这样的东西?有没有这样的分配器,还是我必须自己编写一个?
重要笔记:
服务器是单线程的(使用多路复用),所以我不需要在多线程应用程序中具有高性能等级的分配器(例如jemalloc,据我了解,它与单线程中的普通 malloc 一样好应用程序...如果我错了,请纠正我)。
在您提出/建议之前,我已经使用Valgrind消除了所有可能的内存泄漏。我只需要优化,而不是修复。
内存碎片是一个问题,所以我也应该使用一种方法来优化它。
使用适当的配置指令,用户可以设置服务器的最大可用内存,这就是我想到预先分配的固定内存池的原因。
我没有性能问题;我开发这个只是为了好玩和好奇。我喜欢学习和尝试新的编程技术。
是的,我使用过 callgrind,而 malloc 是最昂贵的操作之一。