Есть mysql сервер (на нем ничего больше не крутится). На нем 4 базы. 3 из них в myisam (общий объем 400МБ) и одна целиком innodb (10 гб). Базы myisam практически не используются, может 3-4 запроса в час, основная информация в innodb базе.
Запросы естественно к innodb тяжелые. То выполняются достаточно быстро. Обнаружил 2 проблемы.1. Почему когда снимаю дамп с базы innodb резко падает скорость выполнения запросов? Как это лечить?
2. На сервере установлено 8 Гб памяти. После суток работы я обнаруживаю, что сервер mysql залез на 6гб в swap. Почему? Вроде нет ошибок в конфиге и память посчитана правильно под буфера и прочее.
root@db:~# cat /proc/meminfo
MemTotal: 8179108 kB
MemFree: 46896 kB
Buffers: 34368 kB
Cached: 23688 kB
SwapCached: 4488240 kB
Active: 7031740 kB
Inactive: 1008060 kB
SwapTotal: 11855928 kB
SwapFree: 5927964 kB
Dirty: 24 kB
Writeback: 16 kB
AnonPages: 7746516 kB
Mapped: 8196 kB
Slab: 49632 kB
SReclaimable: 15632 kB
SUnreclaim: 34000 kB
PageTables: 20140 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 15945480 kB
Committed_AS: 9688980 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 6076 kB
VmallocChunk: 34359732247 kB
Настройки такие:
root@db:~# cat /etc/mysql/my.cnf
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
user = mysql
character-set-server = utf8
default-character-set = utf8
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
log-error = /var/log/mysql/mysqld.err
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
language = /usr/share/mysql/english
skip-external-locking
bind-address = 192.168.117.2
max_connections = 2000
wait_timeout = 60
key_buffer = 128M
sort_buffer_size = 4M
read_buffer_size = 2M
join_buffer_size = 2M
max_heap_table_size = 128M
tmp_table_size = 512M
thread_cache_size = 20
table_cache = 256
query_cache_size = 64M
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 7
log_bin_trust_function_creators = 1
myisam_sort_buffer_size = 4M
myisam-recover = FORCE
innodb_buffer_pool_size = 6700M
innodb_additional_mem_pool_size = 16M
innodb_log_buffer_size = 32M
innodb_thread_concurrency = 8
innodb_flush_method = O_DIRECT
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[isamchk]
key_buffer = 1M
sort_buffer_size = 1M
read_buffer = 1M
write_buffer = 1M
[myisamchk]
key_buffer = 1M
sort_buffer_size = 1M
read_buffer = 1M
write_buffer = 1M
Как я понял из чтения документации, после чего и писал конфиг файл, мне надо максимум памяти отвести под innodb_buffer_pool_size. Что я и сделал под остальные структуры отводил по остаточному принципу, но при этом не забывая смотреть на соответствующие показатели базы.
Где у меня ошибка? Почему mysql свапится? Что я делаю не так? куда копать итд. Может у меня неправильный подход к расчетам?