Khả năng của Hiệu suất InnoDB INSERT


11

Xin chào Tôi đang chạy phiên bản mới nhất của Percona Server.

Phiên bản máy chủ: 5.5.24-55 Percona Server (GPL), Phiên bản 26.0

Tôi có một hộp 10 cpu của những đặc điểm này.

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

Nó có SSD và 64GB RAM. Innodb có dung lượng xấp xỉ 10GB, vì vậy innodb_buffer_pool_size được đặt thành 10GB.

Tôi có một bảng như sau:

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

Nếu tôi bắt đầu với một bảng trống và thực hiện chèn 23.000 hàng thì mất khoảng 10 giây. Nếu sau đó tôi thực hiện một bản cập nhật trong đó mỗi cột của mỗi hàng được cập nhật (tất nhiên trừ biểu tượng_id), sẽ mất hơn một chút như 11-12 giây.

Đây có phải là hiệu suất viết mà tôi nên mong đợi từ Innodb? Có bất kỳ đề nghị để cải thiện hiệu suất này? cập nhật 23.000 hàng là một trường hợp cực đoan, vì thông thường trong một ngày giao dịch tôi cần cập nhật khoảng 1000 hàng mỗi 5 giây (vì vậy, đó là ràng buộc thực tế hơn mà tôi đang xử lý).

Các cài đặt mysql.cnf khác có liên quan tôi đã thay đổi:

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

BTW nếu thay vì Innodb tôi tạo bảng với ĐỘNG CƠ = NHỚ thì mất khoảng 4 giây để thực hiện thao tác chèn, 6 giây để thực hiện cập nhật.

Nhiều TIA nếu ai đó có thể giúp tôi tìm ra điểm chuẩn cho loại truy vấn này hoặc giúp tôi cải thiện thời gian.

Don

PS cài đặt Innodb đầy đủ.

mysql hiển thị các biến toàn cục như 'innodb%';
+ ------------------------------------------- + ----- ------------------- +
| Biến_ame | Giá trị |
+ ------------------------------------------- + ----- ------------------- +
| innodb_adaptive_flushing | TRÊN |
| innodb_adaptive_flushing_method | ước tính |
| innodb_adaptive_hash_index | TRÊN |
| innodb_adaptive_hash_index_partitions | 1 |
| innodb_additable_mem_pool_size | 8388608 |
| innodb_autoextend_increment | 8 |
| innodb_autoinc_lock_mode | 1 |
| innodb_blocking_buffer_pool_restore | TẮT |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_restore_at_startup | 0 |
| innodb_buffer_pool_shm_checksum | TRÊN |
| innodb_buffer_pool_shm_key | 0 |
| innodb_buffer_pool_size | 10737418240 |
| innodb_change_buffering | tất cả |
| innodb_checkpoint_age_target | 0 |
| innodb_checksums | TRÊN |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_corrupt_table_action | khẳng định |
| innodb_data_file_path | ibdata1: 10M: tự động nhập |
| innodb_data_home_dir | |
| innodb_dict_size_limit | 0 |
| innodb_doublewrite | TRÊN |
| innodb_doublewrite_file | |
| innodb_fake_changes | TẮT |
| innodb_fast_checksum | TẮT |
| innodb_fast_shutdown | 1 |
| innodb_file_format | Linh dương |
| innodb_file_format_check | TRÊN |
| innodb_file_format_max | Linh dương |
| innodb_file_per_table | TẮT |
| innodb_flush_log_at_trx_commit | 2 |
| innodb_flush_method | O_DIRECT |
| innodb_flush_neighbor_pages | khu vực |
| innodb_force_load_corrupted | TẮT |
| 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 | TẮT |
| innodb_lazy_drop_table | 0 |
| innodb_lock_wait_timeout | 50 |
| innodb_locks_unsafe_for_binlog | TẮT |
| 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_denty_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 | TẮT |
| innodb_read_ahead | tuyến tính |
| innodb_read_ahead_thr Ngưỡng | 56 |
| innodb_read_io_threads | 4 |
| innodb_recovery_stats | TẮT |
| innodb_recovery_update_relay_log | TẮT |
| innodb numplication_delay | 0 |
| innodb_rollback_on_timeout | TẮT |
| innodb_rollback_segments | 128 |
| innodb_show_locks_ained | 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 | TRÊN |
| innodb_stats_sample_pages | 8 |
| innodb_stats_update_need_lock | 1 |
| innodb_strict_mode | TẮT |
| innodb_support_xa | TRÊN |
| innodb_sync_spin_loops | 30 |
| innodb_table_locks | TRÊN |
| innodb_thread_concurrency | 0 |
| innodb_thread_concurrency_timer_basing | TẮT |
| innodb_thread_s ngủ_delay | 10000 |
| innodb_use_global_flush_log_at_trx_commit | TRÊN |
| innodb_use_native_aio | TRÊN |
| innodb_use_sys_malloc | TRÊN |
| innodb_use_sys_stats_table | TẮT |
| innodb_version | 1.1.8-rel26.0 |
| innodb_write_io_threads | 4 |
+ ------------------------------------------- + ----- ------------------- +
90 hàng trong bộ (0,00 giây)

