2012-07-20 49 views
0

我读过an article about Distributed Hash Tables,似乎可以像APC一样实现memcache之类的东西。如您所知,如果我们从单个服务器获取密钥,APC比memcache快得多。所以如果我们让APC分布式的话,我们既有性能又有分布。我需要一些想法来启动它。熟悉哈希表的人可以解释如何做到这一点?如何使APC像memcache一样?
如果您对keyspace partitioningOverlay network有所了解,那将会更好。如何基于分布式散列表(如memcache)制作APC缓存?

+1

APC不仅仅是一个很快的速度,因为它不是一个服务器,而是专门用于疼痛/对象存储的本地内存块。也就是说,你的想法不会通过分发apc来使自己失效吗? – fvu 2012-07-20 18:09:08

+0

@fvu,如果因为它在本地主机上更快,那么为什么memcache在APC等本地主机上的速度不如APC快? – ALH 2012-07-20 18:12:22

+0

apc =被访问的内存块,就是这样。 Memcache是​​一个服务器,也就是localhost或不是,**是**网络流量,客户端必须对请求进行编码,发送,服务器对其解码,对其答案进行编码,通过网络发送并由客户端进行解码。现在,“分布式apc”必须是服务器,并且非常类似于memcache的当前模型,并且该模型继承了行为和性能级别,但没有办法绕过它。 Memcache对于它的工作已经非常快,我认为你在这里寻找错误的罪魁祸首。 – fvu 2012-07-20 20:54:38

回答

1

虽然表面上两个软件都提供了类似的服务,但它们的基础却完全不同,这就解释了性能的巨大差异。

APC基本上是一个允许您在共享内存中存储对象(无论是用户对象还是解析的操作码块)的系统。在我知道的所有系统中,共享内存与获得指向它的指针一样快。

所以,简而言之,APC所要做的写入或读取对象是:

  • 要求SHM访问和获得它的指针
  • 计算对象的SHM偏移和大小
  • memcpy的内存区到缓冲区,反之亦然

简单,并考虑到内存带宽现在是每秒10兆字节,很快。需要做

由于一个内存缓存方案的详细其分布式性质:

  • 客户端编码并传输请求
  • 服务器接收和解码请求
  • 服务器计算对象偏移量和大小在分布式缓存的存储器
  • 服务器memcpy的内存区域成缓冲区或反之亦然
  • 服务器发送缓冲区
  • 客户端接收和解码缓冲区

现在,如果我们想分发APC,客户端和服务器将需要相互通话。突然之间,我们发现自己处于一个场景,除了一些不太重要的细节之外,它与memcache使用的场景完全相同。而且所有昂贵的操作都将再次变得必要,即所有的复制都通过网络堆栈发送。

这也解释了为什么即使运行在本地主机上的memcache实例,在节点之间没有极其缓慢的千兆以太网,为使分布式系统工作还需要付出相当大的开销。

这就是为什么我确信你在这里看到错误的嫌疑人,使APC分布式,它将处于相同的性能/吞吐量类别。

+0

OTOH中详细说明引擎盖下的部分,看起来如果可以通过SHM访问memcached,可能会加速memcached (如果不在那里,则回到网络),尽管你可能不得不放弃一些一致性保证。 – 2012-07-20 21:59:12

+0

@tc。当然可以完成,例如Informix提供shm作为服务器和客户端之间的替代通信路径,但这种设置的好处很难估计(因为它只在多节点设置中才有意义 - 否则只是坚持APC--这意味着总流量的很大一部分仍然会通过网络),并且代码复杂度会增加很多。 – fvu 2012-07-20 22:27:06

+0

够公平,相信。我认为最好的方法是同时使用APC和memcache。用于opCode缓存的APC和用于数据缓存的memcache(当我们有多个服务器时)。 – ALH 2012-07-21 04:35:03