MySQL 5.1 InnoDB कॉन्फ़िगरेशन / 24 जीबी रैम - द्वि-एक्सॉन उच्च भार


10

मैं एक फेसबुक ऐप चला रहा हूं जिसमें वर्तमान में 300 - 600 समवर्ती उपयोगकर्ता हैं (और बढ़ते हैं)। बढ़ने के लिए हार्डवेयर तैयार करने के लिए मैंने अपने i7 / 12gb ram / 2x 80gb Intel x25 ssd (debian 5.0 / mysql 5.0 / 64bit) को bi-xeon / 24gb ram / 2x 120gb / 320 ssd (ubuntu 10.10 / mysql 5.1 /) में बदल दिया। 64 बिट)।

अब मुझे इस समस्या का सामना करना पड़ रहा है कि प्रदर्शन "छोटे बॉक्स" की तुलना में खराब है। दोनों सर्वरों पर मैंने सामग्री की सेवा के लिए nginx / php fcgi का उपयोग किया है।

मैं केवल innodb का उपयोग कर रहा हूं, 65% / 35% के बारे में पढ़ता / लिखता हूं। लगभग 800 - 1000 qps लेकिन सभी क्वेरीज़ सरल हैं और कभी भी 1 अतिरिक्त तालिका में शामिल नहीं होती हैं। सभी इंडेक्स सेट किए गए हैं और धीमी लॉग (> 2s) में कोई व्यक्तिगत क्वेरी लॉग नहीं है। फिलहाल मेरे पास लगभग 400mb डेटा (लगभग 1gb इंडेक्स के साथ) है, जो इसे हर महीने दोगुना करने की उम्मीद कर रहा है।

मैं हर किसी को प्यार करता हूँ जो मुझे संकेत दे सकता है कि इसे चलाने के लिए क्या बदलना है।

I7 बॉक्स पर पुराना कॉन्फ़िगरेशन इस तरह था (मिश्रित myisam / innodb), 800+ उपयोगकर्ताओं के लिए बहुत अच्छा प्रदर्शन किया।

पुराने my.cnf

   key_buffer              = 3000M
   max_allowed_packet      = 128M
   thread_stack            = 192K
   thread_cache_size       = 8
   max_connections        = 400
   table_cache            = 8000
   thread_concurrency     = 16
   query_cache_limit       = 8M
   query_cache_size        = 128M
   wait_timeout            = 10
   interactive_timeout     = 10
   connect_timeout         = 600
   low_priority_updates    = 1
   join_buffer_size        = 8M
   read_buffer_size        = 2M
   sort_buffer_size        = 3M
   myisam_sort_buffer_size = 32M
   read_rnd_buffer_size    = 4M
   innodb_buffer_pool_size = 3G
   innodb_log_buffer_size  = 8M

द्वि-एक्सॉन बॉक्स पर नया कॉन्फ़िगरेशन इस तरह है (शुद्ध innodb), जिससे 300+ उपयोगकर्ताओं के साथ उच्च लोड होता है। लगभग 30 mysql प्रक्रिया सूची के शीर्ष पर बैठी है।

डिस्क I / O:

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              36.28    0.00    1.60    0.17    0.00   61.95

my.cnf

    key_buffer              = 64M
    max_allowed_packet      = 1M
    thread_stack            = 192K
    thread_cache_size       = 128
    max_connections        = 500
    table_cache            = 512
    #thread_concurrency     = 10
    sort_buffer_size        = 256K
    read_buffer_size        = 256K
    read_rnd_buffer_size    = 256K
    tmp_table_size          = 32M
    max_heap_table_size     = 32M
    query_cache_limit       = 1M
    query_cache_size        = 128M
    query_cache_type        = 1

    innodb_file_per_table = 1
    innodb_data_file_path = ibdata1:1000M:autoextend
    innodb_buffer_pool_size = 16384M
    innodb_additional_mem_pool_size = 8M
    innodb_flush_log_at_trx_commit = 1
    innodb_support_xa = 0
    innodb_lock_wait_timeout = 50
    innodb_flush_method=O_DIRECT
    innodb_log_files_in_group = 2
    innodb_log_file_size = 128M
    innodb_log_buffer_size = 8M
    innodb_thread_concurrency = 12

