InnoDB INSERTパフォーマンスの機能


11

こんにちは、Percona Serverの最新バージョンを実行しています。

サーバーのバージョン:5.5.24-55 Percona Server(GPL)、リリース26.0

私はこれらの特性の10 cpuボックスを持っています。

processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 16
model           : 9
model name      : AMD Opteron(tm) Processor 6128
stepping        : 1
microcode       : 0x10000d9
cpu MHz         : 800.000
cache size      : 512 KB

SSDと64GBのRAMを搭載しています。Innodbは約10GBであるため、innodb_buffer_pool_sizeは10GBに設定されています。

次のようなテーブルがあります。

create table TODAY
( symbol_id       integer not null
, openp           decimal(10,4)
, high            decimal(10,4)
, low             decimal(10,4)
, last            decimal(10,4) not null
, volume          int
, last_updated      datetime        -- the time of the last quote update
, prev        decimal(10,4) null
, PRIMARY KEY ( symbol_id )
)

空のテーブルから始めて23,000行の挿入を行うと、約10秒かかります。その後、すべての行のすべての列が更新される更新を実行する場合(もちろん、symbol_idを除く)、11〜12秒ほど長くかかります。

これは一般的に私がInnodbに期待する書き込みパフォーマンスですか?このパフォーマンスを改善するための提案はありますか?23,000行の更新は極端なケースです。通常、取引日に5秒ごとに約1000行を更新する必要があるためです(つまり、これは私が扱っているより現実的な制約です)。

私が変更した他の関連するmysql.cnf設定:

innodb_buffer_pool_size = 10G
innodb_log_file_size    = 64M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

ところで、Innodbの代わりにENGINE = MEMORYでテーブルを作成すると、挿入に約4秒、更新に約6秒かかります。

誰かがこのタイプのクエリのベンチマークを理解するのを手伝ってくれたり、時間を改善するのを手伝ってくれるTIAがたくさんあります。

ドン

PS完全なInnodb設定。

mysql> 'innodb%'のようなグローバル変数を表示します。
+ ------------------------------------------- + ----- ------------------- +
| 変数名| 値|
+ ------------------------------------------- + ----- ------------------- +
| innodb_adaptive_flushing | オン|
| innodb_adaptive_flushing_method | 見積もり|
| innodb_adaptive_hash_index | オン|
| innodb_adaptive_hash_index_partitions | 1 |
| innodb_additional_mem_pool_size | 8388608 |
| innodb_autoextend_increment | 8 |
| innodb_autoinc_lock_mode | 1 |
| innodb_blocking_buffer_pool_restore | オフ|
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_restore_at_startup | 0 |
| innodb_buffer_pool_shm_checksum | オン|
| innodb_buffer_pool_shm_key | 0 |
| innodb_buffer_pool_size | 10737418240 |
| innodb_change_buffering | すべて|
| innodb_checkpoint_age_target | 0 |
| innodb_checksums | オン|
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_corrupt_table_action | 主張する|
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
| innodb_dict_size_limit | 0 |
| innodb_doublewrite | オン|
| innodb_doublewrite_file | |
| innodb_fake_changes | オフ|
| innodb_fast_checksum | オフ|
| innodb_fast_shutdown | 1 |
| innodb_file_format | アンテロープ|
| innodb_file_format_check | オン|
| innodb_file_format_max | アンテロープ|
| innodb_file_per_table | オフ|
| innodb_flush_log_at_trx_commit | 2 |
| innodb_flush_method | O_DIRECT |
| innodb_flush_neighbor_pages | エリア|
| innodb_force_load_corrupted | オフ|
| innodb_force_recovery | 0 |
| innodb_ibuf_accel_rate | 100 |
| innodb_ibuf_active_contract | 1 |
| innodb_ibuf_max_size | 5368692736 |
| innodb_import_table_from_xtrabackup | 0 |
| innodb_io_capacity | 200 |
| innodb_kill_idle_transaction | 0 |
| innodb_large_prefix | オフ|
| innodb_lazy_drop_table | 0 |
| innodb_lock_wait_timeout | 50 |
| innodb_locks_unsafe_for_binlog | オフ|
| innodb_log_block_size | 512 |
| innodb_log_buffer_size | 8388608 |
| innodb_log_file_size | 67108864 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_max_dirty_pages_pct | 75 |
| innodb_max_purge_lag | 0 |
| innodb_mirrored_log_groups | 1 |
| innodb_old_blocks_pct | 37 |
| innodb_old_blocks_time | 0 |
| innodb_open_files | 300 |
| innodb_page_size | 16384 |
| innodb_purge_batch_size | 20 |
| innodb_purge_threads | 1 |
| innodb_random_read_ahead | オフ|
| innodb_read_ahead | 線形|
| innodb_read_ahead_threshold | 56 |
| innodb_read_io_threads | 4 |
| innodb_recovery_stats | オフ|
| innodb_recovery_update_relay_log | オフ|
| innodb_replication_delay | 0 |
| innodb_rollback_on_timeout | オフ|
| innodb_rollback_segments | 128 |
| innodb_show_locks_held | 10 |
| innodb_show_verbose_locks | 0 |
| innodb_spin_wait_delay | 6 |
| innodb_stats_auto_update | 1 |
| innodb_stats_method | nulls_equal |
| innodb_stats_on_metadata | オン|
| innodb_stats_sample_pages | 8 |
| innodb_stats_update_need_lock | 1 |
| innodb_strict_mode | オフ|
| innodb_support_xa | オン|
| innodb_sync_spin_loops | 30 |
| innodb_table_locks | オン|
| innodb_thread_concurrency | 0 |
| innodb_thread_concurrency_timer_based | オフ|
| innodb_thread_sleep_delay | 10000 |
| innodb_use_global_flush_log_at_trx_commit | オン|
| innodb_use_native_aio | オン|
| innodb_use_sys_malloc | オン|
| innodb_use_sys_stats_table | オフ|
| innodb_version | 1.1.8-rel26.0 |
| innodb_write_io_threads | 4 |
+ ------------------------------------------- + ----- ------------------- +
セット内の90行(0.00秒)