Tôi đã chạy numactl - phần mềm và đây là đầu ra mà tôi có. Các ý kiến ​​từ quản trị viên của tôi được ghi chú bên dưới (như hướng tới giải thích).

root @ prog: / data / mysql # numactl - phần mềm
có sẵn: 4 nút (0-3)
nút 0 cpus: 0 1 2 3
kích thước nút 0: 32766 MB
nút 0 miễn phí: 21480 MB
nút 1 cpus: 4 5 6 7
kích thước nút 1: 32768 MB
nút 1 miễn phí: 25285 MB
nút 2 cpus: 12 13 14 15
kích thước nút 2: 32768 MB
nút 2 miễn phí: 20376 MB
nút 3 cpus: 8 9 10 11
kích thước nút 3: 32768 MB
nút 3 miễn phí: 24898 MB
khoảng cách nút:
nút 0 1 2 3
  0: 10 16 16 16
  1: 16 10 16 16
  2: 16 16 10 16
  3: 16 16 16 10

Câu trả lời:


9

Bạn cần điều chỉnh cài đặt InnoDB của mình trong các lĩnh vực sau:

  • Làm cho InnoDB truy cập tất cả các lõi của bạn
  • Tăng innodb_buffer_pool_size lên 12G
  • Tăng innodb_buffer_pool_instances lên 2 (Lần chạy đầu tiên numactl --hardwaređể xác định số lượng CPU vật lý. Mỗi số CPU mà nó báo cáo, hãy sử dụng số đó. Tôi đã học được điều này gần đây trên Blog của Jeremy Cole )
  • Tăng kích thước tệp nhật ký ( innodb_log_file_size ) lên 2047M
  • hỗ trợ các tệp không gian bảng riêng biệt cho các bảng InnoDB riêng lẻ (enaled innodb_file_per_table )
  • hỗ trợ hiệu suất cao hoặc độ bền cao (Tuân thủ ACID)
    • Hiệu suất cao: innodb_flush_log_at_trx_commit được đặt thành 0 hoặc 2
    • Độ bền cao: innodb_flush_log_at_trx_commit được đặt thành 1 (Mặc định)
    • Tăng Kích thước lên innodb_log_buffer_size kết hợp với số lượng giao dịch mỗi giây (có thể là 32 triệu)
    • Cài đặt hiện tại của bạn cho innodb_flush_log_at_trx_commit là tốt
    • Cài đặt hiện tại của bạn cho innodb_flush_method là tốt
  • Tăng innodb_read_io_threads lên 64
  • Tăng innodb_write_io_threads lên 64
  • Tăng innodb_io_capactity lên 10000

Đây là những bài viết trước đây của tôi về việc điều chỉnh công cụ lưu trữ InnoDB


Thx cho câu trả lời vô cùng hữu ích này !! Tôi chào bạn. Về kích thước nhật ký, tôi có phải lo lắng về việc làm cho nó quá lớn không? mối quan tâm của tôi là điều mà Tkachenko đã viết về mysqlperformanceblog.com/2011/09/18/disaster-mysql-5-5-flushing . Tôi nhận ra mình đang ở Percona, vì vậy có lẽ đây không phải là vấn đề đáng lo ngại .. nhưng tôi muốn chắc chắn rằng tôi không gặp phải tình huống khó khăn. Tôi đang đào sâu vào phần còn lại của câu trả lời của bạn ...
Don Wool

liên quan đến innodb_buffer_pool_instances Tôi có hộp 16 cpu (tôi đã nghĩ nó là 10). Liên quan đến numactl, quản trị viên của tôi nói rằng "Bạn có 16 CPU tổng cộng và bốn khối RAM, mỗi khối 32G. Mỗi khối RAM được coi là bộ nhớ cục bộ của bốn CPU."
Don Wool

Hãy chạy numactl --hardwarevà gửi đầu ra trong câu hỏi. Tôi đang cố gắng tìm ra CPU vật lý và tôi muốn chắc chắn rằng quản trị viên không nói CPU khi anh ta nói là lõi.
RolandoMySQLDBA

Ok tôi đã đăng kết quả đầu ra của 'numactl' trong câu hỏi.
Don Wool

Đối với tôi, đầu ra trông giống như lõi tứ (16 lõi) sử dụng 4 CPU. Do đó, thiết lập innodb_buffer_pool_instances=4. Thêm một yêu cầu: Vui lòng kiểm tra lại, máy chủ DB có 64GB hay 128GB không ???
RolandoMySQLDBA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.