Когда 777мс все еще не достаточно хороши (настройка MariaDB)
За последние пару месяцев я был в ярости, оптимизируя веб-сайт Joomla, которым я управляю. Когда я только начинал, домашняя страница открывалась примерно через 30-40 секунд, несмотря на неоднократное обновление моего выделенного сервера, как предложила хостинговая фирма.
Мне удалось снизить скорость страниц до 800 мс, неукоснительно следуя всем рекомендациям, подобным GT Matrix и PingdomTools (например, с использованием JCH-optimize, настроек кэширования и сжатия.htaccess и MaxCDN), но теперь я застрял оптимизировать мои настройки my.cnf, пробуя различные настройки, предложенные в ряде статей. Быстрее всего я открываю домашнюю страницу - с текущими настройками - через 777 мс после обновления, что может показаться не слишком плохим, но посмотрите на конфигурацию моего выделенного сервера:
- 2 Quad, 128 ГБ, 2x480 ГБ SSD RAID
- CloudLinux / Cpanel / WHM
- Apache / Suexec / PHP5 / FastCGI
- MariaDB 10.0.17 (все таблицы преобразованы в XtraDB/InnoDB)
Трафик сайта умеренный, 10 000 и 20000 посетителей в день, около 200 000 просмотров.
Это текущие настройки my.cnf. Моя цель - снизить скорость страниц до 600 мс, что должно быть возможно с таким оборудованием, если оно настроено правильно.
[mysqld]
local-infile=0
max_connections=10000
max_user_connections=1000
max_connect_errors=20
key_buffer_size=1G
join_buffer_size=1G
bulk_insert_buffer_size=1G
max_allowed_packet=1G
slow_query_log=1
slow_query_log_file="diskar/mysql-slow.log"
long_query_time=40
connect_timeout=120
wait_timeout=20
interfactive_timeout=25
back_log=500
query_cache_type=1
query_cache_size=512M
query_cache_limit=512K
query_cache_min_res_unit=2K
sort_buffer_size=1G
thread_cache_size=16
open_files_limit=10000
tmp_table_size=8G
thread_handling=pool-of-threads
thread_stack=512M
thread_pool_size=12
thread_pool_idle_timeout=500
thread_cache_size=1000
table_open_cache=52428
table_definition_cache=8192
default-storage-engine=InnoDB
[innodb]
memlock
innodb_buffer_pool_size=96G
innodb_buffer_pool_instances=12
innodb_additional_mem_pool_size=4G
innodb_log_bugger_size=1G
innodb_open_files=300
innodb_data_file_path=ibdata1:400M:autoextend
innodb_use_native_aio=1
innodb_doublewrite=0
innodb_user_atomic_writes=1
innodb_flus_log_at_trx_commit=2
innodb_compression_level=6
innodb_compression_algorithm=2
innodb_flus_method=O_DIRECT
innodb_log_file_size=4G
innodb_log_files_in_group=3
innodb_buffer_pool_instances=16
innodb_adaptive_hash_index_partitions=16
innodb_thread_concurrency
innodb_thread_concurrency=24
innodb_write_io_threads=24
innodb_read_io_threads=32
innodb_adaptive_flushing=1
innodb_flush_neighbors=0
innodb_io_capacity=20000
innodb_io_capacity_max=40000
innodb_lru_scan_depth=20000
innodb_purge_threads=1
innodb_randmon_read_ahead=1
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_use_fallocate=1
innodb_use_atomic_writes=1
inndb_use_trim=1
innodb_mtflush_threads=16
innodb_use_mfflush=1
innodb_file_per_table=1
innodb_file_format=Barracuda
innodb_fast_shutdown=1
Я попробовал Memcached и APCU, но это не сработало. Сайт на самом деле работает в 2-3 раза быстрее, используя "Файлы" в качестве обработчика кэширования в глобальной конфигурации Joomla. И да, я запустил свой sqltuner, но это не помогло.
Я новичок в том, что касается Linux, и подозреваю, что вышеуказанные настройки могут быть улучшены. Любые комментарии и / или предложения?
1 ответ
long_query_time=40
Установите значение 1, чтобы вы могли узнать, что такое медленные запросы.
max_connections=10000
Это неоправданно высоко. Если вы приблизитесь к нему, у вас будет больше проблем, чем при невозможности подключения. Скажем, только 3000.
query_cache_type=1
query_cache_size=512M
Кэш запросов снижает производительность, будучи таким большим. Это происходит потому, что любая запись приводит к очистке всех записей QC для таблицы. Рекомендую не более 50М. Если у вас есть тяжелые записи, может быть лучше изменить тип на DEMAND
и перец ваш SELECTs
с SQL_CACHE
(для относительно статических таблиц) или SQL_NO_CACHE
(для занятых столов).
Какая ОС?
Являются ли записи в [innodb]
сделать это в систему? Я думал, что это должно быть в [mysqld]
, Проверьте, делая SHOW VARIABLES LIKE 'innodb%';
,
Ах, педерасты; орфографическая ошибка:
innodb_log_bugger_size=1G
innodb_flus_log_at_trx_commit=2
inndb_use_trim=1
и больше??
После того, как вы получите некоторые данные в медленном журнале, запустите pt-query-digest, и давайте обсудим верхнюю пару запросов.