Ton*_*ony 3 mysql innodb performance percona-server xtradb
我正在从 Ubuntu 服务器安装运行 Percona-Server 实例。我正在使用一个需要访问这个数据库的应用程序,它的性能非常差。一旦建立了数据库,应用程序就会进入(安装时)并创建模式。它将所有内容默认为 MyISAM,但是我已将表引擎转换回 InnoDB。我遇到的问题是插入性能非常差。这个应用程序的写入量非常大,似乎它一次将每一行 1 写入磁盘,而不使用任何类型的缓冲区,但是我不确定如何检查或验证这一点。即使从其中一个表中选择(*)也需要 2.4 秒,并且只有 163,000 行。我有点不知所措,我还能做什么。
服务器有 8GB 的内存,在发生这种情况时 CPU 几乎完全空闲。
我的.cnf:
[mysql]
# CLIENT #
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld]
# GENERAL #
user = mysql
default_storage_engine = InnoDB
socket = /var/run/mysqld/mysqld.sock
pid_file = /var/run/mysqld/mysqld.pid
# MyISAM #
key_buffer_size = 32M
myisam_recover = FORCE,BACKUP
# SAFETY #
max_allowed_packet = 16M
max_connect_errors = 1000000
skip_name_resolve
sql_mode = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY
sysdate_is_now = 1
innodb = FORCE
innodb_strict_mode = 1
# DATA STORAGE #
datadir = /mnt/Storage/mysql/
# BINARY LOGGING #
log_bin = /mnt/Storage/mysql/mysql-bin
expire_logs_days = 14
sync_binlog = 1
# CACHES AND LIMITS #
tmp_table_size = 32M
max_heap_table_size = 32M
query_cache_type = 0
query_cache_size = 0
max_connections = 500
thread_cache_size = 50
open_files_limit = 65535
table_definition_cache = 1024
table_open_cache = 2048
# INNODB #
innodb_flush_method = O_DIRECT
innodb_log_files_in_group = 2
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 0
innodb_file_per_table = 1
innodb_buffer_pool_size = 6144M
innodb_buffer_pool_instances = 1
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 10000
# LOGGING #
log_error = /mnt/Storage/mysql/mysql-error.log
log_queries_not_using_indexes = 1
slow_query_log = 1
slow_query_log_file = /mnt/Storage/mysql/mysql-slow.log
Run Code Online (Sandbox Code Playgroud)
一张插入性能不佳的表的描述:
mysql> desc parts;
+------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+----------------+
| ID | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| binaryID | int(11) unsigned | NO | MUL | 0 | |
| messageID | varchar(255) | NO | | | |
| number | bigint(20) unsigned | NO | MUL | 0 | |
| partnumber | int(10) unsigned | NO | | 0 | |
| size | bigint(20) unsigned | NO | | 0 | |
| dateadded | datetime | YES | MUL | NULL | |
+------------+---------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
由于您的缓冲池是 6G (6144M),因此innodb_log_file_size应该是 1536M(6G 的 25%)
您已将sync_binlog设置为 1。这提供了最安全的 ACID 兼容设置。它还可以显着减慢速度。你说it seems as though its writing each row 1 at a time to disk
。这是因为每个完成的 DML(INSERT、UPDATE、DELETE)和 DDL(ALTER TABLE)语句都会写入二进制日志。sync_binlog 的默认值为 0。这让操作系统负责将二进制日志更改刷新到磁盘。
您将innodb_io_capacity设置为 10000。这确实是您期望 mysql 的 10000 IOP。尝试降低它。
在这方面有一些事情要做
STEP 01) 在 my.cnf 中设置这些选项
[mysqld]
innodb_fast_shutdown = 0
innodb_log_file_size = 1536M
sync_binlog = ( you choose 0 or 100 )
Run Code Online (Sandbox Code Playgroud)
步骤 02)删除 innodb_io_capacity。让它设置为默认值。
步骤 03) 在 mysql 中运行此命令
mysql> SET GLOBAL innodb_fast_shutdown = 0;
Run Code Online (Sandbox Code Playgroud)
STEP 04) 应用设置
cd /mnt/Storage/mysql
service mysql stop
mv ib_logfile0 ib_logfile0.bak
mv ib_logfile2 ib_logfile1.bak
service mysql start
Run Code Online (Sandbox Code Playgroud)
这应该会加快速度
归档时间: |
|
查看次数: |
8901 次 |
最近记录: |