我在我的服务器上运行 memcached,当它达到 600+ req/s 时,它变得不稳定并导致大量问题。看起来当请求率变得那么高时,我的 PHP 应用程序在随机时间无法连接到 memcache 服务器,导致加载时间变慢,这使得 nginx 和 php-fpm 崩溃,我收到一堆 104: Connection reset by peer我的 nginx 日志中的错误。
我想指出,在我的内存缓存服务器中,我有“热门对象”——有时会收到 90% 的内存缓存请求的对象。我还注意到,当如此多的请求命中单个对象时,它会稍微增加整个页面的加载时间(当它设法加载时)。
如果您对这个问题有任何帮助,我将不胜感激。非常感谢!
最佳答案
从使用 TCP 套接字转而使用 UNIX 套接字(假设您在基于 unix 的服务器上)
在启用套接字的情况下启动 memcached:
添加-s /tmp/memcached.socket
到您的 memcached 启动行(注意,套接字禁用网络支持)
然后在 PHP 中,使用持久连接进行连接,并连接到新的内存缓存套接字:
$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>
启用它。
关于php - 600+ memcache req/s 问题 - 帮助!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6771261/