2014-01-11 16 views
6

Symfony2 sah so vielversprechend, leistungsstark und flexibel aus. Also würden wir Symfony2 + mongodb für eines unserer Projekte verwenden. Aber es erschien zu langsam (Apache/2.2.25 + PHP/5.4.20). Derzeit ist die App ziemlich einfach. aber ich habe festgestellt, dass die httpd.exe die CPU bis zu 28% belastet, wenn eine einfache Seite geladen wird. Die Seite ist ziemlich lite - nur Benutzerprofilinformationen und die Liste seiner Beiträge. Ich kann mir gar nicht vorstellen, wie Hunderte von Benutzern bedient werden können (nicht einmal über Nummern wie 100k Nutzer), wenn die Leistung nicht viel besser ist.Symfony2 Leistungsoptimierung

Zum Beispiel ist die CPU-Auslastung 2% beim Öffnen der schweren 'Produkte' Seite des ActivationCloud Accounts (der eine gute Datenmenge abruft) (PHP + Smarty + SQL).

Nach einem Blick auf Xdebug Ausgang nehmen, habe ich festgestellt, dass ein gret viel Zeit 20% von ClassLoader- genutzt wird> loadclass (...) - 265 Anrufe Xdebug Symfony2 app

Nachdem Sie die folgenden Schritte ausführen:

* generierte Klasse Karte

php composer.phar dump-autoload --optimize 

* installiert und aktiviert

APC
[APC] 
    extension=php_apc.dll 

    apc.enabled=1 
    apc.shm_segments=1 

    ;32M per WordPress install 
    apc.shm_size=128M 

    ;Relative to the number of cached files (you may need to 
watch your stats for a day or two to find out a good number) 
    apc.num_files_hint=7000 

    ;Relative to the size of WordPress 
    apc.user_entries_hint=4096 

    ;The number of seconds a cache entry is allowed to idle 
in a slot before APC dumps the cache 
    apc.ttl=7200 
    apc.user_ttl=7200 
    apc.gc_ttl=3600 

    ;Setting this to 0 will give you the best performance, as APC will 
    ;not have to check the IO for changes. However, you must clear 
    ;the APC cache to recompile already cached files. If you are still 
    ;developing, updating your site daily in WP-ADMIN, and running W3TC 
    ;set this to 1 
    apc.stat=1 

    ;This MUST be 0, WP can have errors otherwise! 
    apc.include_once_override=0 

    ;Only set to 1 while debugging 
    apc.enable_cli=0 

    ;Allow 2 seconds after a file is created before 
it is cached to prevent users from seeing half-written/weird pages 
    apc.file_update_protection=2 

    ;Leave at 2M or lower. WordPress does't have any file sizes close to 2M 
    apc.max_file_size=2M 

    ;Ignore files 
    apc.filters = "/var/www/apc.php" 

    apc.cache_by_default=1 
    apc.use_request_time=1 
    apc.slam_defense=0 
    apc.mmap_file_mask=/var/www/temp/apc.XXXXXX 
    apc.stat_ctime=0 
    apc.canonicalize=1 
    apc.write_lock=1 
    apc.report_autofilter=0 
    apc.rfc1867=0 
    apc.rfc1867_prefix =upload_ 
    apc.rfc1867_name=APC_UPLOAD_PROGRESS 
    apc.rfc1867_freq=0 
    apc.rfc1867_ttl=3600 
    apc.lazy_classes=0 
    apc.lazy_functions=0 

erwartet ein Wunder danach aber es ist nicht passiert.

* aktiviert loader APC-Klasse - in Symfony \ web \ app.php uncommented

/* 
$loader = new ApcClassLoader('sf2', $loader); 
$loader->register(true); 
*/ 

Die ClassLoader-> loadclass (...) noch besser geworden 'Selbst' 11 statt 21 Xdebug Symfony2 app after some tweaking

