การกำหนดค่า MySQL 5.1 InnoDB / 24GB RAM - โหลดสูง bi-xeon


10

ฉันกำลังใช้งานแอพ facebook ซึ่งปัจจุบันมีผู้ใช้งานพร้อมกัน 300 - 600 คน (และกำลังเติบโต) เพื่อให้ฮาร์ดแวร์พร้อมสำหรับการเติบโตฉันได้เปลี่ยน i7 / 12gb ram / 2x 80gb intel x25 ssd (debian 5.0 / mysql 5.0 / 64 บิต) เป็น bi-xeon / 24gb ram / 2x 120gb intel 320 ssd (Ubuntu 10.10 / mysql 5.1 / 64bit)

ตอนนี้ฉันกำลังเผชิญกับปัญหาที่ประสิทธิภาพแย่กว่า "กล่องขนาดเล็ก" ในเซิร์ฟเวอร์ทั้งสองฉันใช้ nginx / php fcgi เพื่อแสดงเนื้อหา

ฉันใช้ Innodb เท่านั้นโดยมีการอ่าน / เขียนประมาณ 65% / 35% ประมาณ 800 - 1,000 qps แต่การค้นหาทั้งหมดนั้นง่ายและไม่เคยเข้าร่วมมากกว่า 1 ตารางเพิ่มเติม ดัชนีทั้งหมดถูกตั้งค่าและไม่มีการสืบค้นแต่ละรายการในบันทึกช้า (> 2 วินาที) ในขณะนี้ฉันมีข้อมูลประมาณ 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

การกำหนดค่าใหม่บนกล่อง bi-xeon เป็นเช่นนี้ (บริสุทธิ์ 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ปิดใช้งานและสามารถเปิดใช้งานได้หรือไม่
Wrikken

คำตอบ:


7

ฉันได้เขียนบางโพสต์ใน StackExchnage

  1. ปรับแต่ง MySQL สำหรับ InnoDB และ MyISAM
  2. วิธีทำให้ InnoDB Diskspace อยู่ภายใต้การควบคุม
  3. อีกมุมมองหนึ่งของMySQL Diskspace Managament
  4. มุมมองเกี่ยวกับการเพิ่มประสิทธิภาพ InnoDB
  5. InnoDB Fine Tuning

โปรดอ่านคำแนะนำที่คุณต้องการ

ตอนนี้สำหรับปัญหาเร่งด่วนเพิ่มเติม: คุณพูดถึงว่าคุณมีข้อมูล 400MB, 1GB พร้อมดัชนี นั่นทำให้ฉันกลัวว่าดัชนีของคุณจะใหญ่กว่าข้อมูล 50% อย่างไรก็ตามเนื่องจากข้อมูลทั้งหมดของคุณคือ InnoDB และคุณพึงพอใจกับประสิทธิภาพการค้นหาปัจจุบันการตั้งค่าของคุณจึงเพียงพอมากกว่าโดยเฉพาะอย่างยิ่งค่า 16384MB ของ innodb_buffer_pool_size นั่นคือ 16GB คุณพร้อมแล้ว แต่เดี๋ยวก่อน !!! innodb_log_file_size ของคุณคือ 128 ล้าน? ขนาดเล็กเกินไปที่กำหนดบัฟเฟอร์พูล 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 GB ในขณะนี้และ 10'000qps ... และทำงานได้ราบรื่นเหมือนไหม
Kilian

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

    สิ่งเหล่านี้อาจเป็นอันตราย ข้างต้นพูดว่า50MQC ใช้เวลาในการบำรุงรักษามากเกินไป มีมันONอาจจะสิ้นเปลืองอีกด้วย ทำการSHOW GLOBAL STATUS LIKE 'Qc%'ตรวจสอบประสิทธิภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.