7 убийц производительности WordPress

42
7 убийц производительности WordPress Константин Ковшенин

Transcript of 7 убийц производительности WordPress

Page 1: 7 убийц производительности WordPress

7 убийцпроизводительностиWordPressКонстантин Ковшенин

Page 2: 7 убийц производительности WordPress

session_start() 1

Page 3: 7 убийц производительности WordPress

Set-Cookie: PHPSESSID=hash

Hash — уникальное значение для каждого посетителя.

Page 4: 7 убийц производительности WordPress

session_set_save_handler()

Позволяет использовать произвольный механизм для хранения сессий, напримерRedis или MySQL.

Page 5: 7 убийц производительности WordPress

Cookies + JS + AJAX

Page 6: 7 убийц производительности WordPress

rand() 2

Page 7: 7 убийц производительности WordPress

script.js?v=rand()

Браузер не может использовать файл из кэша если адрес будет каждый раз меняться.

Page 8: 7 убийц производительности WordPress

Где 20150815 дата последнего изменения файла, или инкрементируемое число.Можно также использовать mtime().

script.js?v=20150815

Page 9: 7 убийц производительности WordPress

Как правило полное сканирование всей таблицы, часто с использованием временных таблиц на диске.

ORDER BY RAND()

Page 10: 7 убийц производительности WordPress

Не попадают под кэш запросов MySQL.

RAND(), NOW(),UNIX_TIMESTAMP()

Page 11: 7 убийц производительности WordPress

SELECT ID FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' AND post_date >= '2015-06-15' LIMIT 50;

Page 12: 7 убийц производительности WordPress

$p = my_get_posts_from_cache();$p = shuffle( $p ); // RAND()$p = array_slice( $p, 0, 10 );

При необходимости кэшируйте в PHP.

Page 13: 7 убийц производительности WordPress

SELECT * FROM wp_posts WHERE ID >=( SELECT FLOOR(( MAX(ID) - MIN(ID) + 1 ) * RAND()) + MIN(ID) FROM wp_posts ) LIMIT 1;

Page 14: 7 убийц производительности WordPress

wp_cron() 3

Page 15: 7 убийц производительности WordPress

Отключить запуск Cron по умолчанию можно с помощью директивы DISABLE_WP_CRON.

/etc/cron.d/wp-cron*/15 * * * * user php wp-cron.php

Page 16: 7 убийц производительности WordPress

wp_options 4

Page 17: 7 убийц производительности WordPress

Сколько запросов в MySQL?

get_option( 'home' );get_option( 'home' );get_option( 'home' );

Page 18: 7 убийц производительности WordPress

get_option( 'home' );get_option( 'home' );get_option( 'home' );

Сколько запросов в MySQL?Ответ: 0.

Page 19: 7 убийц производительности WordPress

wp_load_alloptions()

Одним запросом загружает все опции с флагом autoload в кэш объектов (память).

Page 20: 7 убийц производительности WordPress

CREATE TABLE wp_options ( option_id bigint(20), option_name varchar(64), option_value longtext, autoload varchar(20),);

Page 21: 7 убийц производительности WordPress

SELECT option_name, LENGTH(option_value) FROM wp_options WHERE autoload = 'yes';

Page 22: 7 убийц производительности WordPress

add_option( $name, $value $deprecated, $autoload );

$autoload — должна ли опция загружаться автоматически: yes/no.

Page 23: 7 убийц производительности WordPress

meta_query 5

Page 24: 7 убийц производительности WordPress

CREATE TABLE wp_postmeta ( meta_id bigint(20), post_id bigint(20), meta_key varchar(255), meta_value longtext,);

Page 25: 7 убийц производительности WordPress

CREATE INDEX meta_value ON wp_postmeta(meta_value(16));

Page 26: 7 убийц производительности WordPress

CREATE INDEX meta_key_value ON wp_postmeta( meta_key, meta_value(16) );

Page 27: 7 убийц производительности WordPress

EXPLAIN SELECT * FROM wp_postmeta WHERE meta_key = 'foo' AND meta_value LIKE '%bar%';

Page 28: 7 убийц производительности WordPress

Elasticsearch

Очень быстрый сервер для индексации и поиска с учетом морфологии, опечаток и т.д. Хорошо работает с плагином ElasticPress.

Page 29: 7 убийц производительности WordPress

wp_remote_* 6

Page 30: 7 убийц производительности WordPress

function my_get_weather( $city ) { $weather = wp_remote_get( ... ); return $weather;}

Page 31: 7 убийц производительности WordPress

function my_get_weather( $city ) { $key = md5( 'weather-' . $city ); if ( $cache = get_transient( $key ) ) return $cache;

$weather = wp_remote_get( ... ); set_transient( $key, $weather, 3600 ); return $weather;}

Page 32: 7 убийц производительности WordPress

TLC Transients

Транзитный кэш с фоновым обновлением.

Page 33: 7 убийц производительности WordPress

*.conf 7

Page 34: 7 убийц производительности WordPress

nginx.conf

worker_processeskeepalive_*gzipexpires

Page 35: 7 убийц производительности WordPress

php-fpm.conf

pm = static/dynamic/ondemandpm.max_childrenlisten.backlog

Page 36: 7 убийц производительности WordPress

my.cnf

innodb_buffer_pool_sizequery_cache_sizemax_connections

Page 37: 7 убийц производительности WordPress

Кэшируемость

Насколько эффективными являются использованные методы кэширования.

Page 38: 7 убийц производительности WordPress

ab, siege

Симулируют активность на сайте, позволяют измерить максимальное количество запросов в секунду. См. также loader.io.

Page 39: 7 убийц производительности WordPress

xhprof, xdebug

Инструменты для профилирования PHP кода, позволяют найти самые медленные функции.

Page 40: 7 убийц производительности WordPress

log_slow_queries

Позволяет найти медленные запросы в MySQL. См. также mysqlreport, mysqltuner.pl

Page 41: 7 убийц производительности WordPress

iperf, fio

Измерение скорости передачи данных по сети, скорости чтения/записи на диск.См. также iotop, iftop.

Page 42: 7 убийц производительности WordPress

kovshenin.com/wcrus2015