【问题标题】:600+ memcache req/s problems - help!600 多个内存缓存请求/秒问题 - 帮助!
【发布时间】:2011-10-09 22:03:59
【问题描述】:

我在我的服务器上运行 memcached,当它达到 600+ req/s 时,它变得不稳定并导致大量问题。似乎当请求率变得如此之高时,我的 PHP 应用程序随机无法连接到 memcache 服务器,导致加载时间缓慢,这使得 nginx 和 php-fpm 崩溃,我收到一堆 104: Connection reset by peer我的 nginx 日志中的错误。

我想指出,在我的内存缓存服务器中,我有“热对象”——有时会收到 90% 的内存缓存请求的对象。我还注意到,当这么多请求针对单个对象时,它会稍微增加整个页面的加载时间(当它设法加载时)。

对于这个问题的任何帮助,我将不胜感激。非常感谢!

【问题讨论】:

  • 听起来像是你应该在 serverfault 上提出的问题。

标签: php nginx memcached


【解决方案1】:

从使用 TCP 套接字转而使用 UNIX 套接字(假设您在基于 unix 的服务器上)

在启用套接字的情况下启动 memcached: 将 -s /tmp/memcached.socket 添加到您的 memcached 启动行(注意,套接字禁用网络支持)

然后在 PHP 中,使用持久连接进行连接,并连接到新的 memcache 套接字:

$memcache_obj = new Memcache;
$memcache_obj->pconnect('unix:///tmp/memcached.socket', 0);

另一个建议,如果您有多种“类型”的缓存对象,请为每种“类型”启动一个 memcached 实例,并在它们之间分配您的热门项目。

Drupal 是这样做的,你可以看到他们的配置文件和 memcached init 是如何设置的here

另外,在我看来,您的 memcached 超时设置为高。如果超过 1 或 2 秒,您可以锁定脚本。应该达到超时,并且脚本应该默认通过另一种方法(SQL、文件等)检索对象

另一件事是验证你的内存缓存没有被放入交换文件,如果你的缓存小于你的平均可用内存,请尝试使用 -k 选项启动内存缓存,这将强制它的缓存始终留在ram,不能交换。

如果你有一个多核服务器,还要确保 memcached 编译时支持线程,并使用 -t <numcores> 启用它

【讨论】:

  • 由于某种原因,当我使用套接字时,服务器运行良好几分钟,然后非常慢。不知道为什么...
【解决方案2】:

您可以尝试以下几种方法:

  • 如果您在本地运行 memcached,则可以使用命名套接字“localhost”而不是“127.0.0.1”
  • 使用持久连接

【讨论】:

  • 我不希望强制使用解析器来减少问题。
  • 使用 127.0.0.1 实际上打开了一个套接字,而 localhost 是 localhost 套接字的别名(因此不会打开一个新的)
  • Linux 不这样做。有一个特定的 PHP 的 MySQL 驱动程序可以做到这一点。不过,这是一个非常糟糕的设计决定。如果有人想要一个 unix 域套接字而不是 TCP/IP 套接字,那么他们应该询问他们想要什么。
  • 在相关说明中,您的 ulimit 设置是否足够高?也许你已经达到了极限。
  • 我会检查你的 nginx、memcached 和 php-fpm 的 ulimit
【解决方案3】:

每秒 600 个请求对于 memcached 来说非常低。

如果您为每个请求都建立连接,那么您将花费更多的时间来连接而不是请求,并且非常快速地烧毁您的临时端口,这可能是您遇到的问题。

【讨论】:

  • 我不太清楚你在做什么足以提出很多建议。您似乎正在为每个请求建立连接。如果您是,那么出于上述原因,我建议您不要这样做。
猜你喜欢
  • 2019-05-16
  • 2019-10-30
  • 2015-01-27
  • 2016-04-08
  • 1970-01-01
  • 2013-11-14
  • 2013-09-15
  • 2014-01-30
  • 1970-01-01
相关资源
最近更新 更多