Poor performance

2020-07-23 04:00发布

问题:

I am doing performance tests for my master thesis and I'm getting very poor performance of Symfony2 simple application. It's simple app, one query and some math.

Test results for command:

ab -c10 -t60 http://sf2.cities.localhost/app.php

Server Software:        Apache/2.2.20
Server Hostname:        sf2.cities.localhost
Server Port:            80

Document Path:          /app.php
Document Length:        2035 bytes

Concurrency Level:      10
Time taken for tests:   60.162 seconds
Complete requests:      217
Failed requests:        68
   (Connect: 0, Receive: 0, Length: 68, Exceptions: 0)
Write errors:           0
Non-2xx responses:      68
Total transferred:      393876 bytes
HTML transferred:       321102 bytes
Requests per second:    3.61 [#/sec] (mean)
Time per request:       2772.458 [ms] (mean)
Time per request:       277.246 [ms] (mean, across all concurrent requests)
Transfer rate:          6.39 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   2.1      0      11
Processing:   230 2641 2493.1   1778   17146
Waiting:      230 2641 2493.1   1778   17146
Total:        230 2642 2492.9   1778   17146

Before test I launched two commands:

php app/console --env=prod cache:clear php app/console --env=prod cache:warmup

Symfony check page tells me that I only don't have intl extension, so apc is probably ok.

My PHP version is:

PHP 5.3.6-13ubuntu3.6 with Suhosin-Patch

Could someone give me advice about what else should I check in my env?

回答1:

It can be any number of things, including that your computer just can't handle the load. I can give you a few pointers where to look though.

You are getting some errors returned Failed requests: 68. Look into the apache logfiles, they might indicate the problem. If you don't find anything in them make sure logging is enabled and your config file has the correct log level set. Your VirtualHost definition should contain something like

 LogLevel debug
 CustomLog /var/log/apache2/access-localhost.log vhost_combined
 ErrorLog /var/log/apache2/error-localhost.log

Use LogLevel debug only for debugging. You'll want to set it to warn or error for production.

Enable error logging in php.ini and your scripts and check your php error log for any problems.

Make sure your apache2.conf is configured correctly, especially the mpm module. Here is a standard, albeit far from perfect configuration:

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

Make sure you have enough RAM for that, you'll need around 1GB for apache2 only (at least under linux)

You can also try to check performance against a small static text file (around 2kb) and see what that performance looks like. After that check against the simple <? php echo 'Hello World!' ?> to see the performance impact of the php interpreter. Both tests should give you an indication of what your apache is capable of with the current configuration. If the performance is acceptable in both tests, it's your app that's slow.

Another thing to try is disabling concurrency in your test and see if that helps. That would indicate concurrency problems in your app or database access.

ab -c1 -t60 http://sf2.cities.localhost/app.php

If it's still slow, google apache performance tuning and (assuming you use MySQL as your database) mysql performance tuning