60
Keep Your Memory Under Control Konstantin Kovshenin konstantin.blog

Memory Management in WordPress

Embed Size (px)

Citation preview

Page 1: Memory Management in WordPress

Keep Your MemoryUnder ControlKonstantin Kovsheninkonstantin.blog

Page 2: Memory Management in WordPress
Page 3: Memory Management in WordPress

Fast

Page 4: Memory Management in WordPress

FastExpensive

Page 5: Memory Management in WordPress

FastExpensiveNever enough

Page 6: Memory Management in WordPress

Memory Usage

freetop, htop, ...

Page 7: Memory Management in WordPress

free

Page 8: Memory Management in WordPress

free

Page 9: Memory Management in WordPress

top

Page 10: Memory Management in WordPress

top

Page 11: Memory Management in WordPress

PHP / WordPress

Page 12: Memory Management in WordPress

Zend Memory Manager

Page 13: Memory Management in WordPress

Zend Memory Manager

OS Kernel

foo.php

$a = 5;

malloc, mmap, ...

Page 14: Memory Management in WordPress

memory_get_usage()memory_get_peak_usage()Debug Bar, Query Monitor

Memory Usage

Page 15: Memory Management in WordPress

$before = memory_get_usage();// Do something$after = memory_get_usage();

echo $after - $before;

Page 16: Memory Management in WordPress

Environment loadedInit actionShutdown action

12.9 MB14.1 MB14.4 MB

Page 17: Memory Management in WordPress

12.9 MB14.1 MB14.4 MB

12.9 MB27.3 MB28.6 MB

Environment loadedInit actionShutdown action

Page 18: Memory Management in WordPress

Fatal error: Allowed memory size of 134217728 bytes exhausted

Page 19: Memory Management in WordPress

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

Page 20: Memory Management in WordPress

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

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

Page 21: Memory Management in WordPress

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

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

Page 22: Memory Management in WordPress

Google...

Page 23: Memory Management in WordPress

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

Page 24: Memory Management in WordPress
Page 25: Memory Management in WordPress

Stop

Page 26: Memory Management in WordPress

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

Page 27: Memory Management in WordPress

script.phpscript.php

Page 28: Memory Management in WordPress

ZendMemoryManager

script.php2GB

2GB

script.php

Page 29: Memory Management in WordPress

ZendMemoryManager

Kernelscript.php

2GB

2GB

2x2GB

script.php

Page 30: Memory Management in WordPress

OOM Killer

Page 31: Memory Management in WordPress

OOM Killer

mysqld

nginx

sshd

postfix

fail2ban

Page 32: Memory Management in WordPress

1. Fine-tune the OOM

Page 33: Memory Management in WordPress

1. Fine-tune the OOM2. Add more Swap memory

Page 34: Memory Management in WordPress

1. Fine-tune the OOM2. Add more Swap memory3. Figure things out

Page 35: Memory Management in WordPress

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

Page 36: Memory Management in WordPress

xdebugxhprof, tidewaysmemprof

Memory Profiling

Page 37: Memory Management in WordPress

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

Page 38: Memory Management in WordPress

XDEBUG_TRACEtracefile-analyser.php

Memory Profiling

Page 39: Memory Management in WordPress

vim trace.xt

Page 40: Memory Management in WordPress

Why?

Page 41: Memory Management in WordPress

posts_per_page => -11

Page 42: Memory Management in WordPress

// Pretty bad$posts = get_posts( array( 'posts_per_page' => -1, // ...) );

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

Page 43: Memory Management in WordPress

// A little better$paged = 1;

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

Page 44: Memory Management in WordPress

// Goodwp_suspend_cache_addition( true );

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

wp_suspend_cache_addition( false );

Page 45: Memory Management in WordPress

2file_get_contents()

Page 46: Memory Management in WordPress

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

Page 47: Memory Management in WordPress

3ob_start()

Page 48: Memory Management in WordPress

// Not so goodob_start( 'ob_callback' );

// Much betterob_start( 'ob_callback', 1024*1024*2 );

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

Page 49: Memory Management in WordPress

Context 4

Page 50: Memory Management in WordPress

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

template_redirectwp_headwp_footershutdowncron

Context

Page 51: Memory Management in WordPress

Monitoring

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

Page 52: Memory Management in WordPress

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

Page 53: Memory Management in WordPress

Kibana

Elasticsearch

Logstash

php-memory.log

Page 54: Memory Management in WordPress

Munin

Page 55: Memory Management in WordPress

1. Choose the right context

Page 56: Memory Management in WordPress

2. Profile with large datasets

Page 57: Memory Management in WordPress

3. Keep consumptionunder control

Page 58: Memory Management in WordPress

konstantin.blog/wcsof2016

Page 59: Memory Management in WordPress

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

Page 60: Memory Management in WordPress