Php 高负荷平均zf2和x2B;简单页面上的原则
我使用ZendFramework2和条令来启动我的项目。我的CPU在Php 高负荷平均zf2和x2B;简单页面上的原则,php,apache,zend-framework,doctrine-orm,zend-framework2,Php,Apache,Zend Framework,Doctrine Orm,Zend Framework2,我使用ZendFramework2和条令来启动我的项目。我的CPU在httpd请求上显示高使用率。我为文件缓存启用了opcache,为条令启用了memcache 知道为什么它的平均负载接近5.0吗?有一次我把die('test1')放在ZendFramework2的onBootstrap中,另一次我把die('test')放在前面 die('test2') Zend\Mvc\Application::init(require 'config/application.config.php')-&g
httpd
请求上显示高使用率。我为文件缓存启用了opcache
,为条令启用了memcache
知道为什么它的平均负载接近5.0吗?有一次我把die('test1')
放在ZendFramework2的onBootstrap
中,另一次我把die('test')
放在前面
die('test2')
Zend\Mvc\Application::init(require 'config/application.config.php')->run();
我的Apache测试台显示,当加载框架时,没有任何数据库连接,或者加载到任何控制器时,速度会慢5倍。为什么zf2会这样,有什么可能的解决方案来规范它的行为
[问题更新]
我用Xdebug和Webgrind进行了分析,发现像bootstrap这样的过程占很大比例
(应用程序\模块->启动)
在bootstrap上,我有这行代码
//...
$eventManager->attach(MvcEvent::EVENT_ROUTE, function($e) use ($blacklistForNormalUser, $auth) {
$match = $e->getRouteMatch();
// No route match, this is a 404
if (!$match instanceof RouteMatch) {
return;
}
// Route is whitelisted
$name = $match->getMatchedRouteName();
if (!in_array($name, $blacklistForNormalUser) ) {
return;
}
// User is authenticated
if ($auth->hasIdentity() ) {
return;
}
// Redirect to the user login page, as an example
$router = $e->getRouter();
if(in_array($name, $blacklistForNormalUser)){
$url = $router->assemble(array(), array(
'name' => 'user/login'
));
}
$response = $e->getResponse();
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302);
return $response;
}, -100);
//...
另一个高点是
条令\ORM\Mapping\Driver\AnnotationDriver->loadMetadataForClass
如果您的系统使用50个用户,但不是100个。那么,您的系统中可能存在瓶颈。当它超过50个用户的阈值时,可能会耗尽一些资源,从而导致负载快速上升 在字里行间,你正在使用一个灯组。有用的命令包括:
top
这会很快为您提供大量信息。查看最上面的行,在CPU行中查看处理器在哪些方面花费时间。非常高的%wa可能意味着等待来自db的磁盘IO
查看Mem:和Swap:行,检查低负载和高负载下的交换。如果它显著上升,则可能意味着您的系统内存不足。调整应用程序或添加更多内存
看看正在运行的任务,顶部显示了什么?httpd,可能是mysql或其他一些工具,比如正在运行并造成严重破坏的备份
尝试学习阅读系统中的信息。还有许多其他命令,如“free-m”或“vmstat-n5”,可能值得查找
如果没有任何帮助,那么一些Apache工具可能会有所帮助,这将显示Apache在任何给定时间处理的请求。此外,在apache中添加commonlog配置选项将使其记录服务每个请求所需的时间,然后您可以在日志中查找任何非常慢的脚本
在这一切之后——如果它仍然没有意义或者根本没有意义。请回答另一个问题,并添加有关系统的更多详细信息
感谢您添加了额外的细节,并与webgrind进行了良好的合作。有许多可能导致速度减慢的代码排列,但最好从一些基本的ZF2调优开始,这是一项有用的技能
默认情况下,让ZF2为视图和类查找文件非常容易。这大大降低了ZF2的速度,因为它必须在每个请求中找到它们。由于同样的原因,如果未使用绝对路径名加载文件,则Opcache的效率也会降低
ZF2在vendor/bin中有一个工具来帮助实现这一点,它生成类和文件位置的列表。对于应用程序文件夹中的每个模块
php classmap_generator.php -l "..\..\modules\MODULENAME"
e、 g
通过向Module.php文件中添加类似的内容来确保使用类映射:
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
这将通知Zend如何搜索要包含的文件并跳过猜测部分。在您的基准测试中,它应该明显更快。不会涉及任何特定的框架细节,只涉及一般的php。所以一点一点地思考这个问题 我的cpu在httpd请求上显示出高使用率 是否有任何繁重的计算或繁重的查询?可能其他系统进程使用CPU太多(失控进程)?这可能会发生,现在正是优化代码的适当时机
- 检查代码中的陷阱(循环、计算等的冗余)
是显示执行跟踪的好方法debug\u backtrace
- 总而言之,使用调试器/分析器,比如
。有一些特性和很好的工具可以使用GUI工具分析结果,如。执行时间、内存消耗、逻辑树、图形等—所有这些都是供您探索的xcode
逆向工程
- 您确定只有服务器端速度慢吗?有外部脚本、大图像、字体吗
- 然后按照第一个列表中的步骤进行操作
- 如果仍然没有更改,请查看日志(尽管必须经常检查)
- 检查系统配置-最近移动到了
nginx
,能够每秒多服务21倍的请求,静态文件也在飞行,内存消耗低(我知道与CPU无关)
我的apache测试台显示,当框架在没有任何数据库连接的情况下加载或转到任何控制器时,其速度会慢5倍
这很有趣,因为在与DB建立连接时,无论大小,总有一个开销
为什么zf2太重,解决方案是什么
我想不是
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}