MariaDB / MySQL использует много потоков / памяти

Я настраивал новый VPS и хотел попробовать MariaDB. Я использую MariaDB 10.0.1, который, насколько я понимаю, является эквивалентом MySQL 5.6.

Существенно ли изменилась обработка потоков с MariaDB/MySQL 5.5? Вот что я вижу на моем старом сервере (CentOS 5.9, MySQL 5.5):

mysql 5.5 на сентос 5.9

И на Centos 6.3 с MariaDB 10 (MySQL 5.6):

Мариадб 10 на сентос 6,3

Вот список фактов:

На сервере A (CentOS 5.9, MySQL 5.5):

  • Существует около 15 баз данных, подключенных к различным веб-сайтам и сервисам.
  • Plesk установлен
  • MySQL минимально настроен:

/etc/my.cnf

[mysqld]
local-infile=0
query_cache_type = 1
query_cache_size = 32M

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

# Misc vars
key_buffer_size=32M
join_buffer_size=512K
tmp_table_size=32M
max_heap_table_size=32M
thread_cache_size=4
table_cache=300

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# InnoDB vars
innodb_buffer_pool_size=96M
innodb_additional_mem_pool_size=500K
innodb_log_buffer_size=500K
innodb_thread_concurrency=2

На сервере B (CentOS 6.3, MariaDB 10):

  • Существует 3 базы данных, только одна из которых в настоящее время "используется" и подключена к сайту с низким трафиком.
  • Нет Plesk.
  • MariaDB минимально настроены:

/etc/my.cnf.d/server.cnf

[mysqld]
# threads
thread_concurrency=2
thread_cache_size=1
thread_handling=one-thread-per-connection
thread_pool_size=4
thread_pool_max_threads=4
thread_pool_idle_timeout=60
thread_stack=240K

# Limit Connections?
# max_connections=5

skip-external-locking
key_buffer_size=64M
max_allowed_packet=1M
table_open_cache=128
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=4M
net_buffer_length=8K
myisam_sort_buffer_size=32M
query_cache_size=16M

# innodb settings
innodb_buffer_pool_size=32M
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=30
innodb_thread_concurrency=0

Почему так много тем? Я перепробовал множество настроек, чтобы уменьшить количество потоков процессов до разумного уровня, но я не могу повлиять на это. Это всегда использует 20 или 21 потоков. Я смог сократить использование памяти, настроив innodb_buffer_pool_size, но 32M не является приемлемым значением для 10+ запущенных сайтов, поэтому я увеличу его до 96M или 128M. При этих значениях оперативная память, используемая mysql, превышает 750-850M памяти.

Если это просто то, с чем мне приходится жить, это нормально (у меня больше оперативной памяти на новом VPS, YOLO), но мне просто любопытно, почему существует такое огромное расхождение в использовании памяти.

Стоит также упомянуть, что если я отключил mysql на обоих VPS, я использовал почти одинаковое количество оперативной памяти - ~300M для A, ~260M для B.

1 ответ

Решение

MySQL должен использовать столько памяти, сколько у вас есть. Количество потоков в этом масштабе очень мало, и это не влияет на использование памяти. Потоки разделяют одно и то же пространство виртуальной памяти. Они используют только несколько КБ для метаданных потока.

Использование памяти на новом MySQL на самом деле меньше, чем раньше. Он выделил в виртуальной памяти пространство 1,1 ГБ, но у него всего 60 МБ в физической памяти.

При поиске оптимизации MySQL сначала попытайтесь переместить узкое место с дискового ввода-вывода в доступ к памяти. Оптимизировать также запросы (переписать их, индексы) - включить MySQL медленный журнал запросов.

Иногда вы достигаете аппаратного предела, и единственная оптимизация - это обновление аппаратного обеспечения. Для MySQL первым делом нужно добавить больше оперативной памяти, более быстрые диски, затем больше процессоров.

Другие вопросы по тегам