Мы запустили сайт (Moodle), который в настоящее время пользователи находят медленным. Я думаю, что отследил проблему, создав MySQL временные таблицы на диске. Я наблюдаю переменную created_tmp_disk_tables
в администрировании сервера Mysql Workbench, и ее число увеличивается примерно на 50 таблиц / с. После дней использования created_tmp_disk_tables
> 100k. Кроме того, память, кажется, не освобождается. Использование продолжает расти, пока система не станет в значительной степени непригодной для использования, и мы должны перезапустить MySQL. Мне нужно перезапускать его почти каждый день, и он начинается с использования около 30-35% доступной памяти и заканчивает день с 80%.
У меня нет блобов в базе данных и нет контроля над запросами, поэтому я не могу попытаться оптимизировать их. Я также использовал Percona Confirguration Wizard для создания файла конфигурации, но my.ini также не решил мою проблему.
Вопросов
Что я должен изменить, чтобы MySQL не создавал временные таблицы на диске? Есть ли настройки, которые мне нужно изменить? Должен ли я бросить больше памяти на это?
Как я могу остановить MySQL от потребления моей памяти?
редактировать
Я включил slow_queries
журнал и обнаружил, что запрос SELECT GET_LOCK()
был зарегистрирован как медленный. Быстрый поиск показал, что я разрешил постоянные соединения в конфигурации PHP ( mysqli.allow_persistent = ON
). Я выключил это. Это уменьшило скорость, с которой MySQL потребляет память. Хотя он все еще создает временные таблицы.
Я также проверил, что key_buffer size
это достаточно большой. Я посмотрел на переменную key_writes
. Это должно быть ноль. Если нет, увеличьте. У key_buffer_size
меня есть ноль key_reads
и ноль, key_writes
поэтому я предполагаю, что key_buffer_size
он достаточно велик.
Я увеличил tmp_table_size
и max-heap-table-size
до 1024M, так как увеличение созданных_данных_данных может указывать на то, что таблицы не помещаются в памяти. Это не решило это.
Редактировать 2
Если вы видите много sort_merge_passes
в секунду в выходных данных SHOW GLOBAL STATUS, вы можете рассмотреть возможность увеличения sort_buffer_size
значения. У меня было 2 sort_merge_passes
в час, поэтому я считаю, что sort_buffer_size
достаточно большой.
Ссылка: Mysql Руководство по sort_buffer_size
Редактировать 3
Я изменил буферы сортировки и объединения в соответствии с предложением @RolandoMySQLDBA. Результат отображается в таблице ниже, но я думаю, что created_tmp_tables_on_disk
она все еще высока. Я перезапустил сервер mysql после того, как изменил значение и проверил значение created_tmp_tables_on_disk
через день (8 часов) и вычислил среднее значение. Любые другие предложения? Мне кажется, что что-то не подходит внутри какого-то контейнера, но я не могу понять, что это такое.
+---------------------+-------------+-------------+--------------------+
| Tmp_table_size, | Sort_buffer | Join_buffer | No of created |
| max_heap_table_size | | | tmp_tables on disk |
+---------------------+-------------+-------------+--------------------+
| 125M | 256K | 256K | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 512K | 512K | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 1M | 1M | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 4M | 4M | 100k/h |
+---------------------+-------------+-------------+--------------------+
Это моя конфигурация:
+-----------------------+-----------------------+
|DATABASE SERVER |WEB SERVER |
+-----------------------+-----------------------+
|Windows Server 2008 R2 |Windows Server 2008 R2 |
+-----------------------+-----------------------+
|MySQL 5.1.48 |IIS 7.5 |
+-----------------------+-----------------------+
|4 Core CPU |4 Core CPU |
+-----------------------+-----------------------+
|4GB RAM |8GB RAM |
+-----------------------+-----------------------+
Дополнительная информация
+--------------------+---------+
|PARAM |VALUE |
+--------------------+---------+
|Num of tables in Db |361 |
+--------------------+---------+
|Size of database |2.5G |
+--------------------+---------+
|Database engine |InnoDB |
+--------------------+---------+
|Read/write ratio |3.5 |
|(Innodb_data_read/ | |
|innodb_data_written)| |
+--------------------+---------+
|Avg table size |15k rows |
+--------------------+---------+
|Max table size |744k rows|
+--------------------+---------+
Эта настройка была дана мне, поэтому я ограничил контроль над ней. Веб-сервер использует очень мало ЦП и ОЗУ, поэтому я исключил эту машину как узкое место. Большинство настроек MySQL происходит из инструмента автоматической генерации конфигурации.
Я наблюдал за системой, используя PerfMon в течение нескольких представительных дней. Исходя из этого, я делаю вывод, что не ОС загружает диск.
My.ini
[client]
port=3306
[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
datadir="D:/DBs/Data/"
default-character-set=utf8
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=125
query_cache_size=350M
table_cache=1520
tmp_table_size=125M
table-definition-cache= 1024
max-heap-table-size= 32M
thread_cache_size=38
MyISAM Specific options
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=125M
key_buffer_size=55M
read_buffer_size=1024K
read_rnd_buffer_size=256K
sort_buffer_size=1024K
join_buffer_size=1024K
INNODB Specific options
innodb_data_home_dir="D:/DBs/"
innodb_additional_mem_pool_size=32M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=16M
innodb_buffer_pool_size=2G
innodb_log_file_size=407M
innodb_thread_concurrency=8