我在我的服务器上运行memcached,当它达到600+ req / s时,它变得不稳定并导致大量问题。当请求率变得那么高时,我的PHP应用程序在随机时间无法连接到memcache服务器,导致加载时间慢,这使得nginx和php-fpm发疯,我收到了一堆104:连接由同行重置我的nginx日志中的错误。
我想指出,在我的memcache服务器中,我有'热对象' - 有时会收到90%memcache请求的对象。我还注意到当这么多请求命中一个对象时,它会略微增加整个页面的加载时间(当它设法加载时)。
我非常感谢对此问题的任何帮助。非常感谢!
答案 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)
你可以尝试一些事情: