Php 600+;memcache请求/s问题-帮助!

Php 600+;memcache请求/s问题-帮助!,php,nginx,memcached,Php,Nginx,Memcached,我在我的服务器上运行memcached,当它达到600+req/s时,它会变得不稳定,并导致大量问题。当请求率达到这么高时,我的PHP应用程序在随机时间无法连接到memcache服务器,导致加载时间缓慢,这使得nginx和PHP fpm崩溃,我在nginx日志中收到一堆104:Connection错误重置 我想指出的是,在我的memcache服务器中,我有“热对象”——这些对象有时会接收90%的memcache请求。我还注意到,当如此多的请求命中单个对象时,整个页面的加载时间会稍微多一些(当它成

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

我想指出的是,在我的memcache服务器中,我有“热对象”——这些对象有时会接收90%的memcache请求。我还注意到,当如此多的请求命中单个对象时,整个页面的加载时间会稍微多一些(当它成功加载时)


我将非常感谢对这个问题的任何帮助。非常感谢

对于memcached来说,600次每秒的请求量非常低


如果您为每个请求建立连接,您将花费比请求更多的时间进行连接,并且很快就会烧掉临时端口,这可能是您看到的问题。

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

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

从使用TCP套接字切换到UNIX套接字(假设您在基于UNIX的服务器上)

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

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

$memcache_obj = new Memcache;
$memcache_obj->pconnect('unix:///tmp/memcached.socket', 0);
另一个建议是,如果您有多个“类型”的缓存对象,请为每个“类型”启动一个memcached实例,并在其中分发您的热门项目

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

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

另一件事是验证你的memcache没有被放入交换文件,如果你的缓存小于你的平均可用ram,试着用-k选项启动memcache,这将迫使它的缓存始终留在ram中,并且不能交换


如果您有一个多核服务器,也要确保memcached是使用线程支持编译的,并使用
-t

启用它听起来像是一个您应该对serverfault提出的问题。我不希望强制使用解析器来减少问题。使用127.0.0.1实际上打开了一个套接字,虽然localhost是localhost套接字的别名(因此不会打开新套接字),但Linux不会这样做。PHP有一个特定的MySQL驱动程序可以实现这一点。不过,这是一个相当糟糕的设计决策。如果有人想要一个unix域套接字而不是TCP/IP套接字,那么他们应该询问他们想要什么。请注意,您的ulimit设置是否足够高?也许你已经达到了极限。我会检查你的ulimit是否有nginx、memcached和php-fpmI,但我不太清楚你在做什么,不足以提出很多建议。您似乎正在为每个请求建立连接。如果你是这样的话,那么出于上述原因,我建议你不要这样做。由于某种原因,当我使用套接字时,服务器运行了几分钟,然后非常慢。不知道为什么。。。