InnoDB INSERT प्रदर्शन की क्षमताएं


11

नमस्ते, मैं Percona सर्वर के सबसे हाल के संस्करण को चला रहा हूं।

सर्वर संस्करण: 5.5.24-55 Percona सर्वर (GPL), रिलीज़ 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

इसमें एसएसडी और 64 जीबी की रैम है। 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 सेकंड लगते हैं। अगर मैं बाद में एक अपडेट करता हूं, जहां हर पंक्ति के प्रत्येक कॉलम को अपडेट किया जाता है (सिंबल_डाइट को छोड़कर) तो यह 11-12 सेकंड की तरह थोड़ा अधिक होता है।

क्या यह मूल रूप से लेखन प्रदर्शन है जिसकी मुझे इनोडब से उम्मीद करनी चाहिए? क्या इस प्रदर्शन में सुधार के लिए कोई सुझाव है? 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

BTW अगर इन्सोडब के बजाय मैं इंजन = मेमोरी के साथ तालिका बनाता हूं, तो इसे सम्मिलित करने के लिए लगभग 4 सेकंड लगते हैं, अपडेट करने के लिए 6 सेकंड।

कई टीआईए अगर कोई मेरी मदद कर सकता है तो पता लगा सकता है कि इस प्रकार की क्वेरी के लिए बेंचमार्क क्या है, या मुझे समय को बेहतर बनाने में मदद करता है।

डॉन

पुनश्च पूर्ण 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_ticket | 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_seolution | 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 सीपीस: 0 1 2 3
नोड 0 आकार: 32766 एमबी
नोड 0 निःशुल्क: 21480 एमबी
नोड 1 सीपी: 4 5 6 7
नोड 1 आकार: 32768 एमबी
नोड 1 मुफ्त: 25285 एमबी
नोड 2 सीपी: 12 13 14 15
नोड 2 आकार: 32768 एमबी
नोड 2 मुफ्त: 20376 एमबी
नोड 3 सीपी: 8 9 10 11
नोड 3 आकार: 32768 एमबी
नोड 3 नि: शुल्क: 24898 एमबी
नोड दूरी:
नोड 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_buffer_pool_size 12G के लिए
  • Innodb_buffer_pool_instances 2 तक बढ़ाएं ( numactl --hardwareभौतिक CPU की संख्या निर्धारित करने के लिए पहली बार चलाएं । सीपीयू की प्रत्येक संख्या जो रिपोर्ट करती है, उस नंबर का उपयोग करें। मैंने हाल ही में जेरेमी कोल के ब्लॉग में यह सीखा है )
  • लॉग फ़ाइल का आकार बढ़ाएँ ( innodb_log_file_size ) को 2047M
  • अलग-अलग InnoDB तालिकाओं के लिए अलग-अलग टेबलस्पेस फ़ाइलों का समर्थन करें (enaled 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 को 10000 तक बढ़ाएँ

यहाँ InnoDB भंडारण इंजन को ट्यूनिंग पर मेरी पिछली पोस्ट हैं


इस अविश्वसनीय उपयोगी उत्तर के लिए Thx !! मैं तुम्हे सलाम करता हूँ। लॉग आकार के बारे में, क्या मुझे इसे बहुत बड़ा बनाने के बारे में चिंता करना है? मेरी चिंता की बात यह है कि Tkachenko ने mysqlperformanceblog.com/2011/09/18/disaster-mysql-5-5-flushing के बारे में लिखा है । मुझे लगता है कि मैं पेरकोना पर हूं, इसलिए शायद यह चिंता का विषय नहीं है .. लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं एक स्टाल परिदृश्य में न चलूं। मैं आपके उत्तर के बाकी हिस्सों में खुदाई कर रहा हूं ...
डॉन ऊन

सादर innodb_buffer_pool_instances मेरे पास 16-सीपीयू बॉक्स है (मुझे लगा कि यह 10 था)। संबंध में मेरे व्यवस्थापक का कहना है "आपके पास 16 कुल CPU हैं, और RAM के चार ब्लॉक, 32G प्रत्येक। RAM के प्रत्येक ब्लॉक को चार CPU द्वारा स्थानीय मेमोरी के रूप में माना जाता है।"
डॉन ऊन

कृपया रन करें numactl --hardwareऔर प्रश्न में आउटपुट पोस्ट करें। मैं भौतिक सीपीयू का पता लगाने की कोशिश कर रहा हूं और मैं यह सुनिश्चित करना चाहता हूं कि जब कोर का मतलब है तो व्यवस्थापक सीपीयू नहीं कह रहा है।
रोलैंडमाइसीडीडीबीए

ठीक है मैंने प्रश्न में 'अंकताल' का आउटपुट पोस्ट किया।
डॉन वूल

मेरे लिए, आउटपुट 4 क्वाड का उपयोग करते हुए क्वाड-क्वाड कोर (16 कोर) जैसा दिखता है। इसलिए, सेट करें innodb_buffer_pool_instances=4। एक और अनुरोध: कृपया दोहरी जांच करें, क्या DB सर्वर में 64GB या 128GB है ???
RolandoMySQLDBA
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.