Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Пожиратели памяти в WordPress

8,768 views

Published on

Доклад с конференции WordCamp Moscow 2016 о работе с оперативной памятью в WordPress.

Published in: Internet
  • Be the first to comment

Пожиратели памяти в WordPress

  1. 1. Пожиратели памяти в WordPress Константин Ковшенин
  2. 2. Быстрая
  3. 3. Быстрая Дорогая
  4. 4. Быстрая Дорогая Всегда мало
  5. 5. Потребление памяти: free top, htop, ...
  6. 6. free
  7. 7. free
  8. 8. top
  9. 9. top
  10. 10. PHP / WordPress
  11. 11. Zend Memory Manager
  12. 12. Zend Memory Manager OS Kernel foo.php $a = 5; malloc, mmap, ...
  13. 13. memory_get_usage() memory_get_peak_usage() Debug Bar Потребление памяти:
  14. 14. $before = memory_get_usage(); // Делаем что-нибудь $after = memory_get_usage(); echo $after - $before;
  15. 15. Загрузка ядра Событие init Событие shutdown 12.9 мб 14.1 мб 14.4 мб
  16. 16. Загрузка ядра Событие init Событие shutdown 12.9 мб 14.1 мб 14.4 мб 12.9 мб 27.3 мб 28.6 мб
  17. 17. Fatal error: Allowed memory size of 134217728 bytes exhausted
  18. 18. ... tried to allocate 8552 bytes in /path/to/wp-includes/wp-db.php on line 1775
  19. 19. ... tried to allocate 8552 bytes in /path/to/wp-includes/wp-db.php on line 1775 1775: while ( $row = mysqli_fetch_object( ...
  20. 20. ... tried to allocate 8552 bytes in /path/to/wp-includes/wp-db.php on line 1775 1775: while ( $row = mysqli_fetch_object( ...
  21. 21. Гуглим
  22. 22. ini_set( 'memory_limit', '2048M' );
  23. 23. Стоп
  24. 24. ini_set( 'memory_limit', '2048M' );
  25. 25.   script.php script.php
  26. 26.   Zend Memory Manager script.php 2GB 2GB script.php
  27. 27.   Zend Memory Manager Kernel script.php 2GB 2GB 2x2GB script.php
  28. 28. OOM Killer
  29. 29. OOM Killer mysqld nginx sshd postfix fail2ban
  30. 30. 1. Конфигурация OOM
  31. 31. 1. Конфигурация OOM 2. Добавить много swap-памяти
  32. 32. 1. Конфигурация OOM 2. Добавить много swap-памяти 3. Разобраться
  33. 33. ... tried to allocate 8552 bytes in /path/to/wp-includes/wp-db.php on line 1775
  34. 34. xdebug xhprof memprof Профилирование памяти:
  35. 35. Call Stack: 34032184 6. do_action() .../htdocs/wp-settings.php:393 34925000 7. call_user_func_array:{}() .../wp-includes/plugin.php:525 34925104 8. my_plugin_init() .../wp-includes/plugin.php:525 134139664 9. wpdb->query() .../wp-content/plugins/memory.php:25 134172496 10. mysqli_fetch_object() .../wp-includes/wp-db.php:1775
  36. 36. XDEBUG_TRACE tracefile-analyser.php Профилирование памяти:
  37. 37. vim trace.xt
  38. 38. Ошибки
  39. 39. posts_per_page => -1
  40. 40. // Плохо $posts = get_posts( array( 'posts_per_page' => -1, // ... ) ); foreach ( $posts as $post ) { // ... }
  41. 41. // Чуть лучше $paged = 1; while ( $posts = get_posts( array( 'posts_per_page' => 100, 'paged' => $paged++, ) ) ) { foreach ( $posts as $post ) { // ... } }
  42. 42. // Хорошо wp_suspend_cache_addition( true ); $paged = 1; while ( $posts = get_posts( array( 'posts_per_page' => 100, 'paged' => $paged++, ) ) ) { // foreach ... } wp_suspend_cache_addition( false );
  43. 43. file_get_contents()
  44. 44. readfile() fopen/fread/feof X-Accel-Redirect
  45. 45. ob_start()
  46. 46. // Плохо ob_start( 'ob_callback' ); // Хорошо ob_start( 'ob_callback', 1024*1024*2 ); function ob_callback( $content, $phase ) { // ... }
  47. 47. Контекст
  48. 48. is_admin() is_network_admin() is_front_page() is_singular() ... template_redirect wp_head wp_footer shutdown cron Контекст
  49. 49. Мониторинг top, free cat /proc/meminfo cat /proc/pid/{status,maps}
  50. 50. add_action( 'shutdown', function() { $line = json_encode( array( 'timestamp' => time(), 'request_uri' => $_SERVER['REQUEST_URI'], 'peak_memory' => memory_get_peak_usage(), ) ); file_put_contents( '/tmp/php-memory.log', $line . PHP_EOL, FILE_APPEND | LOCK_EX ); });
  51. 51. Kibana Elasticsearch Logstash php-memory.log
  52. 52. Munin
  53. 53. 1. Выбирайте контекст
  54. 54. 2. Профилируйте с большим количеством данных
  55. 55. 3. Держите потребление под контролем
  56. 56. kovshenin.com/wcmsk2016
  57. 57. Attributions: Success Kid (Sammy Griner): https://en.wikipedia.org/wiki/Success_Kid Ninja character: http://www.vecteezy.com/vector-art/88129-ninja-vector-set Blood spatter CC-Attr-ShareALike 4.0: http://www.freevector.com/splattered-blood-graphics-set User icons by FontAwesome, SIL OFL 1.1: http://fontawesome.io

×