ประสิทธิภาพของ InnoDB INSERT


11

สวัสดีฉันกำลังเรียกใช้ Percona Server เวอร์ชันล่าสุด

รุ่นเซิร์ฟเวอร์: 5.5.24-55 Percona Server (GPL), Release 26.0

ฉันมีซีพียู 10 กล่องของคุณสมบัติเหล่านี้

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 of 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 แถวเป็นกรณีที่รุนแรงมากโดยทั่วไปในระหว่างวันซื้อขายฉันต้องอัปเดตประมาณ 1,000 แถวทุก 5 วินาที (ดังนั้นนั่นเป็นข้อ จำกัด ที่สมจริงยิ่งกว่าที่ฉันกำลังเผชิญ)

การตั้งค่าอื่น ๆ ที่เกี่ยวข้อง mysql.cnf ฉันมีการเปลี่ยนแปลง:

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

BTW ถ้าแทนที่จะ Innodb ฉันสร้างตารางด้วย ENGINE = MEMORY มันใช้เวลาประมาณ 4 วินาทีในการแทรก, 6 วินาทีเพื่อทำการปรับปรุง

TIA มากมายถ้ามีคนสามารถช่วยฉันค้นหาว่าเกณฑ์มาตรฐานสำหรับการสืบค้นประเภทนี้คืออะไรหรือช่วยฉันปรับปรุงเวลา

สวม

การตั้งค่า Innodb เต็ม PS

mysql> แสดงตัวแปรทั่วโลกเช่น 'innodb%';
+ + ------------------------------------------- ----- ------------------- +
| Variable_name | ค่า |
+ + ------------------------------------------- ----- ------------------- +
| innodb_adaptive_flushing | ON |
| innodb_adaptive_flushing_method | ค่าประมาณ |
| 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 | ปิด |
| innodb_buffer_pool_instances | 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 | ทั้งหมด |
| innodb_checkpoint_age_target | 0 |
| innodb_checksums | ON |
| 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 | ON |
| innodb_doublewrite_file | |
| innodb_fake_changes | ปิด |
| innodb_fast_checksum | ปิด |
| innodb_fast_shutdown | 1 |
| innodb_file_format | ละมั่ง
| innodb_file_format_check | ON |
| 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 | ON |
| innodb_stats_sample_pages | 8 |
| innodb_stats_update_need_lock | 1 |
| innodb_strict_mode | ปิด |
| innodb_support_xa | ON |
| innodb_sync_spin_loops | 30 |
| innodb_table_locks | ON |
| innodb_thread_concurrency | 0 |
| innodb_thread_concurrency_timer_based | ปิด |
| 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 | ปิด |
| innodb_version | 1.1.8-rel26.0 |
| innodb_write_io_threads | 4 |
+ + ------------------------------------------- ----- ------------------- +
90 แถวในชุด (0.00 วินาที)

ฉันวิ่ง numactl - ฮาร์ดแวร์และนี่คือผลลัพธ์ที่ฉันได้รับ ความคิดเห็นจากผู้ดูแลระบบของฉันมีการระบุไว้ด้านล่าง

root @ prog: / data / mysql # numactl --hardware
พร้อมใช้งาน: 4 โหนด (0-3)
โหนด 0 cpus: 0 1 2 3
โหนด 0 ขนาด: 32766 MB
โหนด 0 ฟรี: 21480 MB
โหนด 1 ซีพียู: 4 5 6 7
ขนาดโหนด 1: 32768 MB
โหนด 1 ฟรี: 25285 MB
โหนด 2 ซีพียู: 12 13 14 15
ขนาดโหนด 2: 32768 MB
โหนด 2 ฟรี: 20376 MB
โหนด 3 cpus: 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เพื่อกำหนดจำนวนฟิสิคัล CPUs สิ่งที่ซีพียูจำนวนรายงานรายงานใช้หมายเลขนั้นฉันเรียนรู้สิ่งนี้เมื่อเร็ว ๆ นี้ในบล็อกของเจเรมีโคล )
  • เพิ่มขนาดไฟล์บันทึก ( innodb_log_file_size ) เป็น 2047M
  • สนับสนุนไฟล์ tablespace แยกต่างหากสำหรับแต่ละตาราง InnoDB (enoded innodb_file_per_table )
  • รองรับทั้งประสิทธิภาพสูงหรือความทนทานสูง (มาตรฐาน ACID)
    • ประสิทธิภาพสูง: innodb_flush_log_at_trx_commitตั้งค่าเป็น 0 หรือ 2
    • ความทนทานสูง: innodb_flush_log_at_trx_commitตั้งค่าเป็น 1 (ค่าเริ่มต้น)
    • เพิ่มขนาดขึ้นInnodb_log_buffer_sizeร่วมกับจำนวนการทำธุรกรรมต่อวินาที (อาจ 32M)
    • การตั้งค่าปัจจุบันของคุณสำหรับ innodb_flush_log_at_trx_commit นั้นดี
    • การตั้งค่าปัจจุบันของคุณสำหรับ innodb_flush_method ถือว่าดี
  • เพิ่มinnodb_read_io_threadsเป็น 64
  • เพิ่มinnodb_write_io_threadsเป็น 64
  • เพิ่มinnodb_io_capactityเป็น 10,000

นี่คือข้อความที่ผ่านมาของฉันในการปรับแต่งเครื่องมือจัดเก็บข้อมูล InnoDB


ขอบคุณสำหรับคำตอบที่มีประโยชน์อย่างเหลือเชื่อนี้ !! ฉันทักทายคุณ เกี่ยวกับขนาดบันทึกฉันต้องกังวลกับการทำให้มันใหญ่เกินไปหรือไม่ กังวลของฉันเป็นสิ่งที่ Tkachenko เขียนเกี่ยวกับmysqlperformanceblog.com/2011/09/18/disaster-mysql-5-5-flushing ฉันรู้ว่าฉันอยู่ที่ Percona ดังนั้นอาจไม่ใช่เรื่องน่ากังวล แต่ฉันต้องการแน่ใจว่าฉันไม่ได้เจอสถานการณ์แผงลอย ฉันกำลังขุดลงไปในคำตอบที่เหลือของคุณ ...
Don Wool

ขอแสดงความนับถือ innodb_buffer_pool_instances ฉันมีกล่อง 16-cpu (ฉันคิดว่ามันคือ 10) ขอแสดงความนับถือผู้ดูแลระบบของฉันกล่าวว่า "คุณมี CPU ทั้งหมด 16 ตัวและ RAM สี่บล็อกแต่ละรุ่น 32G แต่ละ RAM บล็อกนั้นจะถือว่าเป็นหน่วยความจำในตัวเครื่องโดยใช้ CPU สี่ตัว"
Don Wool

โปรดเรียกใช้numactl --hardwareและโพสต์ผลลัพธ์ในคำถาม ฉันกำลังพยายามหาซีพียูทางกายภาพและฉันต้องการให้แน่ใจว่าผู้ดูแลระบบไม่ได้พูดถึงซีพียูเมื่อเขาหมายถึงแกนกลาง
RolandoMySQLDBA

ตกลงฉันโพสต์ผลลัพธ์ของ 'numactl' ในคำถาม
Don Wool

สำหรับฉันผลลัพธ์ดูเหมือนว่า quad-quad core (16 คอร์) โดยใช้ 4 CPU innodb_buffer_pool_instances=4ดังนั้นการตั้งค่า อีกหนึ่งคำขอ: โปรดตรวจสอบอีกครั้งเซิร์ฟเวอร์ DB มี 64GB หรือ 128GB หรือไม่ ???
RolandoMySQLDBA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.