10. PROFILING?
Profiler
Es gibt unterschiedliche Problembereiche in der
Softwareentwicklung, die durch ineffiziente Programmierung
ausgelöst werden. Ein Profiler hilft dem Entwickler durch
Analyse und Vergleich von laufenden Programmen die
Problembereiche aufzudecken.
http://de.wikipedia.org/wiki/Profiler_(Programmierung)
5
12. PROFILING FRÜHER(?)
class Main
{
public static function run() {
$otherClass = new OtherClass();
$otherClass->doNothingImportant();
$dummy = new SlowClass();
$dummy->slowFunction(10);
}
}
Main::run();
7
21. BROWSER
Langsamer JS-Code
Zu hoher Speicherverbrauch
Zu viele CSS-Selektoren
Langsame Ladezeiten
Zu viele parallele Downloads
Offen gehaltene Verbindungen
Netzwerk
Internet
Antwort vom Server zu langsam -> Backend
12
41. XHPROF
PHP Extension by Facebook
Kann codeseitig aktiviert werden
Profiler only
sehr schlanker Footprint, daher auch im Livebetrieb
einsetzbar (Monte Carlo-Algorithmus)
26
48. DATENBANK
Unnötige Daten geladen
Kein/falscher Index benutzt
Daten werden nach der Abfrage noch sortiert
Langsame IOs
Falsche Systemeinstellungen (Buffer Sizes, ...)
31
49. DB - EXPLAIN
select LastName, FirstName, sum(UnitPrice * Quantity) from employees e inner join
orders o on e.EmployeeID = o.EmployeeID inner join "Order Details" od on o.OrderID
= od.OrderID group by LastName, FirstName;
32
50. DB - EXPLAIN
select LastName, FirstName, sum(UnitPrice * Quantity) from employees e inner join
orders o on e.EmployeeID = o.EmployeeID inner join "Order Details" od on o.OrderID
= od.OrderID group by LastName, FirstName;
sqlite> explain query plan [...];
0|0|0|SCAN TABLE employees AS e (~1000000 rows)
0|1|1|SEARCH TABLE orders AS o USING AUTOMATIC COVERING INDEX (EmployeeID=?) (~7 rows)
0|2|2|SEARCH TABLE Order Details AS od USING INDEX sqlite_autoindex_Order Details_1
(OrderID=?) (~10 rows)
0|0|0|USE TEMP B-TREE FOR GROUP BY
32
51. DB - EXPLAIN
select LastName, FirstName, sum(UnitPrice * Quantity) from employees e inner join
orders o on e.EmployeeID = o.EmployeeID inner join "Order Details" od on o.OrderID
= od.OrderID group by LastName, FirstName;
sqlite> explain query plan [...];
0|0|0|SCAN TABLE employees AS e (~1000000 rows)
0|1|1|SEARCH TABLE orders AS o USING AUTOMATIC COVERING INDEX (EmployeeID=?) (~7 rows)
0|2|2|SEARCH TABLE Order Details AS od USING INDEX sqlite_autoindex_Order Details_1
(OrderID=?) (~10 rows)
0|0|0|USE TEMP B-TREE FOR GROUP BY
sqlite> explain [...];
0|Trace|0|0|0||00|
1|SorterOpen|3|5|0|keyinfo(2,BINARY,BINARY)|00|
2|Integer|0|7|0||00|
3|Integer|0|6|0||00|
4|Null|0|10|11||00|
5|Gosub|9|74|0||00|
6|Goto|0|81|0||00|
7|OpenRead|0|120|0|3|00|
32
52. SCHRITT 3: ERFOLG PRÜFEN
Hat die Optimierung etwas gebracht?
Vorher-Nachher-Check
Lasttests
Tools
Apache Benchmark (AB)
JMeter
33
53. APACHE BENCHMARK (AB)
$ ab -n 100 -c 10 http://localhost/~rene/talk/Main.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient).....done
Server Software: Apache/2.2.21
Server Hostname: localhost
Server Port: 80
Document Path: /~rene/talk/Main.php
Document Length: 11 bytes
Concurrency Level: 10
Time taken for tests: 56.692 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 22300 bytes
HTML transferred: 1100 bytes
Requests per second: 1.76 [#/sec] (mean)
Time per request: 5669.198 [ms] (mean)
Time per request: 566.920 [ms] (mean, across all concurrent requests)
Transfer rate: 0.38 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 3660 2329.9 5022 6356
Processing: 0 1758 3060.0 0 11378
Waiting: 0 1757 3059.9 0 11377
Total: 5010 5417 1403.8 5030 11378
Percentage of the requests served within a certain time (ms)
50% 5030
66% 5040
75% 5052
80% 5063
90% 6316
95% 11378 vorher
98% 11378
99% 11378
100% 11378 (longest request)
34
54. APACHE BENCHMARK (AB)
$ ab -n 100 -c 10 http://localhost/~rene/talk/Main.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
$ ab -n 100 -c 10 http://localhost/~rene/talk/Main.php
Benchmarking localhost (be patient).....done This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Server Software: Apache/2.2.21
Server Hostname: localhost Benchmarking localhost (be patient).....done
Server Port: 80
Document Path: /~rene/talk/Main.php Server Software: Apache/2.2.21
Document Length: 11 bytes Server Hostname: localhost
Server Port: 80
Concurrency Level: 10
Time taken for tests: 56.692 seconds Document Path: /~rene/talk/Main.php
Complete requests: 100 Document Length: 11 bytes
Failed requests: 0
Write errors: 0 Concurrency Level: 10
Total transferred: 22300 bytes Time taken for tests: 5.395 seconds
HTML transferred: 1100 bytes Complete requests: 100
Requests per second: 1.76 [#/sec] (mean) Failed requests: 0
Time per request: 5669.198 [ms] (mean) Write errors: 0
Time per request: 566.920 [ms] (mean, across transferred:
Total all concurrent requests)
22300 bytes
Transfer rate: 0.38 [Kbytes/sec] received
HTML transferred: 1100 bytes
Requests per second: 18.54 [#/sec] (mean)
Connection Times (ms) Time per request: 539.458 [ms] (mean)
min mean[+/-sd] median max Time per request: 53.946 [ms] (mean, across all concurrent requests)
Connect: 0 3660 2329.9 5022 6356 Transfer rate: 4.04 [Kbytes/sec] received
Processing: 0 1758 3060.0 0 11378
Waiting: 0 1757 3059.9 0 11377 Connection Times (ms)
Total: 5010 5417 1403.8 5030 11378 min mean[+/-sd] median max
Connect: 0 395 217.3 531 577
Percentage of the requests served within a certain time (ms) 0 142 214.4
Processing: 1 559
50% 5030 Waiting: 0 142 214.6 0 559
66% 5040 Total: 512 538 14.9 535 577
75% 5052
80% 5063
vorher
Percentage of the requests served within a certain time (ms)
90% 6316 50% 535
95% 11378 66% 541
98% 11378 75% 553
nachher
99% 11378 80% 555
100% 11378 (longest request) 90% 559
95% 559
98% 566
99% 577
100% 577 (longest request)
34