Upload
konstantin-kovshenin
View
484
Download
1
Embed Size (px)
Citation preview
Keep Your MemoryUnder ControlKonstantin Kovsheninkonstantin.blog
Fast
FastExpensive
FastExpensiveNever enough
Memory Usage
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, Query Monitor
Memory Usage
$before = memory_get_usage();// Do something$after = memory_get_usage();
echo $after - $before;
Environment loadedInit actionShutdown action
12.9 MB14.1 MB14.4 MB
12.9 MB14.1 MB14.4 MB
12.9 MB27.3 MB28.6 MB
Environment loadedInit actionShutdown action
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( ...
Google...
ini_set( 'memory_limit', '2048M' );
Stop
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. Fine-tune the OOM
1. Fine-tune the OOM2. Add more Swap memory
1. Fine-tune the OOM2. Add more Swap memory3. Figure things out
... tried to allocate 8552 bytes in/path/to/wp-includes/wp-db.phpon line 1775
xdebugxhprof, tidewaysmemprof
Memory Profiling
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
Memory Profiling
vim trace.xt
Why?
posts_per_page => -11
// Pretty bad$posts = get_posts( array( 'posts_per_page' => -1, // ...) );
foreach ( $posts as $post ) { // ...}
// A little better$paged = 1;
while ( $posts = get_posts( array( 'posts_per_page' => 100, 'paged' => $paged++,) ) ) { foreach ( $posts as $post ) { // ... }}
// Goodwp_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()
// Not so goodob_start( 'ob_callback' );
// Much betterob_start( 'ob_callback', 1024*1024*2 );
function ob_callback( $content, $phase ) { // ...}
Context 4
is_admin()is_network_admin()is_front_page()is_singular()...
template_redirectwp_headwp_footershutdowncron
Context
Monitoring
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. Choose the right context
2. Profile with large datasets
3. Keep consumptionunder control
konstantin.blog/wcsof2016
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