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

60
Пожиратели памяти в WordPress Константин Ковшенин

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

Пожиратели памятив WordPressКонстантин Ковшенин

Быстрая

БыстраяДорогая

БыстраяДорогаяВсегда мало

Потребление памяти:

freetop, htop, ...

free

free

top

top

PHP / WordPress

Zend Memory Manager

Zend Memory Manager

OS Kernel

foo.php

$a = 5;

malloc, mmap, ...

memory_get_usage()memory_get_peak_usage()Debug Bar

Потребление памяти:

$before = memory_get_usage();// Делаем что-нибудь$after = memory_get_usage();

echo $after - $before;

Загрузка ядраСобытие initСобытие shutdown

12.9 мб14.1 мб14.4 мб

Загрузка ядраСобытие initСобытие shutdown

12.9 мб14.1 мб14.4 мб

12.9 мб27.3 мб28.6 мб

Fatal error: Allowed memory size of 134217728 bytes exhausted

... tried to allocate 8552 bytes in/path/to/wp-includes/wp-db.phpon line 1775

... tried to allocate 8552 bytes in/path/to/wp-includes/wp-db.phpon line 1775

1775: while ( $row = mysqli_fetch_object( ...

... tried to allocate 8552 bytes in/path/to/wp-includes/wp-db.phpon line 1775

1775: while ( $row = mysqli_fetch_object( ...

Гуглим

ini_set( 'memory_limit', '2048M' );

Стоп

ini_set( 'memory_limit', '2048M' );

script.phpscript.php

ZendMemoryManager

script.php2GB

2GB

script.php

ZendMemoryManager

Kernelscript.php

2GB

2GB

2x2GB

script.php

OOM Killer

OOM Killer

mysqld

nginx

sshd

postfix

fail2ban

1. Конфигурация OOM

1. Конфигурация OOM2. Добавить много swap-памяти

1. Конфигурация OOM2. Добавить много swap-памяти3. Разобраться

... tried to allocate 8552 bytes in/path/to/wp-includes/wp-db.phpon line 1775

xdebugxhprofmemprof

Профилирование памяти:

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:525134139664 9. wpdb->query() .../wp-content/plugins/memory.php:25134172496 10. mysqli_fetch_object() .../wp-includes/wp-db.php:1775

XDEBUG_TRACEtracefile-analyser.php

Профилирование памяти:

vim trace.xt

Ошибки

posts_per_page => -11

// Плохо$posts = get_posts( array( 'posts_per_page' => -1, // ...) );

foreach ( $posts as $post ) { // ...}

// Чуть лучше$paged = 1;

while ( $posts = get_posts( array( 'posts_per_page' => 100, 'paged' => $paged++,) ) ) { foreach ( $posts as $post ) { // ... }}

// Хорошоwp_suspend_cache_addition( true );

$paged = 1;while ( $posts = get_posts( array( 'posts_per_page' => 100, 'paged' => $paged++,) ) ) { // foreach ...}

wp_suspend_cache_addition( false );

2file_get_contents()

readfile()fopen/fread/feofX-Accel-Redirect

3ob_start()

// Плохоob_start( 'ob_callback' );

// Хорошоob_start( 'ob_callback', 1024*1024*2 );

function ob_callback( $content, $phase ) { // ...}

Контекст 4

is_admin()is_network_admin()is_front_page()is_singular()...

template_redirectwp_headwp_footershutdowncron

Контекст

Мониторинг

top, freecat /proc/meminfocat /proc/pid/{status,maps}

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 );});

Kibana

Elasticsearch

Logstash

php-memory.log

Munin

1. Выбирайте контекст

2. Профилируйте с большим количеством данных

3. Держите потреблениепод контролем

kovshenin.com/wcmsk2016

Attributions:

Success Kid (Sammy Griner): https://en.wikipedia.org/wiki/Success_KidNinja character: http://www.vecteezy.com/vector-art/88129-ninja-vector-setBlood spatter CC-Attr-ShareALike 4.0: http://www.freevector.com/splattered-blood-graphics-setUser icons by FontAwesome, SIL OFL 1.1: http://fontawesome.io