代码之家  ›  专栏  ›  技术社区  ›  Sandeep Jindal

memcached与性能

  •  2
  • Sandeep Jindal  · 技术社区  · 12 年前

    我可能问了一个非常基本的问题,但在谷歌上找不到明确的答案,所以把它放在这里。

    Memcached将信息缓存在一个单独的进程中。因此,为了获得缓存的信息,需要进程间通信(通常是java中的序列化)。这意味着,一般来说,要获取缓存的对象,我们需要获取一个序列化的对象,并将其传输到网络。

    串行化和网络通信都是成本高昂的操作。如果memcached需要同时使用这两者(一般来说,可能存在不需要网络通信的情况),那么memcached的速度如何?复制不是更好的解决方案吗?

    或者这是分布/平台独立性/可伸缩性与性能之间的权衡?

    3 回复  |  直到 12 年前
        1
  •  4
  •   Tom Anderson    12 年前

    你说得对,在共享缓存(比如memcached)中查找东西比在本地缓存中查找慢(我认为这就是你所说的“复制”)。

    然而,共享缓存的优势在于它是共享的,这意味着与将内存用于本地缓存相比,缓存的每个用户都可以访问更多的缓存。

    考虑一个应用程序,它有一个50 GB的数据库,有十个应用程序服务器,每个服务器都有1 GB的内存用于缓存。如果使用本地缓存,那么每台机器将有1 GB的缓存,相当于数据库总大小的2%。如果使用共享缓存,则有10 GB的缓存,相当于数据库总大小的20%。本地缓存的缓存命中率会更快,但共享缓存的缓存点击率会高得多。由于缓存未命中比任何一种缓存命中都要昂贵得多,因此稍微慢一点的命中是值得为减少未命中次数而付出的代价。

    现在,确切的权衡确实取决于本地命中、共享命中和未命中成本的确切比率,也取决于数据库上访问的分布。例如,如果所有的访问都是对一组大小小于1GB的“热”记录的访问,那么本地缓存将提供100%的命中率,并且与共享缓存一样好。不那么极端的分布仍然可能使平衡发生倾斜。

    在实践中,最佳配置通常(IMHO!)是为最热的数据提供一个较小但非常快的本地缓存,然后为长尾提供一个较大且较慢的缓存。你可能会将其视为其他缓存层次结构的形状:考虑一下处理器为每个核心提供小型、快速的L1缓存,然后在单个裸片上的所有核心之间共享较慢的L2/L3缓存,然后可能由系统中的所有裸片共享较慢的片外缓存(当前的处理器真的使用片外缓存吗?)。

        2
  •  4
  •   Mike Brant    12 年前

    您在考虑中忽略了磁盘i/o的成本,这通常是任何进程中最慢的部分,也是使用内存缓存(如memcached)的主要驱动因素IMO。

        3
  •  1
  •   Mihai Stancu    12 年前

    内存缓存通过网络使用ram内存。复制同时使用ram内存和持久磁盘内存来获取数据。它们的目的非常不同。

    如果您只想使用Memcached来存储容易获得的数据,例如表记录的1-1映射:you-re-gonna-have-a-bad-time:。

    另一方面,如果您的数据是一个复杂SQL查询的整个结果集,该查询甚至可能会移动SQL内存池(并且需要临时写入磁盘才能提取),那么您将看到一个巨大的加速。

    前面的示例提到需要将数据写入磁盘 阅读 操作-是的,如果结果集对于内存来说太大,就会发生这种情况(想象一个 CROSS JOIN )这意味着你既可以读也可以写(脑海中浮现出颠簸)。

    例如,在用C编写的高度优化的应用程序中,您可能有1microsoft的总处理时间,并且可能需要等待联网和/或序列化/反序列化(封送/解组)的时间比应用程序执行时间本身长得多。从那时起,您也会开始感受到网络上内存缓存的局限性。