Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SLAC17: PHP On Scale

SLAC17: PHP On Scale

License: CC BY-SA

Slides of my talk at the Secure Linux Administration Conference in Berlin at May 23rd, 2017.

Martin Helmich

May 23, 2017
Tweet

More Decks by Martin Helmich

Other Decks in Programming

Transcript

  1. PHP on Scale Martin Helmich Mittwald CM Service GmbH &

    Co. KG 10. Secure Linux Administration Conference, Berlin 23. Mai 2017 CC-0, coffy https://pixabay.com/de/thailand-elefanten-sonnenuntergang-142982
  2. Dieses Werk ist lizensiert unter einer Creative Commons (Namensnennung &

    Weitergabe unter gleichen Bedingungen) 4.0 International Lizenz. http://creativecommons.org/licenses/by-sa/4.0/
  3. Martin Helmich Software- & Systemarchitekt bei Mittwald CM Service Dozent

    (Private Hochschule für Wirtschaft & Technik, Hochschule Hamm-Lippstadt) http://stackoverflow.com/story/martinhelmich https://github.com/martin-helmich https://www.martin-helmich.de
  4. < Erste Regel für PHP-Performance: „Neuer ist besser!“ CC BY-SA,

    Grm https://commons.wikimedia.org/wiki/File:Macintosh_128k_transparency.png CC BY-SA, Sonicscrewdriver https://commons.wikimedia.org/wiki/File:Late_2016_MacBook_Pro.jpg
  5. 68,69 TPS 167,87 TPS 163,48 TPS 0 50 100 150

    200 PHP 5.6 PHP 7.0 PHP 7.1 Transactions per Second Quelle: https://github.com/martin-helmich/php7-benchmark Mehr = Besser Zutaten • Wordpress 4.7.4 • MariaDB 10.1 • Siege mit 100 parallelen Nutzern
  6. 68,69 TPS 167,87 TPS 163,48 TPS 0 50 100 150

    200 PHP 5.6 PHP 7.0 PHP 7.1 Transactions per Second Quelle: https://github.com/martin-helmich/php7-benchmark Mehr = Besser 1,44 s 0,59 s 0,60 s 0 0,5 1 1,5 2 PHP 5.6 PHP 7.0 PHP 7.1 Average Response Time Weniger = Besser
  7. function getExpensiveValue() { $cacheValue = apc_fetch("my_expensive_value", $success); if ($success) {

    return $success; } $value = computeExpensiveValue(); apc_store("my_expensive_value", $value, 3600); return $value; }
  8. class Foo { private $cache; public __construct(CacheItemPoolInterface $cache) { $this->cache

    = $cache; } public getExpensiveValue() { $item = $this->cache->getItem("my_expensive_value"); if (!$item->isHit()) { $item->set($this->computeExpensiveValue()); $this->cache->save($item); } return $item->get(); } }
  9. Dritte Regel für PHP-Performance: „Viel hilft viel!“ CC BY-SA Victorgrigas

    https://commons.wikimedia.org/wiki/File:Wikimedia_Foundation_Servers-8055_35.jpg
  10. backend my_application balance source hash-type consistent server backend01 10.0.0.9:80 check

    server backend02 10.0.0.10:80 check server backend03 10.0.0.11:80 check Source Address Affinity
  11. [Session] -session.save_path = "tcp://<redis-url>:6379" +session.save_path = "tls://<redis-url>:6379?auth=<passwd>" Security-Tipp: Verbindung über

    reines TCP nur in vertrauenswürdigen Netzen! Ansonsten TLS-Proxy (HAProxy, Hitch, …) und Passwort-Authentifizierung verwenden!
  12. Server Server Server Server Server LB Datenbank DFS DFS DFS

    DFS DFS GlusterFS, CephFS, XtreemFS, …
  13. App App DB Cache A APC A APC A APC

    A A B App B B Achtung! Inkonsistente Caches!
  14. App App DB Cache B APC A APC A APC

    B B App ttl=60 ttl=60 ttl=60 ttl=86400 ttl=∞
  15. Cache Chaining Zum Zuhause nachmachen: composer require \ cache/apcu-adapter \

    cache/redis-adapter \ cache/chain-adapter $redis = new Redis(); $redis->connect( '<redis-addr>', 6379 ); $pool = new CachePoolChain([ new ApcuCachePool(), new RedisCachePool($redis) ]);
  16. Lexing Parsing Compilation Opcode Cache PHP-Opcodes Opcodes werden vom PHP-Interpreter

    ausgeführt Ausführung von PHP-Code ~ Traditionell ~ Compilation
  17. Lexing Parsing Compilation Compilation JIT- Compiler HipHop- Bytecode Ausführung als

    nativer Maschinencode Ausführung von PHP-Code ~ HipHop VM ~ Code- Repository AST HipHop intermediate representation x86-64/ARM- Maschinencode
  18. 68,69 TPS 167,87 TPS 163,48 TPS 171,95 TPS 0 50

    100 150 200 PHP 5.6 PHP 7.0 PHP 7.1 HHVM 3.19 PHP 5.6 PHP 7.0 PHP 7.1 HHVM 3.19 Quelle: https://github.com/martin-helmich/php7-benchmark 1,44 s 0,59 s 0,60 s 0,58 s 0 0,5 1 1,5 2 PHP 5.6 PHP 7.0 PHP 7.1 HHVM 3.19 PHP 5.6 PHP 7.0 PHP 7.1 HHVM 3.19
  19. 287,92 TPS 335,13 TPS 794,20 TPS 917,10 TPS 1739,28 TPS

    1363,24 TPS 1123,41 TPS 0 200 400 600 800 1000 1200 1400 1600 1800 2000 PHP 5.6 PHP 7.0 HHVM 3.10 Laravel Drupal 8 Wordpress 4.4 Quelle: https://kinsta.com/blog/the-definitive-php-7-final-version-hhvm-benchmark
  20. Martins PHP-Performance- Checkliste • Neueste Software-Versionen im Einsatz? • OP-Cache

    aktiv? • Profiling durchgeführt? • Datenbank-Struktur optimiert? • Software- und Systemarchitektur optimiert (z.B: Caching, CQRS, …)?