@wtfowned

Почему SSD загружается на 100% при INSERT в Mysql?

Доброго дня!
Есть сервер (ram 64GB) с SSD диском (500gb samsung), сервер не нагружен.
Как только начинаю делать INSERT в таблицы mysql через PHP, то диск просто "умирает" - 100% IO загружаются процессом [jbd2/sda3-8], при этом на SELECT все отлично работает с множеством сайтов.
На что обратить внимание и куда смотреть?
Вот как выглядит записал вывод iotop
https://drive.google.com/file/d/13xa80U9DvCjGxAu5z...

Конфиг mysql
[client]
port=3306
socket=/var/run/mysqld/mysqld.sock

[mysqld_safe]
socket=/var/run/mysqld/mysqld.sock

[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
port=3306
basedir=/usr
datadir=/var/lib/mysql
tmpdir=/tmp
lc-messages-dir=/usr/share/mysql
log_error=/var/log/mysql/error.log

symbolic-links=0

skip-external-locking
key_buffer_size = 128M
max_allowed_packet = 32M
#table_open_cache = 256
#sort_buffer_size = 1M
#read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
#query_cache_size= 16M
query_cache_size = 0 #tuner
query_cache_type = 0 #tuner
query_cache_limit = 1M #tuner
join_buffer_size = 128M #tuner
sort_buffer_size = 128M #my initiative
read_rnd_buffer_size = 128M #my initiative
tmp_table_size = 4GB #tuner
max_heap_table_size = 4GB #tuner

innodb_buffer_pool_instances = 8 #my initiative  https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_buffer_pool_instances рекомендуют устанавливать не больше чем физических ядер
# Должно высчитываться по формуле ( innodb_log_file_size * innodb_log_files_in_group should be equals to 1/4 of buffer pool size)
innodb_buffer_pool_size = 48GB # tuner
innodb_log_files_in_group = 2 #tuner
innodb_log_file_size = 6GB #tuner
#innodb_additional_mem_pool_size = 128MB #my initiative - DEPRECATED
innodb_log_buffer_size = 1GB #my initiative можно и до 15% размера журналов  A large log buffer enables large transactions to run without the need to write the log to disk before the transactions commit. Thus, if you have transactions that update, insert, or delete many rows, making the log buffer larger saves disk I/O. 
#innodb_use_native_aio = 0
innodb_file_per_table

#The open_files_limit should typically be set to at least 2x-3x
#that of table_cache if you have heavy MyISAM usage.
#FORMULA : 10 + max_connections + (table_open_cache * 2)
table_open_cache = 5000 #tuner
open_files_limit = 5000 #tuner

#max_connections=200
max_connections=100
max_user_connections=50
wait_timeout=10
interactive_timeout=28800 # for Scripts and Scrapers! (Was 10)
long_query_time=5

!includedir /etc/mysql/conf.d/



P.S. На локальном компе на SSD все работает значительно быстрее именно на запись.
  • Вопрос задан
  • 582 просмотра
Решения вопроса 1
@Swartalf
0. Я бы не переходил бы с innodb на myisam, обычно переходят наоборот. В Myisam много проблем решенных в innodb.
1. Делать множественные одиночные инсерты = зло. Транзакции и куски по 1/10/20/etc строк правильней.
2. Какое значение innodb_flush_log_at_trx_commit ? попробуте выставить значение 2, про риски см. линк.
3. Так же есть innodb_doublewrite . Что бы снизить нагрузку на диск, можете попробовать отключить, но тут же опять на ваш страх и риск.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
inside22
@inside22
wtfowned возможно у вас в этой таблице слишком много индексом и INSERT запросе индексы начинают обновляться, а этот процесс очень ресурсоемкий.
Ответ написан
@klepiku
кэширование на ssd отключено ?

посмотрите мануалы на предмет кэш и рам
https://dev.mysql.com/doc/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы