web-dev-qa-db-ja.com

挿入パフォーマンスが非常に低いMySQL / Perconaサーバー

UbuntuサーバーインストールからPercona-Serverインスタンスを実行しています。このデータベースにアクセスする必要のあるアプリケーションを使用していますが、パフォーマンスが非常に低下しています。データベースが確立されると、アプリケーションが(インストール時に)実行され、スキーマが作成されます。すべてデフォルトでMyISAMですが、テーブルエンジンをInnoDBに戻しました。私が抱えている問題は、挿入パフォーマンスが非常に低いことです。このアプリケーションは非常に書き込みが多く、どのような種類のバッファも使用せずに、一度に1行ずつディスクに書き込むように見えますが、これを確認または確認する方法がわかりません。テーブルの1つからのselect(*)でも2.4秒かかり、163,000行しかありません。他に何ができるのか途方に暮れています。

サーバーには8GBのRAMがあり、これが発生している間、CPUはほぼ完全にアイドル状態です。

my.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

挿入パフォーマンスが低い1つのテーブルの説明:

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)
3
Tony

観測#1

バッファープールが6G(6144M)であるため、 innodb_log_file_size は1536M(6Gの25%)である必要があります

観測#2

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です。これにより、OSがバイナリログの変更をディスクにフラッシュします。

観測#3

innodb_io_capacity が10000に設定されています。これは、mysqlに期待される実際には10000 IOPです。下げてみてください。

この点でやるべきことがいくつかあります

  • Sync_binlog に関しては
    • My.cnfからコメントアウトします。
    • バイナリログのフラッシュのペースを調整するには、sync_binlogを100または200に設定します
  • データディスクにバッテリバックアップ式のキャッシュがあることを確認する必要があります(適切なバッテリを使用)

勧告

ステップ01)my.cnfでこれらのオプションを設定します

[mysqld]
innodb_fast_shutdown = 0
innodb_log_file_size = 1536M
sync_binlog = ( you choose 0 or 100 )

ステップ02) innodb_io_capacityを削除 。デフォルトに設定します。

ステップ03)mysqlでこのコマンドを実行します

mysql> SET GLOBAL innodb_fast_shutdown = 0;

ステップ04)設定を適用

cd /mnt/Storage/mysql
service mysql stop
mv ib_logfile0 ib_logfile0.bak
mv ib_logfile2 ib_logfile1.bak
service mysql start

これはスピードアップするはずです

6
RolandoMySQLDBA