Наша задача установить оптимальные параметры конфигурации базы данных, для улучшения общей производительности Mysql и сервера в целом.
Изначально я перерыл кучи мануалов и рекомендаций по оптимальной настройке конфиги Mysql, очень много гемора и тестов! Mysql в принципе работал нормально, но меня очень настораживало, что иногда скул сам рестартился.
Как то раз руки все таки дошли до логов, оказалось, что скулу не хватало памяти и он вылетал, что приводило иногда к повреждениям таблиц Почему скул не использовал свап для меня так и осталось загадкой.
После установки Munin я оптимизировал работу апача? что дало пару сотен свободного рама. Это сподвигло меня выделить их для Mysql, в итоге были найдены два скрипта для автоматической помощи настройки my.cnf
Это MySQLTuner и MySQL Performance Tuning Primer Script
И так начнем с первого MySQLTuner
:
Сайт: blog.mysqltuner.com
Сам скрипт: blog.mysqltuner.com/download/
1. Качаем
1 |
wget mysqltuner.pl
|
2. Устанавливаем права:
1 |
chmod u+x mysqltuner.pl |
3. Запускаем:
1 |
./mysqltuner.pl |
4. Вводим логин и пароль рута:
1 2 |
Please enter your MySQL administrative login: Please enter your MySQL administrative password: |
Получаем что-то такого вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
-------- General Statistics -------------------------------------------------- [--] Skipped version check for MySQLTuner script [!!] Your MySQL version 4.1.21-log is EOL software! Upgrade soon! [OK] Operating on 32-bit architecture with less than 2GB RAM -------- Storage Engine Statistics ------------------------------------------- [--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster [--] Data in MyISAM tables: 1G (Tables: 2268) [--] Data in InnoDB tables: 896K (Tables: 56) [--] Data in HEAP tables: 1M (Tables: 2) [!!] Total fragmented tables: 200 -------- Performance Metrics ------------------------------------------------- [--] Up for: 2d 16h 1m 16s (7M q [30.639 qps], 587K conn, TX: 2B, RX: 1B) [--] Reads / Writes: 66% / 34% [--] Total buffers: 458.0M global + 27.2M per thread (70 max threads) [!!] Allocating > 2GB RAM on 32-bit systems can cause system instability [!!] Maximum possible memory usage: 2.3G (115% of installed RAM) [OK] Slow queries: 0% (1K/7M) [!!] Highest connection usage: 100% (71/70) [OK] Key buffer size / total MyISAM indexes: 64.0M/360.6K [OK] Key buffer hit rate: 99.9% (155M cached / 165K reads) [OK] Query cache efficiency: 52.3% (1M cached / 3M selects) [!!] Query cache prunes per day: 37386 [OK] Sorts requiring temporary tables: 0% (24 temp sorts / 149K sorts) [!!] Joins performed without indexes: 59355 [!!] Temporary tables created on disk: 31% (8K on disk / 25K total) [OK] Thread cache hit rate: 98% (6K created / 587K connections) [OK] Table cache hit rate: 20% (2K open / 9K opened) [OK] Open file limit used: 34% (3K/11K) [OK] Table locks acquired immediately: 99% (2M immediate / 2M locks) [OK] InnoDB data size / buffer pool: 896.0K/8.0M -------- Recommendations ----------------------------------------------------- General recommendations: Run OPTIMIZE TABLE to defragment tables for better performance Reduce or eliminate persistent connections to reduce connection usage Adjust your join queries to always utilize indexes When making adjustments, make tmp_table_size/max_heap_table_size equal Reduce your SELECT DISTINCT queries without LIMIT clauses Variables to adjust: *** MySQL's maximum memory usage is dangerously high *** *** Add RAM before increasing MySQL buffer variables *** max_connections (> 70) wait_timeout (< 28800) interactive_timeout (< 28800) query_cache_size (> 128M) join_buffer_size (> 1020.0K, or always use indexes with joins) tmp_table_size (> 256M) max_heap_table_size (> 255M) |
В итоге самое важное читаем после Recommendations:
Оптимизируйте таблицы, используйте индексы, увеличте темпы для таблиц, используйте поменьше запросов с Limit и далее рекомендации по установке параметров.
Но я бы не рекомендовал так спешить устанавливать и завышать параметры, внимательно посмотрите в раздел Performance Metrics, что у вас там сказано про использование памяти:
[!!] Maximum possible memory usage: 2.3G (115% of installed RAM)
т.е. у меня скул может сожрать на 15% больше доступного рама… что не гуд! лучшее значение это 90%
Примерная формула по которой вычисляется максимум использования памяти:
1 |
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections |
Так что не перетрудитесь
Второй скрипт MySQL Performance Tuning Primer Script
Сайт: day32.com/MySQL/
Сам скрипт: day32.com/MySQL/tuning-primer.sh
1. Качаем:
1 |
wget http://www.day32.com/MySQL/tuning-primer.sh |
2. Даем права
1 |
chmod u+x tuning-primer.sh |
3. Запускаем
1 |
./tuning-primer.sh |
4. Указываем соккет, Вводим логин, пароль, создаем файл с настройками
1 2 3 4 5 |
Would you like to provide a different socket?: [y/N] y Do you have your login handy ? [y/N] : y User: Password: Would you like me to create a ~/.my.cnf file for you? [y/N] : y |
Пример вывода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
-- MYSQL PERFORMANCE TUNING PRIMER -- - By: Matthew Montgomery - MySQL Version 4.1.21-log i386 Uptime = 2 days 16 hrs 42 min 46 sec Avg. qps = 30 Total Questions = 7156747 Threads Connected = 27 Server has been running for over 48hrs. It should be safe to follow these recommendations To find out more information on how each of these runtime variables effects performance visit: http://dev.mysql.com/doc/refman/4.1/en/server-system-variables.html Visit http://www.mysql.com/products/enterprise/advisors.html for info about MySQL's Enterprise Monitoring and Advisory Service SLOW QUERIES The slow query log is enabled. Current long_query_time = 1 sec. You have 1410 out of 7156763 that take longer than 1 sec. to complete Your long_query_time seems to be fine ............................................. TABLE SCANS Current read_buffer_size = 1 M Current table scan ratio = 541 : 1 read_buffer_size seems to be fine TABLE LOCKING Current Lock Wait ratio = 1 : 612 You may benefit from selective use of InnoDB. If you have long running SELECT's against MyISAM tables and perform frequent updates consider setting 'low_priority_updates=1' |
Читаем, анализируем. Обращаем внимание на то где написано красным!
Для внесения изменений делаем бекап my.cnf
1 |
cp -a /etc/my.cnf /etc/my.cnf.bak |
ну или ручками анпример в MC
Далее рестартим mysql чтобы внесённые изменения вступили в силу.
Через панель или командную строку… например:
1 |
/etc/rc.d/init.d/mysqld restart |
После ждем часов 8-12, в принципе уже будет видно, полегчало или нет…
На данный момент мой сервер обрабаытвает примерно 30 запросов в секунду..
За 2 дня 16 часов 42 минуты было обработано 7 156 747 без каких либо напрягов и свапов.
После доводки конфига кеш стал использовать примерно на 25% лучше, вот скрин работы:
https://www.sqrs.ru/2009/10/22/82/
Просмотров: 2002