【问题标题】:PHP: tmpfs vs memcachedPHP:tmpfs 与 memcached
【发布时间】:2015-05-25 01:13:18
【问题描述】:

我想在 RAM 中存储信息(会话和大量字符串),但我不知道应该使用 tmpfs 还是 memcached 服务器。有人做了一些基准测试并知道哪个更快?对于每个登录的用户每 1-5 秒请求一次信息的 ajax 脚本需要它,例如 PHP 中的网络聊天。所以 PHP 必须经常连接到 memcache。

使用 tmpfs 的好处应该是我可以创建很多文件并拥有一个结构 (dirs),而我在 memcached 中只有一个键值系统,但在那里我可以使用数组或对象来存储信息。 如果有任何区别,CPU 负载也会很有趣。

谢谢。

【问题讨论】:

    标签: php memcached


    【解决方案1】:

    只有几点

    1. tmpfs 或 ramdisk 比 memcached 更成熟(存在的时间更长,但两者都很稳定
    2. tmpfs 是可扩展的(您可以根据需要调整大小或增加而不会丢失 tmpfs 的内容
    3. 如果您需要另一台机器上的内存或需要在机器之间共享该信息,memcahced 非常适合。
    4. 本地文件/套接字/管道的性能总是比网络套接字快,并且在 tmpfs 中访问文件与任何其他文件相同,因此不需要任何第三方库。

    如果您不希望您的数据能够增加您服务器上的内存,请使用 tmpfs。

    如果您必须在服务器之间共享数据或想要存储更多适合本地服务器 RAM 的数据,请使用 memcahed。

    【讨论】:

      【解决方案2】:

      我不太了解速度,但这里有一些关于 memcached 需要考虑的事情:

      • memcached 基于集群式架构:您可以添加任意数量的物理服务器,在其上安装 memcached 守护程序,并且您的集群中有更多内存
        • 这意味着您可以使用 memcached 缓存的数据量几乎没有限制:如果您需要更多内存,只需添加几个服务器
        • 另一方面,使用 tmpfs,您会受到每台服务器上可用 RAM 量的限制
      • memcached 是一种缓存机制;它不是用来存储数据的;意思是 :
        • 当没有足够的内存来存储新项目时,旧项目将从缓存中删除
        • 每个项目都有一个生命周期;当它过期时,该项目将从缓存中删除
      • memcached 是共享的:您可以让多个 PHP 服务器访问单个 memcached 集群
      • 已有很多基于 memcached 的库,或者是为访问 memcached 而创建的
        • 包括一些 PHP 的会话机制
        • 和几个缓存库
      • memcached 和 tmpfs 都不是为了持久化而设计的——如果您需要持久化数据(即即使在重新启动后仍然可用),您需要使用数据库之类的东西。


      最后,不确定 tmpfs,但我可能会使用 memcached,至少在涉及到时:

      • 会话
      • 缓存

      为什么?因为它是:

      • 成熟——用的很多,库很多,...
      • 可扩展

      【讨论】:

      • 感谢您的回答。我正在使用 MySQL 数据库来存储用户信息,并且需要 memcached 或 tmpfs 来(临时)存储聊天消息,因为我不想在每个 ajax 请求中运行 db 查询;)。我不确定我应该如何将它存储在内存缓存中。聊天有多个房间,用户应该只看到他们应该看到的消息。我可以使用多个键值对。我认为 memcache 更适合我的项目 :)。
      • 哼 ;不确定非持久性机制是否是最佳选择,在这种情况下:例如,如果您想保留对话历史记录,则使用数据库会好得多;;;关于“不为每个 Ajax 请求访问数据库”、聊天想法和 Ajax 请求:您应该搜索“comet”:基本上,这是一种不让客户端频繁发送 Ajax 请求到服务器,但让服务器向客户端推送更新(在 stackoverflow 上有很多关于彗星的问题;也许有些问题可能会有所帮助 ;-)).
      • 我知道彗星,但不知道在这里是否有帮助。该脚本仍然需要查询 db / memcache 以获取新消息,因为 php 实例无法通信。我还尝试编写一个自己的 Web 服务器来解决这个问题(stackoverflow.com/questions/2357596/http-stream-server-threads),但我在 C#/C++ 方面做得不够好。
      【解决方案3】:

      ramdisk 和 memcached 都非常快。

      如果您使用 MySQL 来解决问题,我认为速度并不重要。

      我个人更喜欢 Redis 而不是 memcached。

      以下是优点/缺点:

      1. 如果没有 ram,memcached 可能会删除一个键。 Redis 和文件永远不会这样做。

      2. 如果会话不在文件中(例如 memcached / redis),则 Joomla 等某些软件无法安装

      3. memcache 和 redis 都可以为多个 php 服务器提供服务,因此您将无法在集群中使用固定会话。

      4. memcached 更快,然后是 redis,然后是 ramdisk,然后是 memcachedb,然后是 mysql,然后是文件系统会话。

      5. ramdisk 模仿正常的 php 会话行为,不需要安装任何东西。

      6. 如果 ramdisk 无法挂载,php 将回退到文件系统并且仍然可以工作(假设服务器启动)

      7. 如果 memcached 或 redis 停止工作,php 会出现严重错误并且根本无法启动。

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        对会话数据的写访问必须是原子的或受每个会话锁的保护,否则它将被损坏。对于基于文件的会话,它通过锁定文件来解决,不知道 memcached 是如何处理它的。 使用单独的 ext4 分区并不像您想象的那么糟糕 - VFS 会将您的文件 I/O 缓存RAM 中,因此您可能不需要任何不同的东西。 您可以微调 ext4(在分区上)以缓存您的写入,因此您可以获得类似 RAM 的性能和大于 RAM 大小的持久性。 例如,您可以通过以下方式获得回写缓存和 60 秒窗口(延迟提交):

        mount /dev/sda4 -t ext4 -o rw,data=writeback,nobh,commit=60  
        

        它运行速度很快,并且不会耗尽 RAM,它会使用 所有可用 RAM,因为文件系统缓存是动态的。 尝试在第二个文件上多次处理 4MB 文件(覆盖它),你会得到非常快的写入。

        【讨论】:

          【解决方案5】:

          实际上,您可以使用memcacheDB 来满足您的需求。

          【讨论】:

          • 请提供更多详细信息。当链接失去意义时,您的答案会更少。
          • 其实这不是个坏主意。 memcachedb 速度非常快。但是它比内存慢得多,我也不喜欢使用不稳定的软件。 (不确定 memcachedb 目前是否稳定)。为你的想法点赞
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-20
          • 1970-01-01
          • 2011-03-06
          • 2013-02-25
          • 2012-08-30
          • 1970-01-01
          • 2015-05-10
          相关资源
          最近更新 更多