我遇到了一个奇怪的问题,我在调试时遇到了麻烦。我有一个基于Symfony2的应用程序,分布在负载均衡器后面的三个over服务器上。在每个one服务器上都有一个Varnish实例。
在随机的时间,一些或两个then服务器-one,很少是所有的-在主页上响应503错误大约10分钟左右,然后一切都恢复正常。
该错误是由PHP允许的内存大小耗尽致命错误引起的。但我不能理解的是,为什么相同的应用程序,使用相同的代码,连接到相同的数据库等,从一个时刻到另一个时刻失败,然后又一次恢复正常。甚至在具有相同硬件和软件的不同服务器上的相同应用程序也会同时表现不同。
我的第一个猜测是Varnish缓存在故障服务器上过期了,而那些正常运行的服务器仍然有一个新的副本被缓存,没有错误。但是,如果我手动刷新所有服务器上的缓存,没有错误的服务器以200 OK响应,缓存重新生成成功,而其他服务器仍然失败。
更奇怪的是...我意识到,相同的URL在一些随机查询参数失败的情况下,可以正确地响应一些其他参数。我指的是在代码中不做任何事情的参数。
关于如何调试这个问题,我已经没有想法了。任何线索都将不胜感激。谢谢!
更新:我也在使用Memcached来缓存Doctrine查询和结果。当Doctrine尝试在Memcached中存储内容时,会触发内存耗尽错误。第一个猜测是,它试图存储一个非常大的结果,但它仍然不能解释为什么它在一个why服务器上失败,而在其他why服务器上没有问题,所有这些服务器都在处理来自同一个数据库的相同查询。
发布于 2015-01-22 20:37:43
对我来说,这听起来像是你有一些行为糟糕的PHP脚本和/或太高的PHP最大允许内存。每个进程有大约15mb可供备用的Memory_limit *最大进程数不应高于可用内存。如果你需要更多的内存来处理一些请求,你应该设置一个更少的最大处理器池。
也要考虑到清漆可能会占用相当大的内存块。限制缓存大小和最大并发连接数。每个连接都使用内存,但ammount高度依赖于您的VCL和请求的大小(包括报头)。
如果您在负载均衡器层放置varnish,它可能会更容易处理,并且肯定会提供更好的缓存效率。
https://stackoverflow.com/questions/28035487
复制