Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony2 performance tweaking

Symfony2 was looking so promising, powerful and flexible. So we were going to use Symfony2 + mongodb for one of our projects. But it appeared too slow (Apache/2.2.25 + PHP/5.4.20). Currently the app is pretty simple. but I have noticed that the httpd.exe lads CPU up to 28% when some simple page is loaded. The page is quite lite - just user profile info and the list of his posts. I even can't imagine how hundreds of users can be served (not even talking about numbers like 100k users) if performance will not be much better.

For instance the CPU load is 2% when opening the heavy 'products' page of ActivationCloud account (which fetches a good amount of data) (PHP+Smarty+SQL).

After taking a look on Xdebug output, I have found that a gret deal of time 20% is utilized by ClassLoader->loadClass(...) - 265 calls Xdebug Symfony2 app

After performing the following steps:

*generated class map

php composer.phar dump-autoload --optimize

*installed and enabled 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

expected a miracle after it but it did not happen.

*enabled APC class loader - in Symfony\web\app.php uncommented

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

The ClassLoader->loadClass(...) got better 'Self' is 11 instead of 21 Xdebug Symfony2 app after some tweaking

Frankly speaking I was shocked by what I saw in xdebug :( a lot of repetitive calls like Container->get(...) -317 calls, DocumentManager->getClassMeataData(...) - 301 calls. Totally more than 2k of function calls. Hard to believe that.

These bundles are installed:

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;
    }

It was sad to find that Symfony2 got one of the worst benchmark results among others php frameworks http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=json&l=sg

At the same time Francois Zaninotto said in his blog http://symfony.com/blog/who-really-uses-symfony that Yahoo uses Symfony2 for the bookmarks service, tried some apps form the list http://trac.symfony-project.org/wiki/ApplicationsDevelopedWithSymfony - they are not looking slow also on Quora http://www.quora.com/Who-is-using-Symfony2-in-production its spoken that dailymotion is using it as well.

How to make the performance acceptable?

like image 448
ChatCloud Avatar asked Jan 11 '14 19:01

ChatCloud


1 Answers

Got Symfony working x10 faster after adding the

realpath_cache_size = 4096k

to php.ini

like image 175
ChatCloud Avatar answered Sep 28 '22 07:09

ChatCloud