โหลดเซิร์ฟเวอร์สูง - [jbd2 / md1-8] ใช้ 99.99% IO


12

ฉันได้รับการขัดขวางในสัปดาห์ที่ผ่านมา ซึ่งมักจะเกิดขึ้นวันละครั้งหรือสองครั้ง ฉันจัดการเพื่อระบุจาก iotop ที่ [jbd2 / md1-8] ใช้ 99.99% IO ในช่วงเวลาที่โหลดสูงไม่มีการรับส่งข้อมูลสูงไปยังเซิร์ฟเวอร์

รายละเอียดเซิร์ฟเวอร์คือ:

  • AMD Opteron 8 คอร์
  • RAM 16 GB
  • การจู่โจมซอฟต์แวร์ HDD 2x2.000 GB 7.200 RPM 1
  • Cloudlinux + Cpanel
  • ปรับ Mysql อย่างเหมาะสม

นอกเหนือจากหนามแล้วโหลดมักจะอยู่ที่ประมาณ 0.80

ฉันได้ค้นหาไปรอบ ๆ แต่ไม่พบสิ่งที่ [jbd2 / md1-8] ทำอะไรกันแน่ มีใครมีปัญหานี้หรือใครรู้วิธีแก้ปัญหาที่เป็นไปได้?

ขอขอบคุณ.

UPDATE:

TIME        TID     PRIO     USER    DISK READ    DISK WRITE    SWAPIN  IO       COMMAND
16:05:36     399     be/3    root    0.00 B/s      38.76 K/s    0.00 %  99.99 %  [jbd2/md1-8]

1
en.wikipedia.org/wiki/Journaling_block_device & linux.die.net/man/4/mdชี้ให้เห็นว่านี่เป็นซอฟต์แวร์ RAID ที่เกี่ยวข้อง
mbrownnyc

ขอบคุณสำหรับการตอบกลับของคุณ. หลังจากทำการขุดฉันพบว่ามันเกี่ยวข้องกับซอฟต์แวร์ RAID คุณรู้วิธีแก้ปัญหาหรือไม่? สิ่งประหลาดที่เกิดขึ้นเมื่อสัปดาห์ที่แล้วหลังจากเกือบ 3 เดือนโดยไม่มีปัญหา
อเล็กซ์

คุณทราบได้อย่างไรว่า IO เป็น 99.99% คุณใช้iostat? คุณสามารถเรียกใช้เล็กน้อย (พูดiostat 5) สำหรับบิตและแบ่งปันผลลัพธ์หรือไม่
slm

ฉันเปิดใช้งานการบันทึกสำหรับ iotop และดูบันทึกสำหรับช่วงเวลาที่โหลดเกิดขึ้น ตอนนี้โหลดต่ำดังนั้นจึงไม่มีจุดเรียกใช้ตอนนี้ แต่ฉันจะทำในครั้งต่อไปที่มันเกิดขึ้น ขอบคุณสำหรับการตอบกลับของคุณ.
อเล็กซ์

1
ฉันเพิ่งพบปัญหานี้ ทางออกสุดท้ายของคุณคืออะไร
Satanicpuppy

คำตอบ:


18

นี่ไม่ใช่คำตอบจริง ๆ เนื่องจากมีบริบทไม่เพียงพอที่จะให้สาเหตุที่แน่นอน แต่เป็นคำอธิบายว่าฉันจัดการติดตามเรื่องนี้ได้อย่างไรเมื่อเกิดขึ้นกับฉัน

ผมสังเกตเห็นฉันเก็บไว้แสดงขึ้นที่ด้านบนของjbd2/md0-8 iotopฉันดู/sys/kernel/debug/tracing/events/jbd2เพื่อดูว่ามีตัวเลือกอะไรบ้างในการพิจารณาว่าjbd2กำลังทำอะไรอยู่

NOTE-1: เมื่อต้องการดูผลลัพธ์สำหรับเหตุการณ์การติดตามการดีบักcat /sys/kernel/debug/tracing/trace_pipe- ฉันมีการเรียกใช้ในเทอร์มินัลในขณะที่เปิด / ปิดการใช้งานการติดตาม

หมายเหตุ 2: echo 1 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enableเมื่อต้องการเปิดใช้เหตุการณ์ที่เกิดขึ้นสำหรับการติดตามการใช้งานเช่น echo 0 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enableเพื่อปิดการใช้งาน

ฉันเริ่มต้นด้วยการเปิดใช้งาน/sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable- แต่ไม่มีอะไรที่น่าสนใจเป็นพิเศษในผลลัพธ์สำหรับมัน ฉันลองอีกสองสามเหตุการณ์เพื่อติดตามและเมื่อฉันเปิดใช้งาน/sys/kernel/debug/tracing/events/jbd2/jbd2_commit_flushing/enableฉันเห็นว่ามันเกิดขึ้นทุกวินาที:

