Yii vs. APF
Der Artikel Performance of Yii unter http://www.yiiframework.com/performance
beschreibt einen Performance-Vergleich verschiedener PHP-Frameworks. Da das APF in dieser Liste nicht
aufgeführt war, wollten wir dies in einem eigenen Test nachholen. Als repräsentative
Kandidaten wurden CakePHP 1.2.1.8004,Yii 1.0.2.r614 und
APF 1.8-2009-01-09-2214 ausgewählt. Das Ergebnis des Tests ist in der nach folgenden
Grafik zusammengefasst:
Die Messung der Größe
requests per second beleuchtet vor Allem den Gesichtspunkt
des
Overhead eines Frameworks. Allgemein formuliert also den Performance-Nachteil, den sich
ein Entwickler mit dem Einsatz eines Frameworks erkauft. Aus diesem Grund wurde als
Vergleichsapplikation eine
Hallo Welt!-Anwendung eingesetzt. Ein schöner Nebeneffekt
ist zudem, dass der Test dadurch möglichst einfach auszuwerten und (nahezu) frei von
Designfehlern bei der Nutzung des Frameworks (für Unerfahrene) ist. Es wird dadurch nahezu nur
die maximale Durchsatz-Performance bei der Nutzung des Frameworks gemessen.
Wie im Artikel
View based caching - ein HOWTO
zu lesen ist, ist Performance im Webbereich bereits ein sehr wichtiges Thema, das mit der steigenden
Zahl der mobilen Endgeräte nochmals an Bedeutung gewinnt. Der in der Übersichtsgrafik
aufgezeigte signifikante Unterschied einzelner Frameworks inspirierte uns, den Test mit wenigen
Test-Kandidaten nachzustellen und die Performance des APF dagegenzustellen.
Zur Kategorisierung der Ergebnisse kann später sowohl der oben aufgezeite Artikel, als auch der
auf der APF-Seite veröffentlichte Artikel
PHP-Frameworks im Test
genutzt werden.
Um die Vergleichbarkeit der Ergebnisse mit der Yii-Performance-Messung bestmöglich zu
gewährleisten wurde der Testaufbau identisch gehalten. Als Test-Maschine diente ein LINUX-Server
(virtuelle VMWare Maschine) mit folgenden Leistungsdaten:
Shell
[root@centos53 ~]# cat /etc/redhat-release
CentOS release 5.2 (Final)
[root@centos53 ~]# cat /proc/meminfo (gekürzt!)
MemTotal: 1035244 kB
[root@centos53 ~]# cat /proc/cpuinfo (gekürzt!)
processor : 0
vendor_id : GenuineIntel
model name : Intel(R) Core(TM)2 Duo CPU T9500 @ 2.60GHz
cpu MHz : 2592.732
cache size : 6144 KB
processor : 1
vendor_id : GenuineIntel
model name : Intel(R) Core(TM)2 Duo CPU T9500 @ 2.60GHz
cpu MHz : 2592.732
cache size : 6144 KB
[root@centos53 ~]# lsscsi
[0:0:0:0] disk VMware, VMware Virtual S 1.0 /dev/sda
[root@centos53 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VG_LOCAL-LV_ROOT
18G 2.4G 15G 15% /
/dev/sda1 99M 18M 77M 19% /boot
tmpfs 506M 0 506M 0% /dev/shm
[root@centos53 ~]# rpm -qa | grep -E "httpd|php" (gekürzt!)
php-cli-5.1.6-20.el5_2.1
php-gd-5.1.6-20.el5_2.1
php-pecl-memcache-2.2.3-1.el5_2
php-mysql-5.1.6-20.el5_2.1
php-common-5.1.6-20.el5_2.1
httpd-2.2.3-11.el5_2.centos.4
php-5.1.6-20.el5_2.1
php-devel-5.1.6-20.el5_2.1
Für das Caching der PHP-Dateien (aka.
bytecode cache) wurde die aktuelle APC-Version
(3.0.18) aus den Quellen kompiliert und mit folgenden Parametern konfiguriert:
Shell
[root@centos53 ~]# cat /etc/php.d/apc.ini
extension=apc.so
apc.enabled=1
apc.shm_segments=1
apc.optimization=1
apc.shm_size=32
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1
apc.cache_by_default=1
apc.stat=0
Wie an den Konfigurationsparametern zu sehen ist, wurde
apc.stat nicht aktiviert um den
Filesystem-Zugriff zu minimieren. Diese Einstellung wurde auch im Original-Test so gewählt.
Als Messgröße wurde - dem Original-Test nachempfunden - die erreichbare Durchsatzrate
verwendet. Zur Messung dieser Größe wurde das
Apache HTTP server benchmarking tool
verwendet. Um einen reellen Test zu erreichen simuliert das Tool eine Lastsituation von 10 parallel
zugreifenden Benutzern über eine Dauer von 30s. Für jeden Test-Kandidaten wurde ein
eigener VHOST erstellt und zur Zeit der Messung aufgerufen.
Die Testserie umfasst 4 Messungen der im letzten Absatz beschriebenen Art. Die ersten beiden Messungen
dienen der Erfassung der Durchsatzrate ohne
byte code caching, die zwei folgenden zeigen
die Beschleunigung, die mit APC möglich ist. Zwischen den Tests wurde der Apache jeweils neu
gestartet um gleiche Anfangsbedingungen zu schaffen. Im Test wurde bei der Verwendung von einem
"warmup" abgesehen, da dies nicht einer reellen Situation im täglichen Live-Betrieb
(z.B. nach einem Softwarerelease) entspricht. Auf der Maschine wurden wärend der Test-Läufe
keine weiteren Programme oder Dienste ausgeführt, die das Ergebnis verfälschen würden.
Das detaillierte Ergebnis ist in der nachfolgenden Grafik inkl. der Messwerte dargestellt:
RPS-Benchmark
| |
Ohne APC [RPS] |
Mit APC [RPS] |
| |
1. Test |
2. Test |
Durchschnitt |
1. Test |
2. Test |
Durchschnitt |
| CakePHP |
30.94 |
31.53 |
31.24 |
141.83 |
141.33 |
141.58 |
| Yii |
121.23 |
116.36 |
118.80 |
935.78 |
935.63 |
935.71 |
| APF |
254.58 |
223.94 |
239.26 |
1023.29 |
986.34 |
1004.82 |
Die folgende Liste stellt eine Interpretation der Ergebnissen dar:
-
Der Unterschied zwischen CakePHP und Yii scheint genauso groß zu sein wie im
Yii Performance-Test.
-
Die Optimierungsmöglichkeit beim APF mit APC sind im Verhältnis nicht so groß
wie bei den Kandidaten CakePHP und Yii (APF: 1005/239 (~420%) gegenüber Yii: 936/119 (~780%)).
Dieser Effekt konnte auch bereits im Artikel
Zend framework 1.7rc vs. APF 1.8-BETA (English) festgestellt
werden.
Die absolute Performance ist jedoch ohne APC um rund 100% und mit APC um etwa 8% höher.
-
Yii erhebt den Anspruch, dass die Performance zu einem sehr großen Teil auf die Architektur
zurückzuführen ist. Dies kann auch für das APF bekräftigt werden. Es ist jedoch
zu beachten, dass die Messergebnisse sich bei Aktivieren von apc.stat mit einem
Performance-Vorteil von rund 13% zu Gunsten des APF entwickelt. Dies lässt den Schluss zu,
dass das lazy class loading zwar gut funktioniert, nur die Segmentierung der
Klassen-Dateien etwas unvorteilhafter ausgelegt ist.
-
Beim Test des APF kommt erschwerend hinzu, dass gegenüber den beiden anderen Testkandidaten
das Ausgabe-Template aus einer zusätzlichen Datei geladen werden muss, was zusätzlichen
File-IO erzeugt. Wird der Inhalt der Ausgabe beim Yii-Framework per file_get_contents()
aus einer Text-Datei gelesen, so steigt der Performance-Vorteil des APF auf 13% bis 17%.
Die folgende Liste beinhaltet alle relevanten Dateien, die zum Test erstellt wurden und mit denen
der Test nachempfunden werden kann:
Die drei ersten Dateien sind Archive der Code-Dateien der drei Test-Kandidaten, die Datei
*configfiles.tar.gz beinhaltet die relevanten Server-Konfigurationsdateien und
*resultfiles.tar.gz die Ergebnisdateien des Benchmark-Tools.
Kommentare
Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese
hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.
1
Christian
03.09.2009, 14:25:26
Unter http://forum.adventure-php-framework.org/en/viewtopic.php?f=10&t=26 findet sich ein weiterer Benchmark, der die gute Symbiose aus Performance und Erweiterbarkeit des APF unterstreicht.