600+ memcache req / s问题 - 帮助!

时间:2011-07-21 04:30:21

标签: php nginx memcached

我在我的服务器上运行memcached,当它达到600+ req / s时,它变得不稳定并导致大量问题。当请求率变得那么高时,我的PHP应用程序在随机时间无法连接到memcache服务器,导致加载时间慢,这使得nginx和php-fpm发疯,我收到了一堆104:连接由同行重置我的nginx日志中的错误。

我想指出,在我的memcache服务器中,我有'热对象' - 有时会收到90%memcache请求的对象。我还注意到当这么多请求命中一个对象时,它会略微增加整个页面的加载时间(当它设法加载时)。

我非常感谢对此问题的任何帮助。非常感谢!

3 个答案:

答案 0 :(得分:7)

切断使用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,文件等)检索对象

另一件事是验证你的memcache没有被放入交换文件,如果你的缓存小于你的平均空闲ram,尝试使用-k选项启动memcache,这将强制它的缓存始终保持在ram并且无法交换。

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

答案 1 :(得分:1)

memcached每秒600个请求非常低。

如果您为每个请求建立连接,那么您将花费更多时间连接而不是请求并快速刻录您的短暂端口,这可能是您所看到的问题。

答案 2 :(得分:0)

你可以尝试一些事情:

  • 如果你在本地运行memcached,你可以使用命名套接字'localhost'而不是'127.0.0.1'
  • 使用persisntent连接