我们有一个用C ++编写的Apache CGI应用程序(使用cgicc扩展),它目前访问一些内存中的MySQL(使用HEAP引擎)表。到目前为止,我们每天处理的交易数量超过了服务器为服务这些请求所需的查询服务的能力。
我们为提高性能而讨论的下一步是使这些内存表更加“CGI”进程“本地”,并使用某种形式的共享内存来缓存数据。 Memcached或Membase似乎是可能的选择,虽然我们会使用它似乎并不完全同意该方法(或者它可能并且我根本看不到实现/连接)。
在理想的世界中,我们可以使用某种形式的序列化将数据加载到共享内存对象中。在启动时,CGI将获得一个副本,或者将提供一个地址,从中可以为其自己创建共享数据结构的副本,将其反序列化为“本地”内存数据结构,然后执行它需要执行的任何比较从那个对象。我们真的希望这不会对我们的Apache / CGI架构进行彻底的重新设计,而是可能只需要更换MySQL内存表的查询(MySQL DB位于同一台服务器上) Apache)使用对进程“更本地”的新内存数据结构。
感谢有关此人和他们所见过的任何见解。许多先前的主题建议使用Memcached / Membase方法,也许这是最好的路线,但只是想看看这是否是共识。
答案 0 :(得分:0)
我会使用boost::multi_index
为基准测试目的实现一些测试代码。它是大多数内存数据库操作的替代品。
我不知道你是否可以在可移动的共享内存分配中使用它,但如果你使用的是64位操作系统,应该可以在内存中选择一个固定点来映射你的共享空间而不与另一个冲突记忆图。在这种情况下,您可以使用C ++分配器做一些魔术,使所有对象分配都来自共享空间,并且指针在每个进程中都具有相同的值。
使用共享地图,您可以通过在共享内存空间中放置pthread_rwlock
来保护它。我喜欢在共享块的开头放置一个包含共享内存信息的结构。该结构将具有访问锁,分配器的可用空间指针以及可能的版本标识符(因此您不会尝试同时使用新代码或旧代码访问它)。