Php 高负荷平均zf2和x2B;简单页面上的原则

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

我使用ZendFramework2和条令来启动我的项目。我的CPU在
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
    是显示执行跟踪的好方法
  • 总而言之,使用调试器/分析器,比如
    xcode
    。有一些特性和很好的工具可以使用GUI工具分析结果,如。执行时间、内存消耗、逻辑树、图形等—所有这些都是供您探索的
我为文件缓存启用了opcache,为条令启用了memcache

郊游

OPcache通过在共享内存中存储预编译脚本字节码来提高PHP性能,从而消除了PHP在每个请求上加载和解析脚本的需要

因此,与文件缓存无关。这段引文说得非常清楚和简洁——它加快了php部分的速度。有一个(也与zend相关)告诉您memcache和memcached之间的区别;无论如何,如果您的数据库负载很重或者查询很慢/很重,这可能是一种补救方法

那么,平均负载接近5.0的原因是什么

这相当复杂,因为必须对整个系统进行分析。是的,可能只需要重做一部分代码,也可能整个应用程序出现严重问题,如Web服务器、数据库、缓存层的配置

我的建议是采取理智的方法,开始
逆向工程

  • 您确定只有服务器端速度慢吗?有外部脚本、大图像、字体吗
  • 然后按照第一个列表中的步骤进行操作
  • 如果仍然没有更改,请查看日志(尽管必须经常检查)
  • 检查系统配置-最近移动到了
    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__,
            ),
        ),
    );
}