Wir haben hart daran gearbeitet, die Leistung von PHP7 zu verbessern. Letzten Monat haben wir festgestellt, dass PGO von GCC eine Leistungssteigerung von fast 10 % auf WordPress bringen kann.
Wie der Name schon sagt, PGO (Profile Guided Optimization, bei Interesse Google), müssen jedoch einige Anwendungsfälle verwendet werden, um Feedback zu erhalten, was bedeutet, dass diese Optimierung an ein bestimmtes Szenario gebunden sein muss. .
Ihre Optimierung in einem Szenario kann in einem anderen Szenario nach hinten losgehen. Es handelt sich also nicht um eine allgemeine Optimierung, noch können wir von PGO kompiliertes PHP7 direkt veröffentlichen.
Von Natürlich versuchen wir, einige gängige Optimierungen von PGO zu finden und diese dann manuell auf PHP7 anzuwenden. Dies kann jedoch offensichtlich nicht den Effekt erzielen, den eine spezielle Optimierung für eine Szene erzielen kann. Deshalb habe ich mich entschieden, diesen Artikel zu schreiben, um kurz die Verwendung von PGO vorzustellen um PHP7 zu kompilieren, damit das von Ihnen kompilierte PHP7 Ihre eigene unabhängige Anwendung schneller machen kann.
Zunächst müssen Sie entscheiden, welche Szene Sie verwenden möchten. Feedback GCC wählen wir normalerweise aus: In der gewünschten Szene zur Optimierung: die Seite mit den meisten Besuchen, dem größten Zeitaufwand und dem höchsten Ressourcenverbrauch
Nehmen wir WordPress als Beispiel, wir wählen die Homepage von WordPress (da die Homepage oft am häufigsten besucht wird). .
Nehmen wir meine Maschine als Beispiel:
<ol> <li><span><span>Intel(R) Xeon(R) CPU X5687 @ 3.60GHz X 16(超线程), </span></span></li> <li><span> </span></li> <li><span>48G Memory </span></li> </ol>
php-fpm verwendet feste 32 Worker und Opcache verwendet die Standardkonfiguration (bestimmte Denken Sie daran, Opcache zu laden)
Verwenden Sie WordPress 4.1 als Optimierungsszenario..
Zuerst testen wir die aktuelle Leistung von WP in PHP7 (ab -n 10000 -c 100):
<ol> <li><span><span>$ ab -n 10000 -c 100 http:</span><span>//inf-dev-maybach.weibo.com:8000/wordpress/</span><span> </span></span></li> <li><span> </span></li> <li><span>This is ApacheBench, Version 2.3 <<span>$Revision</span><span>: 655654 $> </span></li> <li><span> </span></li> <li><span>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http:<span>//www.zeustech.net/</span><span> </span></span></li> <li><span> </span></li> <li><span>Licensed to The Apache Software Foundation, http:<span>//www.apache.org/</span><span> </span></span></li> <li><span> </span></li> <li><span>Benchmarking inf-dev-maybach.weibo.com (be patient) </span></li> <li><span> </span></li> <li><span>Completed 1000 requests </span></li> <li><span> </span></li> <li><span>Completed 2000 requests </span></li> <li><span> </span></li> <li><span>Completed 3000 requests </span></li> <li><span> </span></li> <li><span>Completed 4000 requests </span></li> <li><span> </span></li> <li><span>Completed 5000 requests </span></li> <li><span> </span></li> <li><span>Completed 6000 requests </span></li> <li><span> </span></li> <li><span>Completed 7000 requests </span></li> <li><span> </span></li> <li><span>Completed 8000 requests </span></li> <li><span> </span></li> <li><span>Completed 9000 requests </span></li> <li><span> </span></li> <li><span>Completed 10000 requests </span></li> <li><span> </span></li> <li><span>Finished 10000 requests </span></li> <li><span> </span></li> <li><span>Server Software: nginx/1.7.12 </span></li> <li><span> </span></li> <li><span>Server Hostname: inf-dev-maybach.weibo.com </span></li> <li><span> </span></li> <li><span>Server Port: 8000 </span></li> <li><span> </span></li> <li><span>Document Path: /wordpress/ </span></li> <li><span> </span></li> <li><span>Document Length: 9048 bytes </span></li> <li><span> </span></li> <li><span>Concurrency Level: 100 </span></li> <li><span> </span></li> <li><span>Time taken <span>for</span><span> tests: 8.957 seconds </span></span></li> <li><span> </span></li> <li><span>Complete requests: 10000 </span></li> <li><span> </span></li> <li><span>Failed requests: 0 </span></li> <li><span> </span></li> <li><span>Write errors: 0 </span></li> <li><span> </span></li> <li><span>Total transferred: 92860000 bytes </span></li> <li><span> </span></li> <li><span>HTML transferred: 90480000 bytes </span></li> <li><span> </span></li> <li><span>Requests per second: 1116.48 [#/sec] (mean) </span></li> <li><span> </span></li> <li><span>Time per request: 89.567 [ms] (mean) </span></li> <li><span> </span></li> <li><span>Time per request: 0.896 [ms] (mean, across all concurrent requests) </span></li> <li><span> </span></li> <li><span>Transfer rate: 10124.65 [Kbytes/sec] received </span></li> </ol>
Es kann sich sehen lassen dass sich WordPress 4.1 derzeit auf diesem Computer befindet und der QPS der Homepage 1116,48 erreichen kann. Das heißt, es kann so viele Anfragen für die Homepage pro Sekunde verarbeiten.
Jetzt beginnen wir mit dem Unterrichten von GCC Kompilieren Sie PHP7, das WordPress 4.1 schneller ausführt. Zuerst ist GCC 4.0 oder höher erforderlich, aber ich empfehle jedem, GCC-4.8 oder höher zu verwenden (jetzt alle GCC-5.1).
Zuerst Der erste Schritt, natürlich. ist, den Quellcode von PHP7 herunterzuladen und dann ./configure auszuführen. Es gibt keinen Unterschied zwischen diesen
Der nächste Schritt ist der Unterschied. Wir müssen PHP7 zum ersten Mal kompilieren und es eine ausführbare Datei generieren lassen Datei mit Profildaten:
<ol><li><span><span>$ make prof-gen <br></span></span></li></ol>
Beachten Sie, dass wir den prof-gen-Parameter verwendet haben (dies gilt nur für das Makefile von PHP7, versuchen Sie nicht, dasselbe in anderen Projekten zu tun :))
Dann beginnen wir mit dem Training von GCC:
<ol><li><span><span>$ sapi/cgi/php-cgi -T </span><span>100</span><span> /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/</span><span>null</span><span> </span></span></li></ol>
Das heißt, php-cgi 100 Mal auf der WordPress-Homepage ausführen zu lassen und dabei einige Profilinformationen zu generieren.
Dann haben wir zum zweiten Mal mit der Kompilierung von PHP7 begonnen
<ol> <li><span><span>$ make prof-clean </span></span></li> <li><span>$ make prof-<span>use</span><span> && make install </span></span></li> </ol>
Okay, so einfach ist die PGO-Kompilierung. Schauen wir uns nun die Leistung von PHP7 nach der PGO-Kompilierung an:
<ol> <li><span><span>$ ab -n10000 -c </span><span>100</span><span> http:</span><span>//inf-dev-maybach.weibo.com:8000/wordpress/</span><span> </span></span></li> <li><span> </span></li> <li><span>This is ApacheBench, Version <span>2.3</span><span> <$Revision: </span><span>655654</span><span> $> </span></span></li> <li><span> </span></li> <li><span>Copyright <span>1996</span><span> Adam Twiss, Zeus Technology Ltd, http:</span><span>//www.zeustech.net/</span><span> </span></span></li> <li><span> </span></li> <li><span>Licensed to The Apache Software Foundation, http:<span>//www.apache.org/</span><span> </span></span></li> <li><span> </span></li> <li><span>Benchmarking inf-dev-maybach.weibo.com (be patient) </span></li> <li><span> </span></li> <li><span>Completed <span>1000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>2000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>3000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>4000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>5000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>6000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>7000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>8000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>9000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>10000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Finished <span>10000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Server Software: nginx/<span>1.7</span><span>.</span><span>12</span><span> </span></span></li> <li><span> </span></li> <li><span>Server Hostname: inf-dev-maybach.weibo.com </span></li> <li><span> </span></li> <li><span>Server Port: <span>8000</span><span> </span></span></li> <li><span> </span></li> <li><span>Document Path: /wordpress/ </span></li> <li><span> </span></li> <li><span>Document Length: <span>9048</span><span> bytes </span></span></li> <li><span> </span></li> <li><span>Concurrency Level: <span>100</span><span> </span></span></li> <li><span> </span></li> <li><span>Time taken <span>for</span><span> tests: </span><span>8.391</span><span> seconds </span></span></li> <li><span> </span></li> <li><span>Complete requests: <span>10000</span><span> </span></span></li> <li><span> </span></li> <li><span>Failed requests: <span>0</span><span> </span></span></li> <li><span> </span></li> <li><span>Write errors: <span>0</span><span> </span></span></li> <li><span> </span></li> <li><span>Total transferred: <span>92860000</span><span> bytes </span></span></li> <li><span> </span></li> <li><span>HTML transferred: <span>90480000</span><span> bytes </span></span></li> <li><span> </span></li> <li><span>Requests per second: <span>1191.78</span><span> [#/sec] (mean) </span></span></li> <li><span> </span></li> <li><span>Time per request: <span>83.908</span><span> [ms] (mean) </span></span></li> <li><span> </span></li> <li><span>Time per request: <span>0.839</span><span> [ms] (mean, across all concurrent requests) </span></span></li> <li><span> </span></li> <li><span>Transfer rate: <span>10807.45</span><span> [Kbytes/sec] received </span></span></li> </ol>
Jetzt kann es 1191,78 QPS pro Sekunde verarbeiten, die Verbesserung beträgt ~7 %. Nicht schlecht (Hey, hast du nicht 10 % gesagt? Wie kommt es, dass es 7 % sind? Haha, wie ich bereits sagte, wir versuchen es zu analysieren PGO: Welche Optimierungen wurden durchgeführt, und dann werden einige gängige Optimierungen manuell auf PHP7 angewendet? Mit anderen Worten: ~3 % der gängigeren Optimierungen wurden in PHP7 integriert, diese Arbeit geht natürlich noch weiter).
So einfach können Sie die klassischen Szenen Ihrer eigenen Produkte verwenden, um GCC zu trainieren. Warum nicht:)
Herausgeber Hinweis: Dieser Artikel ist das Werk des PHP-Meisters – Brother Bird @Laruence. Ursprüngliche Adresse: http://www.laruence.com/2015/06/19/3063.html
Das Obige hat GCC PGO eingeführt, um Ihr PHP 7 schneller zu machen. Ich hoffe, dass es Freunden, die sich für PHP-Tutorials interessieren, hilfreich sein wird.