我在Azure上有一个高负载的部署:4个大型实例,每秒可处理300-600个请求。在正常情况下:“平均响应时间”为70到150ms,但有时可能会增长到200-300ms,但这绝对可以。
但是,每天一次或两次(不在“高峰时间”),我在“网站监视”选项卡上看到以下图片:
因此,每分钟的请求数量显着下降,平均响应时间增加到3分钟,然后过一会儿–一切恢复正常。
在此“中断”期间,只有0.1%的请求被丢弃(带有超时的Http服务器错误),其他请求仅在队列中等待,通常在几分钟后得到处理。虽然,并非所有客户都准备好等待:-(
内存使用率始终低于30%,CPU使用率仅高达40-50%。
我已经检查了什么?:
出现此类问题的原因可能是什么?接下来我要检查什么?
谢谢大家!
更新1 :BenV建议尝试尝试的好东西,但是很遗憾,它什么都没显示:-(
我配置了每500k请求回收一次的进程,并添加了工作节点,因此CPU利用率现在整天不足40%,但是仍然会出现中断。
更新2 :项目使用ASP.Net MVC 4。
最佳答案
我有这个完全相同的问题。对我来说,我在日志中看到很多WinCache错误。
每当站点失败时,日志中就会出现很多WinCache错误。 IIS通过WinCache来处理PHP,以尝试加快处理速度。这是Microsoft内置的加载项,默认情况下在IIS和所有Azure网站中启用。 WinCache将被挂起,而不是回收和继续使用,它将消耗实例上的所有内存和文件句柄,从而将其锁定。
我在Azure门户中添加了新的应用程序设置,以扫描文件夹中的php.ini设置更改。
d:\home\site\ini
在 d:\home\site\ini\settings.ini中添加了一个文件
包含以下内容
wincache.fcenabled=1
session.save_handler = files
memory_limit = 256M
wincache.chkinterval=5
wincache.ucachesize=200
wincache.scachesize=64
wincache.enablecli=1
wincache.ocenabled=0
这会做一些事情:
wincache.fcenabled=1
使用WinCache启用文件缓存(我仍然认为这是默认设置)
session.save_handler = files
将 session 处理程序从WinCache(Azure默认)更改为基于标准文件,以减轻缓存引擎压力
memory_limit = 256M
wincache.chkinterval=5
wincache.ucachesize=200
wincache.scachesize=64
wincache.enablecli=1
将WinCache的大小设置为每个线程256 MB,并限制整体缓存的大小。这将迫使WinCache清除旧数据并更频繁地回收缓存。
wincache.ocenabled=0
这是大个子。禁用WinCache操作代码缓存。那就是WinCache将实际的PHP脚本缓存到内存中。文件仍然从第一行缓存,但是PHP是按常规解释的,而不是缓存到大型二进制文件中。
我从每三天一次的日志看起来像您的Azure崩溃到现在为止连续120天没有任何问题。
祝你好运!