# cat /sys/kernel/debug/tracing/trace_pipe
...
jbd2/md0-8-2520  [004] .... 658660.216492: jbd2_commit_flushing: dev 9,0 transaction 32856413 sync 0
jbd2/md0-8-2520  [001] .... 658661.334900: jbd2_commit_flushing: dev 9,0 transaction 32856414 sync 0
jbd2/md0-8-2520  [001] .... 658661.394113: jbd2_commit_flushing: dev 9,0 transaction 32856415 sync 0

ดูเหมือนว่ามันเกี่ยวข้องกับsync(2)/ fsync(2)/ msync(2)ดังนั้นฉันจึงหาวิธีเชื่อมโยงกระบวนการนี้และพบสิ่งนี้:

# find /sys/kernel/debug/tracing/events/ | grep sync.*enable
...
/sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable
...

เมื่อฉันเปิดใช้งานฉันเห็นผลลัพธ์ต่อไปนี้:

# cat /sys/kernel/debug/tracing/trace_pipe
...
      nzbget-17367 [002] .... 658693.222288: ext4_sync_file_enter: dev 9,0 ino 301924373 parent 301924357 datasync 1 
  jbd2/md0-8-2520  [001] .... 658693.284080: jbd2_commit_flushing: dev 9,0 transaction 32856465 sync 0
      nzbget-17367 [000] .... 658693.334267: ext4_sync_file_enter: dev 9,0 ino 301924357 parent 301924353 datasync 1 
  jbd2/md0-8-2520  [002] .... 658693.334275: jbd2_commit_flushing: dev 9,0 transaction 32856466 sync 0
      nzbget-17367 [001] .... 658694.369514: ext4_sync_file_enter: dev 9,0 ino 301924367 parent 301924357 datasync 1 
  jbd2/md0-8-2520  [002] .... 658694.414861: jbd2_commit_flushing: dev 9,0 transaction 32856467 sync 0
      nzbget-17367 [001] .... 658694.470872: ext4_sync_file_enter: dev 9,0 ino 301924357 parent 301924353 datasync 1 
  jbd2/md0-8-2520  [002] .... 658694.470880: jbd2_commit_flushing: dev 9,0 transaction 32856468 sync 0

สิ่งนี้ทำให้ฉันชื่อกระบวนการ / id - และหลังจากทำการดีบักเพิ่มเติมของกระบวนการนี้ ( nzbget) ฉันค้นพบว่ามันกำลังทำfsync(2)ทุกวินาที หลังจากที่ฉันเปลี่ยนการตั้งค่า ( FlushQueue=noไม่มีเอกสารฉันคิดว่าพบในแหล่งที่มา) เพื่อหยุดมันจากการทำเช่นนี้ต่อวินาทีfsync(2)ปัญหาหายไป

รุ่นเคอร์เนลของฉันคือ4.4.6-gentooฉันคิดว่ามีตัวเลือกบางอย่างที่ฉันเปิดใช้งาน (ด้วยตนเองหรือด้วยmake oldconfig) ณ จุดหนึ่งในเคอร์เนล config เพื่อรับ/sys/kernel/debugกับเหตุการณ์เหล่านี้ - ดังนั้นถ้าคุณไม่มีมันก็แค่ดูรอบ ๆ อินเทอร์เน็ตสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปิดใช้งาน มัน.


นักสืบที่ดี สิ่งนี้มีประโยชน์มาก
jdhildeb

ขอบคุณมากสำหรับรายละเอียดทุกขั้นตอน!
astrojuanlu

1

นี่น่าจะเป็นสิ่งที่เกี่ยวข้องกับการอัพเดทวารสาร ซอฟต์แวร์ RAID ประกอบด้วยดิสก์จำนวนเท่าใด คุณช่วยแสดงให้ฉันเห็นคำสั่งที่ใช้ในการสร้างมันได้ไหม

คุณสามารถวาง bin ของเอาต์พุต dumpe2fs ได้หรือไม่ ก่อนอื่นให้ระบุอุปกรณ์ทางกายภาพที่คุณเห็นการโหลด ใช้ df เพื่อทราบสิ่งนี้ จากนั้น

dumpe2fs /dev/sdaX > /tmp/dump

สำหรับกรณีของคุณอาจเป็น / dev / md0

นอกจากนี้เรียกใช้สิ่งนี้

iostat -xdk 1 25

ในช่วงเวลาของปัญหา IO สูง

ฉันไม่รู้จัก cloudlinux แต่เป็นเครื่องมือ blktrace ที่มีอยู่ในนั้น


สวัสดี Soham ขอบคุณสำหรับการตอบกลับของคุณ มี 2 ​​ดิสก์ในอาร์เรย์ สำหรับ dumpe2fs คุณสามารถให้คำสั่งเต็มรูปแบบที่คุณต้องการให้ฉันทำงานได้ไหม? ขอบคุณสำหรับการช่วยเหลือ.
อเล็กซ์

อเล็กซ์แก้ไขคำตอบ
Soham Chakraborty

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