由于MariaDB的高I / O

我用php-fpm和mariadb使用nginx。 有时我的网页加载缓慢。 通过检查munin,我看到我的平均I / O等待时间非常长,高达8秒。 在php-slowlog中列举了mysql-functions作为原因,例如mysql_query()。 我尝试调整mariadb服务器(例如,增加caching,将tmp目录从hdd移动到ramdisk)。 但是我的I / O得到了随机的高。

在这里输入图像说明

例如在图表的开头。 我认为我解决了这个问题,但是等待时间增加了,没有任何明显的原因。 当我重新启动mariadb时,它迅速下降(你可以看到最后它是如何下降的,我在这里重新启动了mariadb)。

我没有真正使用太多的I / O,峰值约为8MB / s:

在这里输入图像说明

值得注意的是,Table_locks_immediate与Table_locks_waited的比例正在增加。 当我重新启动mariadb,这是2.5%。 服务器现在已经涨了30分钟,涨幅已经达到了3.5%。 我也注意到,当服务器挂着正在运行的线程(Threads_running)的数量很高(最多30)。 当这个数字下降,服务器停止挂起。

我的my.cnf:

[client] port = 3306 socket = /var/run/mysqld/mysqld.sock [mysqld_safe] socket = /var/run/mysqld/mysqld.sock nice = 0 [mysqld] sync_binlog = 3 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 tmpdir = /var/mysqltmp lc_messages_dir = /usr/share/mysql lc_messages = en_US skip-external-locking log-bin=/var/mysqltmp/mysql-bin.log #log=/var/mysqltmp/mysql.log log-error=/var/mysqltmp/mysql-error.log log-slow-queries=/var/mysqltmp/mysql-slowquery.log bind-address = 127.0.0.1 max_tmp_tables = 100 max_connections = 150 connect_timeout = 5 #wait_timeout = 600 wait_timeout = 800 max_allowed_packet = 16M thread_cache_size = 128 #sort_buffer_size = 4M sort_buffer_size = 8M bulk_insert_buffer_size = 8M max_heap_table_size = 128M tmp_table_size = 128M #tmp_table_size = 64M # * MyISAM myisam_recover = BACKUP key_buffer_size = 256M #open-files-limit = 2000 table_open_cache = 1000 myisam_sort_buffer_size = 8M #concurrent_insert = 2 #read_buffer_size = 2M read_buffer_size = 4M #read_rnd_buffer_size = 1M read_rnd_buffer_size = 2M # * Query Cache Configuration query_cache_limit = 256M query_cache_size = 256M # for more write intensive setups, set to DEMAND or OFF query_cache_type = ON #table_cache = 400 table_open_cache = 2000 join_buffer_size = 4M # * Logging and Replication log_warnings = 2 slow_query_log = 1 slow_query_log_file = /var/log/mysql/mariadb-slow.log long_query_time = 1 #log_slow_rate_limit = 1000 log_slow_verbosity = query_plan log_bin = /var/log/mysql/mariadb-bin log_bin_index = /var/log/mysql/mariadb-bin.index # not fab for performance, but safer #sync_binlog = 1 expire_logs_days = 10 max_binlog_size = 128M # * InnoDB default_storage_engine = InnoDB #innodb_log_file_size = 50M #innodb_buffer_pool_size = 256M innodb_buffer_pool_size = 256M innodb_log_buffer_size = 32M innodb_file_per_table = 1 innodb_open_files = 400 innodb_io_capacity = 400 #innodb_flush_method = O_DIRECT innodb_flush_method = O_DSYNC [mysqldump] quick quote-names max_allowed_packet = 16M [isamchk] #key_buffer = 16M key_buffer = 32M !includedir /etc/mysql/conf.d/ 

如果大部分表都是InnoDB ,那么至less应该将innodb_buffer_pool_size增加到数据库的总和,或者把2GB放到数据库中。 如果这个服务器只运行数据库服务,把这些值设置为总内存的60%或70%,那么你的数据库将完全适合内存。

如果大多数表是MyISAM ,则以相同的方式增加key_buffer_size

对于MyISAM,将concurrent_insert设置为2

query_cache_size高于64MB是浪费内存。

定期运行mysqlcheck -o -A来提高内部mysql查询规划器的索引统计。

避免查询谁做full_scan

如果您有单个磁盘存储或简单的RAID,请将innodb_io_capacity降至100120

使用XFS 在同一个文件中提供并发写入的优点。

noatime选项挂载你的fs。

避免交换。

禁用不必要的日志