elw*_*ood 13 php apache caching symfony doctrine-orm
我开发了大约10个不同的网站,托管在一台服务器上,下面提到了规范.
故事:
一切都运行良好,直到我决定将PHP操作码缓存集成到系统中.我首先尝试使用APC,但是Xcache出现了同样的问题,所以我认为它与缓存程序本身无关.
系统保持稳定一段时间,从一天到一周不等,并在不同时间崩溃,但主要在晚上23h-05h左右.如果我重新启动httpd服务,系统在同一时间段(1天到1周)内再次稳定,并再次崩溃等...
错误报告:
这是上次崩溃期间我的httpd全局日志的报告:
[Thu Feb 18 20:00:11.270997 2016] [core:notice] [pid 24956:tid 139940499228480] AH00052: child pid 4522 exit signal Aborted (6)
httpd: hostip.c:693: Curl_resolv_unlock: Assertion `dns && (dns->inuse>0)' failed.
[Thu Feb 18 20:08:38.793218 2016] [core:notice] [pid 24956:tid 139940499228480] AH00052: child pid 6246 exit signal Aborted (6)
httpd: hostip.c:693: Curl_resolv_unlock: Assertion `dns && (dns->inuse>0)' failed.
[Thu Feb 18 22:12:33.576308 2016] [core:notice] [pid 24956:tid 139940499228480] AH00052: child pid 8362 exit signal Aborted (6)
httpd: hostip.c:693: Curl_resolv_unlock: Assertion `dns && (dns->inuse>0)' failed.
[Thu Feb 18 22:40:07.297428 2016] [core:notice] [pid 24956:tid 139940499228480] AH00052: child pid 10224 exit signal Aborted (6)
[Thu Feb 18 23:00:40.526867 2016] [core:warn] [pid 24956:tid 139940499228480] AH00045: child process 10846 still did not exit, sending a SIGTERM
...
Run Code Online (Sandbox Code Playgroud)
请注意,服务器在22:41:xx附近被阻止.我在23:00:xx重启服务器,这与此处发布的最后一行有关.
它可能与curl有关,我经常使用它,特别是PHP curl_multi,以便通过同时启动它来加速我的API调用.但是,如果没有安装(或禁用)任何PHP操作码缓存,也会发生同样的错误,但它不会导致服务器崩溃.
服务器状态:
当发生"崩溃"时,系统仍可以提供任何txt,image等文件,但它不能提供任何PHP文件.服务器被锁定,当看到"Apache服务器状态"时,可能有一百个请求处于"W"状态,随着每个传入请求而增加.
缓存实施:
如上所述,我尝试使用APC和xCache,但它们都产生了同样的问题.我的PHP是一个编译版本(我没有自己编译).所有网站上都有一个Varnish缓存,只缓存一些耗时的页面.我正在使用Symfony2和Doctrine2,通过Symfony2配置在Doctrine2和xcache/apc之间建立链接:
doctrine:
orm:
auto_generate_proxy_classes: prod
auto_mapping: true
metadata_cache_driver: xcache
result_cache_driver: xcache
query_cache_driver: xcache
Run Code Online (Sandbox Code Playgroud)
它似乎允许Doctrine2缓存实体对象并产生更好的性能(仅对Doctrine2启用缓存不够)
规格:
- Debian 7.8
- Apache 2.4.12
- Mysql
- PHP 5.4.38 (compiled version)
- Varnish
- Symfony 2.4.x
Run Code Online (Sandbox Code Playgroud)
任何提示或帮助将受到极大的欢迎,因为我一直在寻找解决方案几个月,并且运行PHP-Symfony2网站的速度很快,没有任何操作码缓存
您是否有任何特定的cron作业在服务器崩溃时运行?
在任何情况下,如果你Curl_resolv_unlock: Assertion 'dns && (dns->inuse>0)' failed
在日志中看到,这意味着你在PHP中有一个libcurl的"调试版本",这是不好的.
您的评论提到PHP说Apache 2.0 Handler,因此它作为Apache模块运行.
当调试断言在libcurl中命中时,它会导致进程(PHP)终止.基本上我认为正在发生的是Apache的PHP处理(处理所有PHP请求)正在消亡.这就是为什么你仍然可以提供静态资源但PHP进程不断堆叠的原因.
cURL 7.26.0相当陈旧(2012年5月).我建议安装更新版本的libcurl,然后用它重新编译PHP并确保cURL不是调试版本,看看这是否有帮助.
我不能建议您确切的解决方案,但我可以建议您通过trick
解决方法解决您的问题并提出debug
想法
一个技巧:你可以通过curl一个网站进行监控cronjob
,每个5-10m的请求都会被监控,如果他得到负面响应或请求超时过期(将其设置为一些大数字,如30秒或1分钟),你将重新启动你的httpd
服务器+你可以清理你cache
然后重新启动
调试:要调试您的问题,您可以从memory monitoring
. 我想问题的根源是,在你的错误期间,你的系统内存泄漏,这使得你的httpd
服务器崩溃,这意味着你必须用等等curl
来调试和处理你的错误try/catch
......
归档时间: |
|
查看次数: |
416 次 |
最近记录: |