Я столкнулся с реальной проблемой с экземпляром MySQL для онлайн-сервиса. Мы используем пул hibernate и c3p0 со следующими настройками:
c3p0.max_size=200
c3p0.min_size=5
c3p0.timeout=60000
c3p0.max_statements=20
c3p0.idle_test_period=300
c3p0.acquire_increment=3
c3p0.unreturnedConnectionTimeout=70000
Я заметил, что сервис (веб-сайт) не работает, поскольку он отказывает в соединении. Я вхожу в консоль MySQL и show processlist
показаны в списке 30 спящих (командных) соединений с соответствующей базой данных. И это меня беспокоит. Мы ожидали 200 подключений каждый раз и включили максимальное количество подключений MySQL 300. Вот файл my. Cnf
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 128K
thread_cache_size = 8
max_connections = 300
#table_cache = 64
#thread_concurrency = 10
Полный my.cnf
Я провел небольшое исследование и увидел, что размер table_cache должен быть соответственно обновлен. Машина представляет собой четырехъядерный компьютер, на котором запущен сервер Ubuntu 9.10 4 ГБ оперативной памяти
** Вопрос 1: ** Как заставить c3p0 освободить незанятые соединения.
** Вопрос 2: ** Какие tache_cache и все другие параметры мне нужно исправить, чтобы сервер мог использовать весь свой потенциал и не отказываться от соединений
** Вопрос 3: ** После перезапуска Tomcat количество подключений MySQL упало до 4. Мне нужно исправить это как можно скорее, и для этого мне нужен ваш опыт. Но я бы тоже хотел получить этот опыт на время. Какую возможную книгу вы должны порекомендовать от настройки производительности MySQL до кластеризации.
Настройку MySQL можно выполнить с помощью нескольких скриптов.
Mysqltuner, mytop, mysqlreport, tuning-primer ... Эти скрипты предоставят вам подробную информацию о вашем сервере ...
Примеры смотрите по следующей ссылке
http://www.serveradminblog.com/2011/03/tuning-mysql-performance-howto-part-1/
Оптимизация - это бесконечный квест, но вот несколько вещей, которые могут помочь:
max_connect_errors
(Я использую 10, но вы можете попробовать больше)table_open_cache
: 2048 - это то, что я использую, но это зависит от количества таблиц в вашем приложении.query_cache_size
(т.е. 64 МБ)