Kemampuan Kinerja InnoDB INSERT

11

Hai Saya menjalankan versi terbaru dari Percona Server.

Versi server: 5.5.24-55 Percona Server (GPL), Rilis 26.0

Saya memiliki kotak 10 cpu dengan karakteristik ini.

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

Ini memiliki SSD dan 64GB RAM. Innodb kira-kira 10GB, jadi innodb_buffer_pool_size diatur ke 10GB.

Saya punya tabel yaitu sebagai berikut:

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

Jika saya mulai dengan tabel kosong dan memasukkan 23.000 baris, dibutuhkan sekitar 10 detik. Jika saya kemudian melakukan pembaruan di mana setiap kolom setiap baris diperbarui (kecuali tentu saja symbol_id) dibutuhkan sedikit lebih seperti 11-12 detik.

Apakah ini secara umum kinerja penulisan yang saya harapkan dari Innodb? Apakah ada saran untuk meningkatkan kinerja ini? memperbarui 23.000 baris adalah kasus yang ekstrem, karena biasanya selama hari perdagangan saya perlu memperbarui sekitar 1000 baris setiap 5 detik (jadi, itu adalah kendala yang lebih realistis yang saya hadapi).

Pengaturan mysql.cnf lain yang relevan yang telah saya ubah:

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

BTW jika alih-alih Innodb saya membuat tabel dengan ENGINE = MEMORY dibutuhkan sekitar 4 detik untuk melakukan memasukkan, 6 detik untuk melakukan pembaruan.

Banyak TIA jika seseorang dapat membantu saya mencari tahu apa tolok ukur untuk jenis permintaan ini, atau membantu saya meningkatkan waktu.

Mengenakan

Pengaturan Innodb penuh PS.

mysql> menunjukkan variabel global seperti 'innodb%';
+ ------------------------------------------- + ----- ------------------- +
| Variable_name | Nilai |
+ ------------------------------------------- + ----- ------------------- +
| innodb_adaptive_flushing | ON |
| innodb_adaptive_flushing_method | perkiraan |
| innodb_adaptive_hash_index | ON |
| 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 | OFF |
| innodb_buffer_pool_inances | 1 |
| innodb_buffer_pool_restore_at_startup | 0 |
| innodb_buffer_pool_shm_checksum | ON |
| innodb_buffer_pool_shm_key | 0 |
| innodb_buffer_pool_size | 10737418240 |
| innodb_change_buffering | semua |
| innodb_checkpoint_age_target | 0 |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_corrupt_table_action | menegaskan |
| innodb_data_file_path | ibdata1: 10M: autoextend |
| innodb_data_home_dir | |
| innodb_dict_size_limit | 0 |
| innodb_doublewrite | ON |
| innodb_doublewrite_file | |
| innodb_fake_changes | OFF |
| innodb_fast_checksum | OFF |
| innodb_fast_shutdown | 1 |
| innodb_file_format | Antelope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | OFF |
| innodb_flush_log_at_trx_commit | 2 |
| innodb_flush_method | O_DIRECT |
| innodb_flush_neighbor_pages | area |
| innodb_force_load_corrupted | OFF |
| 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 | OFF |
| innodb_lazy_drop_table | 0 |
| innodb_lock_wait_timeout | 50 |
| innodb_locks_unsafe_for_binlog | OFF |
| 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 | OFF |
| innodb_read_ahead | linier |
| innodb_read_ahead_threshold | 56 |
| innodb_read_io_threads | 4 |
| innodb_recovery_stats | OFF |
| innodb_recovery_update_relay_log | OFF |
| innodb_replication_delay | 0 |
| innodb_rollback_on_timeout | OFF |
| 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 | ON |
| innodb_stats_sample_pages | 8 |
| innodb_stats_update_need_lock | 1 |
| innodb_strict_mode | OFF |
| innodb_support_xa | ON |
| innodb_sync_spin_loops | 30 |
| innodb_table_locks | ON |
| innodb_thread_concurrency | 0 |
| innodb_thread_concurrency_timer_based | OFF |
| innodb_thread_sleep_delay | 10000 |
| innodb_use_global_flush_log_at_trx_commit | ON |
| innodb_use_native_aio | ON |
| innodb_use_sys_malloc | ON |
| innodb_use_sys_stats_table | OFF |
| innodb_version | 1.1.8-rel26.0 |
| innodb_write_io_threads | 4 |
+ ------------------------------------------- + ----- ------------------- +
90 baris diset (0,00 dtk)

Saya menjalankan numactl --hardware dan ini adalah output yang saya dapatkan. Komentar dari admin saya tercantum di bawah ini (untuk interpretasi).

root @ prog: / data / mysql # numactl --hardware
tersedia: 4 node (0-3)
simpul 0 cpus: 0 1 2 3
simpul 0 ukuran: 32766 MB
simpul 0 gratis: 21480 MB
simpul 1 cpus: 4 5 6 7
simpul 1 ukuran: 32768 MB
simpul 1 gratis: 25285 MB
simpul 2 cpus: 12 13 14 15
simpul 2 ukuran: 32768 MB
simpul 2 gratis: 20376 MB
simpul 3 cpus: 8 9 10 11
simpul 3 ukuran: 32768 MB
simpul 3 gratis: 24898 MB
jarak simpul:
simpul 0 1 2 3
  0: 10 16 16 16
  1: 16 10 16 16
  2: 16 16 10 16
  3: 16 16 16 10

Don Wool
sumber

Jawaban:

9

Anda perlu menyesuaikan pengaturan InnoDB Anda di area berikut:

Berikut ini adalah tulisan lama saya tentang menyetel mesin penyimpanan InnoDB

RolandoMySQLDBA
sumber
Terima kasih untuk balasan yang sangat berguna ini !! Saya salut padamu. Mengenai ukuran log, apakah saya harus khawatir membuatnya terlalu besar? kekhawatiran saya adalah sesuatu yang Tkachenko tulis tentang mysqlperformanceblog.com/2011/09/18/disaster-mysql-5-5-flushing . Saya sadar saya ada di Percona, jadi mungkin ini bukan masalah .. tapi saya ingin memastikan saya tidak mengalami skenario warung. Saya menggali sisa jawaban Anda ...
Don Wool
salam innodb_buffer_pool_inances Saya punya kotak 16-cpu (saya pikir itu 10). salam numactl admin saya mengatakan "Anda memiliki total 16 CPU, dan empat blok RAM, masing-masing 32G. Setiap blok RAM diperlakukan sebagai memori lokal oleh empat CPU."
Don Wool
Silakan jalankan numactl --hardwaredan posting output dalam pertanyaan. Saya mencoba mencari tahu CPU fisik dan saya ingin memastikan admin tidak mengatakan CPU ketika dia bermaksud core.
RolandoMySQLDBA
Ok saya memposting output 'numactl' dalam pertanyaan.
Don Wool
Bagi saya, output terlihat seperti quad-quad core (16 core) menggunakan 4 CPU. Karena itu, atur innodb_buffer_pool_instances=4. Satu lagi permintaan: Harap periksa kembali, apakah server DB memiliki 64GB atau 128GB ???
RolandoMySQLDBA