हम्म, skip-name-resolveअक्षम है और क्या इसे सक्षम किया जा सकता है?
विर्कन

जवाबों:


7

मैंने StackExchnage में कुछ पोस्ट लिखी हैं

  1. InnoDB और MyISAM के लिए ट्यूनिंग MySQL
  2. कैसे नियंत्रण में InnoDB डिस्कस्पेस रखने के लिए
  3. MySQL के एक अन्य दृष्टिकोण डिस्कस्पेस प्रबंधन
  4. InnoDB अनुकूलन पर दृष्टिकोण
  5. InnoDB ठीक ट्यूनिंग

कृपया मार्गदर्शन के लिए इन्हें पढ़ें।

अब, अधिक दबाव वाले मुद्दों के लिए: आपने बताया कि आपके पास 400MB डेटा, 1GB इंडेक्स के साथ है। इस तरह से मुझे डर लगता है कि आपके इंडेक्स डेटा से 50% बड़े हैं। हालाँकि, चूंकि आपका सारा डेटा InnoDB है और आप वर्तमान क्वेरी प्रदर्शन से संतुष्ट हैं, इसलिए आपकी सेटिंग्स पर्याप्त से अधिक हैं, संभवतः 16384MB की innodb_buffer_pool_size। वह 16GB है। आप सब वहाँ सेट हैं। लेकिन रुकें !!! आपका innodb_log_file_size 128M है? 16GB बफर पूल को देखते हुए रास्ता बहुत छोटा है। आपको ib_logfile फ़ाइलों का आकार बदलना चाहिए (innodb_log_file_size को 2047M पर सेट करें)।

आपको प्रति-थ्रेड के आधार पर लोड का अनुभव हो सकता है। अपना कनेक्शन बफ़र सेट करने का प्रयास करें (join_buffer_size, Sort_buffer_size, read_buffer_size, read_rnd_buffer_size)

मेरे से: क्यों MySQL का कहना है कि मैं स्मृति से बाहर हूँ?

@DTest से: आप mysql max_connections चर की गणना कैसे करते हैं?

कोशिश करो !!!


यह सब कुछ इंडेक्स सेट करने के बारे में था ... अब मेरे पास कुछ कॉलम हैं जो अन्य संयोजनों में दोहरे अनुक्रमित हैं ... और मेरे पास अभी 35 जीबी डेटा है और 10'000qps है ... और यह रेशम के रूप में सुचारू रूप से काम करता है।
किलियन

0
  • क्या आपने MyISAM से InnoDB में कुछ तालिकाओं को परिवर्तित किया?
    यदि हां, तो http://mysql.rjweb.org/doc.php/myisam2innodb में सूक्ष्म प्रदर्शन सुधार / गिरावट की जांच करें
  • innodb_flush_log_at_trx_commit = 1
    - हर लेन-देन के बाद लॉग को लिखने का कारण बनता है । का उपयोग करने पर विचार करें = 2
  • max_connections- SHOW GLOBAL STATUS LIKE 'max_used_connections'
    - यह आपको बताएगा कि स्टार्टअप के बाद से आपको कितने की जरूरत है।
  • क्वेरी कैश:

    query_cache_size        = 128M
    query_cache_type        = 1

    ये दुख दे रहे होंगे। ऊपर, कहते हैं, 50Mक्यूसी रखरखाव पर बहुत अधिक समय खर्च करता है। यह ONबेकार हो सकता है, भी। क्या SHOW GLOBAL STATUS LIKE 'Qc%'प्रभावशीलता की जांच करने के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.