Ehrlich gesagt war ich schockiert von dem, was ich in xdebug sah :(viele wiederholte Anrufe wie Container-> get (...) -317 Aufrufe, DocumentManager-> getClassMeataData (...) - 301 Aufrufe. Völlig mehr als 2k Funktionsaufrufe, kaum zu glauben, dass.

Diese Pakete installiert sind:

class AppKernel extends Kernel 
{ 
    public function registerBundles() 
    { 
     $bundles = array(
      new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), 
      new Symfony\Bundle\SecurityBundle\SecurityBundle(), 
      new Symfony\Bundle\TwigBundle\TwigBundle(), 
      new Symfony\Bundle\MonologBundle\MonologBundle(), 
      new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), 
      new Symfony\Bundle\AsseticBundle\AsseticBundle(), 
      new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), 
      new Doctrine\Bundle\MongoDBBundle\DoctrineMongoDBBundle(), 
      new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), 
      new HWI\Bundle\OAuthBundle\HWIOAuthBundle(), 
      new Knp\Bundle\MenuBundle\KnpMenuBundle(), 
      ... our bundles ... 

     ); 

     if (in_array($this->getEnvironment(), array('dev', 'test'))) { 
      $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); 
      $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); 
      $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); 
     } 

     return $bundles; 
    } 

Es war traurig zu finden, dass Symfony2 bekam eine der schlimmsten Benchmark-Ergebnisse unter anderem PHP http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=json&l=sg

Zugleich Francois Zaninotto in seinem Blog, sagte Frameworks http://symfony.com/blog/who-really-uses-symfony dass Yahoo Anwendungen Symfony2 für den Lesezeichen-Dienst, versuchte einige Anwendungen aus der Liste http://trac.symfony-project.org/wiki/ApplicationsDevelopedWithSymfony - sie suchen nicht langsam auch auf Quora http://www.quora.com/Who-is-using-Symfony2-in-production seine Sprache, dass dailymotion es auch verwendet.

Wie wird die Leistung akzeptabel?

+0

Nicht sicher den Rest seiner Antwort auf php.ini, sondern als 1ed erwähnt; Stellen Sie sicher, dass Sie alle drei Doctrine-Caches eingeschaltet haben, es macht einen großen Unterschied. Führen Sie diese Tests auch in der Prod- oder Entwicklungsumgebung aus? – Mathew

Antwort

6

Got Symfony arbeiten x10 schneller nach dem

realpath_cache_size = 4096k 

Hinzufügen

0

Zuerst sollten Sie Linux verwenden (Sie erwähnten https.exe, so denke ich, dass Sie Windows verwenden). Dann sollten Sie nginx anstelle von Apache und php-5.5 mit fpm anstelle von mod_php verwenden. Opcache anstelle von apc (übrigens apc.stat sollte ausgeschaltet werden). Doctrine-Caches sollten aktiviert sein, und dann sollten Sie das http-Caching verwenden, wo immer Sie können. (Sie können packagist's Code für einige Hinweise anzeigen.)

+0

funktioniert es unter Linux viel schneller? Wir werden bei Windows für die Entwicklung bleiben, aber die Produktion wird sicher unter Linux laufen. – ChatCloud

+0

Ich habe keine genauen Zahlen, aber Linux ist sicher schneller (nach einer schnellen Google-Suche [# 1] (http://www.paessler.com/webstress/sample_performance_tests/comparing_php_script_performance_on_linux_and_windows), [# 2] (http: //serverfault.com/questions/317199/linux-vs-windows-7-web-server-performance-differences)). – 1ed

+0

BTW mod_php ist schneller als alle Fastcgi-Methoden für PHP-Inhalte. Es ist * nur *, dass es wegen einer Beschränkung auf Threads pro Apache-Instanz andere Nicht-PHP-Anfragen "nach unten" ziehen würde und auch eine höhere Speicherauslastung für diese Nicht-PHP-Anfragen zum Laden von mod_php jedes Mal auferlegen würde. Eine einfache Lösung hierfür ist die Verwendung eines Reverse-Proxy (wie z. B. Firnis), um statische Inhalte zwischenzuspeichern und sie zu bedienen, bevor sie Apache erreichen. – Populus