私はnumactl --hardwareを実行し、ここに私が得た出力があります。私の管理者からのコメントを以下に示します(解釈に関して)。

root @ prog:/ data / mysql#numactl --hardware
利用可能:4ノード(0-3)
ノード0 CPU:0 1 2 3
ノード0のサイズ:32766 MB
ノード0フリー:21480 MB
ノード1 CPU:4 5 6 7
ノード1のサイズ:32768 MB
ノード1の空き容量:25285 MB
ノード2 CPU:12 13 14 15
ノード2のサイズ:32768 MB
ノード2の空き容量:20376 MB
ノード3 CPU:8 9 10 11
ノード3のサイズ:32768 MB
ノード3の空き容量:24898 MB
ノード距離:
ノード0 1 2 3
  0:10 16 16 16
  1:16 10 16 16
  2:16 16 10 16
  3:16 16 16 10

回答:


9

次の領域でInnoDB設定を調整する必要があります。

  • InnoDBにすべてのコアにアクセスさせる
  • innodb_buffer_pool_sizeを12Gに増やす
  • innodb_buffer_pool_instancesを2に増やします(最初に実行numactl --hardwareして、物理CPUの数を決定します。報告されるCPUの数ごとに、その数を使用します。これは、最近Jeremy Coleのブログで学びました)
  • ログファイルサイズ(innodb_log_file_size)を2047Mに増やす
  • 個々のInnoDBテーブルの個別のテーブルスペースファイルをサポート(innodb_file_per_tableに対応
  • 高性能または高耐久性をサポート(ACIDコンプライアンス)
    • ハイパフォーマンス:innodb_flush_log_at_trx_commitを0または2に設定
    • 高い耐久性:innodb_flush_log_at_trx_commitを1に設定(デフォルト)
    • 1秒あたりのトランザクション数(おそらく32M)と共に、innodb_log_buffer_sizeのサイズを増やします。
    • innodb_flush_log_at_trx_commitの現在の設定は良好です
    • innodb_flush_methodの現在の設定は適切です
  • innodb_read_io_threadsを64に増やす
  • innodb_write_io_threadsを64に増やす
  • innodb_io_capactityを10000に増やす

これが、InnoDBストレージエンジンのチューニングに関する私の過去の投稿です。


この信じられないほど便利な返事のTHX !! 敬礼します。ログのサイズについては、大きくしすぎることを心配する必要がありますか?私の懸念は、トカチェンコがmysqlperformanceblog.com/2011/09/18/disaster-mysql-5-5-flushingについて書いたものです。私はPerconaを使用していることを理解しているので、これは問題ではないかもしれません。私はあなたの返事の残りの部分を掘り下げています...
Don Wool 2012

innodb_buffer_pool_instancesについて16 CPUのボックスがあります(10だと思っていました)。私の管理者はnumactlに関して、「合計16のCPUと4つのRAMがあり、それぞれ32Gです。RAMの各ブロックは、4つのCPUによってローカルメモリとして扱われます。」
Don Wool 2012

実行numactl --hardwareして、質問の出力を投稿してください。私は物理CPUを把握しようとしていますが、管理者がコアを意味するときにCPUと言っていないことを確認したいと思います。
RolandoMySQLDBA 2012

質問に「numactl」の出力を投稿しました。
Don Wool 2012

私にとって、出力は4つのCPUを使用したクアッドクアッドコア(16コア)のように見えます。したがって、を設定しinnodb_buffer_pool_instances=4ます。もう1つのリクエスト:再確認してください。DBサーバーには64 GBまたは128 GBがありますか???
RolandoMySQLDBA 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.