Installing Symfony
From symfony.com/download we get the latest (2.4.4) version of Symfony. I have unpacked it and put it in the directory “/home/maurits/public_html”. In “app/AppKernel.php” I moved the “AcmeDemoBundle” to the production section and in “routing.yml” I added the “_acme_demo” route that was originally in “routing_dev.yml”.
Test environment
I tested on my i5-2300 CPU with 16GB of RAM and an SSD. To run a benchmark, I installed on my Ubuntu 14.04 both Apache 2.4 with PHP 5.5 and Nginx 1.4 with HHVM 3. I used Apache Bench (ab) to test the “/demo” path on both web servers. In Apache, I disabled XDebug and enabled Zend OPcache.
Install and configure HHVM 3 with Nginx 1.4 for Symfony
For HHVM, we find pre-built (64-bit) packages listed on Github. This is how you install them on Ubuntu 14.04:
wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add - echo deb http://dl.hhvm.com/ubuntu trusty main | sudo tee /etc/apt/sources.list.d/hhvm.list sudo apt-get update sudo apt-get install hhvm
First we install Nginx from the Ubuntu 14.04 repository using:
sudo apt-get install nginx
Now we configure Nginx using the “normal” FastCGI configuration:
server { listen 8080; server_name sf2testproject.dev; root /home/maurits/public_html/web; location / { # try to serve file directly, fallback to rewrite try_files $uri @rewriteapp; } location @rewriteapp { # rewrite all to app.php rewrite ^(.*)$ /app.php/$1 last; } location ~ ^/(app|app_dev|config)\.php(/|$) { fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; } }
Single request
When doing a single request and analyzing the response times using the Firebug “Net” panel there is no noticeable difference. This is probably because the threads do not have to compete for CPU. So let’s skip this and do some load testing.
Apache Bench results (Symfony 2.4 / Apache 2.4 / PHP 5.5)
maurits@nuc:~$ ab -c 10 -n 2000 http://sf2testproject.dev/demo/ This is ApacheBench, Version 2.3 <$Revision: 1528965 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking sf2testproject.dev (be patient) Completed 200 requests Completed 400 requests Completed 600 requests Completed 800 requests Completed 1000 requests Completed 1200 requests Completed 1400 requests Completed 1600 requests Completed 1800 requests Completed 2000 requests Finished 2000 requests Server Software: Apache/2.4.7 Server Hostname: sf2testproject.dev Server Port: 80 Document Path: /demo/ Document Length: 4658 bytes Concurrency Level: 10 Time taken for tests: 9.784 seconds Complete requests: 2000 Failed requests: 0 Total transferred: 9982000 bytes HTML transferred: 9316000 bytes Requests per second: 204.42 [#/sec] (mean) Time per request: 48.918 [ms] (mean) Time per request: 4.892 [ms] (mean, across all concurrent requests) Transfer rate: 996.36 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 3 Processing: 18 49 10.9 50 90 Waiting: 15 41 10.1 41 78 Total: 18 49 10.9 50 91 Percentage of the requests served within a certain time (ms) 50% 50 66% 54 75% 56 80% 58 90% 62 95% 65 98% 69 99% 73 100% 91 (longest request)
Apache Bench results (Symfony 2.4 / Ningx 1.4 / HHVM 3)
maurits@nuc:~$ ab -c 10 -n 2000 http://sf2testproject.dev:8080/demo/ This is ApacheBench, Version 2.3 <$Revision: 1528965 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking sf2testproject.dev (be patient) Completed 200 requests Completed 400 requests Completed 600 requests Completed 800 requests Completed 1000 requests Completed 1200 requests Completed 1400 requests Completed 1600 requests Completed 1800 requests Completed 2000 requests Finished 2000 requests Server Software: nginx/1.4.6 Server Hostname: sf2testproject.dev Server Port: 8080 Document Path: /demo/ Document Length: 4658 bytes Concurrency Level: 10 Time taken for tests: 4.678 seconds Complete requests: 2000 Failed requests: 0 Total transferred: 9900000 bytes HTML transferred: 9316000 bytes Requests per second: 427.50 [#/sec] (mean) Time per request: 23.392 [ms] (mean) Time per request: 2.339 [ms] (mean, across all concurrent requests) Transfer rate: 2066.52 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 1 Processing: 8 23 11.5 21 84 Waiting: 8 22 11.3 20 84 Total: 8 23 11.5 21 84 Percentage of the requests served within a certain time (ms) 50% 21 66% 26 75% 30 80% 32 90% 39 95% 46 98% 54 99% 58 100% 84 (longest request)
Conclusion
On both setups, I did not do any optimization. I just installed and ran the benchmark. It seems that Symfony 2.4 on HHVM is about twice as fast as on PHP 5.5. In a real life setup this means you need half the machines. This seem like a good cost reduction at first, but it may not be as good as it looks. I believe that in reality most Symfony applications are doing database and/or API calls. These will not be faster when using HHVM, since HHVM only speeds up PHP execution. This is why I think that the difference will be smaller (than a factor 2) for a real life Symfony application. What do you think?