กระบวนการ MySQL มีการใช้งาน CPU มากกว่า 100%


11

ฉันประสบปัญหากับเซิร์ฟเวอร์ LAMP ของฉัน เมื่อเร็ว ๆ นี้ทุกอย่างช้ามากแม้ว่าผู้เข้าชมจะเชื่อใจในเว็บไซต์ของฉันไม่ได้เปลี่ยนไปมากนัก เมื่อฉันเรียกใช้topคำสั่งมันบอกว่ากระบวนการ MySQL ได้รับ CPU 150-200% เป็นไปได้อย่างไรฉันคิดเสมอว่า 100% นั้นสูงสุด

ฉันใช้เซิร์ฟเวอร์รุ่น Ubuntu 9.04 พร้อม RAM 1,5 GB

my.cnf การตั้งค่า:

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

นี่คือผลลัพธ์ของMySQLTuner :

เอาต์พุต MySQLTuner

topสั่ง:

ผลผลิตสูงสุด

สาเหตุของปัญหานี้คืออะไร ฉันสามารถทำการเปลี่ยนแปลงmy.cnfเพื่อป้องกันไม่ให้เซิร์ฟเวอร์หยุดทำงานได้หรือไม่

คำตอบ:


15
  1. เพิ่ม Key Buffer (ปัจจุบันของคุณคือ 64MB แต่ดัชนีทั้งหมดคือ 116M ดังนั้นใส่อย่างน้อย 128MB) ควรช่วยเหลือทันที
  2. เรียกใช้mysqloptimizeและmysqlrepairบนตารางของคุณ
  3. เพิ่มแคชของตาราง / ลดจำนวนรวมของตารางเพื่อเพิ่มอัตราการเข้าชมแคชของตาราง บางทีคุณอาจมีตารางที่ไม่ได้ใช้หรือเก่าซึ่งสามารถลบได้

ตัวเลือกการแนะนำอื่น ๆ ที่แนะนำ:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • เข้าสู่ระบบคำสั่งที่ไม่ใช้ดัชนี

ตรวจสอบล็อกไฟล์หลังจากผ่านไประยะหนึ่ง


ขอบคุณสำหรับคำแนะนำฉันจะลองและแจ้งให้คุณทราบหากมีส่วนช่วย
Temnovit

ได้โปรดบอกฉันคุณคำนวณได้อย่างไรว่าดัชนีทั้งหมดมี 116M?
Temnovit

ได้ด้วยตัวเอง :)
Temnovit

5

คุณมีโปรเซสเซอร์ซึ่งมีมากกว่าหนึ่งคอร์หรือคุณมีโปรเซสเซอร์หลายตัว หากคุณมีสองคอร์และกระบวนการใช้ 100% ของคอร์ทั้งสองก็จะแสดงเป็น 200% ในด้านบน

เช่นนี้อาจทำงานได้ตามที่ตั้งใจ - ไม่มีอะไรผิดปกติกับการกำหนดค่าของคุณ หากคุณประสบกับการแฮงค์บ่อยครั้งจากสิ่งที่คุณโพสต์คุณอาจต้องการเพิ่มดัชนีที่เหมาะสมลงในตารางของคุณ (หรือปรับการค้นหาของคุณให้เหมาะสม)


5

เรียกใช้top -Hเพื่อดูเธรดที่กำลังทำงานทั้งหมดไม่ใช่แค่กระบวนการโดยรวม นอกจากนี้หากคุณกด1ปุ่มขณะที่อยู่ด้านบนมันจะแสดงการใช้ cpu สำหรับซีพียู / คอร์แต่ละตัว


ขอบคุณสิ่งนี้ช่วยฉันได้จริงๆ - ใช้ยอดมานานหลายปีและไม่รู้ว่ามันมีความสามารถนี้ ฉันพบว่ามีเธรด mysql "ชั่วนิรันดร์" ที่ใช้ CPU ผู้ใช้ 60% ตลอดเวลาในขณะที่เธรดคิวรี่มาและอยู่เหนือสิ่งนี้ ตอนนี้จะหาสิ่งที่หัวข้อนี้เป็นจริงทำ ...
scipilot

1

Mysql มีหลายกระบวนการ (เธรด) ทำงานอย่างอิสระตัวอย่างเช่นมีหน้าที่รับผิดชอบในการเขียนข้อมูลจากหน่วยความจำไปยังดิสก์ ด้วยหลายคอร์ในซีพียู (และ / หรือซีพียูหลายตัว) มีการทำงานมากกว่าหนึ่งเธรดดังนั้นจึงสามารถทำงานได้มากกว่า 100% ของคอร์เดียว - ในระดับที่เรียบง่ายบางที 75% ของคอร์แต่ละคอร์กำลังทำงานอยู่ ให้ 150%


1

ฉันสังเกตเห็นปัญหาไม่เกี่ยวข้องกับ CPU หากคุณใช้ Apache และ MySQL บนเซิร์ฟเวอร์เดียวกันคุณสามารถเข้าถึงเงื่อนไขที่ไม่ดี ( RAM ) เมื่อกิจกรรม apache ของคุณเพิ่มขึ้น

MySQLTunner บอกคุณว่าการใช้ 200 การเชื่อมต่อที่มีอยู่ (การตั้งค่าการเชื่อมต่อสูงสุดของคุณ) คุณจะเติมแรม สมมติว่าคุณมีกระบวนการอาปาเช่ที่ จำกัด ถึง 150 กระบวนการแน่นอนคุณจะไม่มีแรมเพียงพอเมื่อ MySQL และอาปาเชจะลองใช้การเชื่อมต่อ 150 ครั้ง (เนื่องจาก Apache และผู้กิน RAM ที่ดี)

ดังนั้นนี่เป็นเรื่องเกี่ยวกับ RAM และคุณอาจจะยังไม่โดน :-) คำสั่งด้านบนแสดงกระบวนการ apache เพียง 15 กระบวนการ (แต่คุณกำลังโหลดเฉลี่ย 3/6/16 ดังนั้นนั่นหมายถึงว่าพายุเมื่อ 15 นาทีที่แล้วและตอนนี้อยู่ใน ออก)

เกี่ยวกับปัญหา CPU เพื่อเติมเต็มการตอบสนองที่ดีของshakalandyนี่อาจเป็นเพราะแบบสอบถามเดียว มันอาจจะอยู่บนโต๊ะขนาดใหญ่หรือทำดัชนีใหม่จำนวนมากหรือใช้ไฟล์ชั่วคราวจำนวนมากดัชนีหายไป (ลบออก?) ฯลฯ วิธีเดียวที่จะตรวจสอบได้คือการเปิดใช้งานบันทึกคิวรีช้า (อาจจะเป็น ด้วย thresold สูงเช่น 8s) จากนั้นใช้เครื่องมือmysqlslaเพื่อวิเคราะห์บันทึกการสืบค้นที่ช้านี้และเรียกใช้คำอธิบายบางอย่างเกี่ยวกับการสืบค้นที่ระบุ


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