ค้นหา CPU kernel hog เป็นครั้งคราว


11

ฉันมีเคอร์เนล 2.6.35 PREEMPT ที่ทำงานบนโปรเซสเซอร์ ARMv7 ความเร็วปานกลาง เกี่ยวกับทุกๆ 100 - 125s สิ่งที่ทำให้เคอร์เนลล้มเหลวในการประมวลผลไดรเวอร์ที่เกี่ยวข้องกับเสียงอย่างรวดเร็วพอที่จะหลีกเลี่ยงการ underrun การค้างไว้โดยทั่วไปจะอยู่ในช่วง 15-30ms แต่อาจนานกว่านั้นมาก ไม่ชัดเจนว่าการถือครองอยู่ในเคอร์เนลทั้งหมดหรืออาจเกี่ยวข้องกับการกำหนดตารางเวลาของกระบวนการผู้ใช้ที่รันด้วยลำดับความสำคัญตามเวลาจริง (SCHED_RR, 2)

ฉันเดาว่ามีไดรเวอร์ (อย่างน้อยหนึ่ง) ที่ไม่เล่นได้ดีกับการจอง

เอาต์พุต strace บางตัวจากกระบวนการผู้ใช้แสดงให้เห็นถึงลักษณะบางอย่างของพฤติกรรมปกติและผิดปกติบางอย่างแม้ว่าฉันจะไม่แน่ใจว่าจะตีความรายงานเวลาต่าง ๆ ได้อย่างไร

กรณีปกติ:

     0.000518 แบบสำรวจ ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3415) = 1 
     0.010202 แบบสำรวจ ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL}, {fd = 6, เหตุการณ์ = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 
     0.000585 แบบสำรวจ ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL}, {fd = 6, เหตุการณ์ = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 
     0.000302 แบบสำรวจ ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3404) = 1 
     0.010706 แบบสำรวจ ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL}, {fd = 6, เหตุการณ์ = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3393) = 1 
     0.000480 แบบสำรวจ ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL}, {fd = 6, เหตุการณ์ = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3392) = 1 

ไม่มีการบล็อกเกิดขึ้นในการสำรวจความคิดเห็นสำหรับเอาต์พุตใน fd6 และเมื่อมีการโพลล์เฉพาะ fd10 สำหรับการป้อนข้อมูลจะมีการบล็อกประมาณ 10ms สิ่งนี้สะท้อนให้เห็นทั้งในรายงานระยะเวลาของการเรียกใช้ระบบและช่วงเวลาระหว่างการเรียกใช้ระบบ (สอดคล้องกัน)

กรณีที่ล้มเหลว (ตัวอย่างสุดขีด):

     0.000305 แบบสำรวจ ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3543) = 1 
     การสำรวจความคิดเห็น 0.010730 ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL}, {fd = 6, เหตุการณ์ = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3533) = 1 
     0.000475 แบบสำรวจ ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL}, {fd = 6, เหตุการณ์ = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3532) = 1 
     0.000329 แบบสำรวจ ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3532) = 1 
     0.953349 แบบสำรวจ ([{fd = 10, เหตุการณ์ = POLLIN | POLLERR | POLLNVAL}, {fd = 6, เหตุการณ์ = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT | POLLERR}], 2, 2578) = 1 

โปรดสังเกตในกรณีนี้ว่าแม้ว่าการโทรครั้งที่สองจะถูกบันทึกว่าใช้เวลา 10ms (ปกติ) แต่ก็เป็น 953ms ก่อนการโทรครั้งสุดท้าย

ฉันสามารถใช้เครื่องมือใดในการติดตามผู้กระทำผิด


2
คะแนนโบนัสสำหรับคำถามที่น่าสนใจ ฉันไม่แน่ใจว่าจะตอบอย่างไร แต่มีคำถามว่าจะติดตามกลับไปยังการใช้งาน CPU ได้อย่างไร (ต่างจาก spikes ใน iowait เป็นต้น)
Bratchley

1
อันดับแรกคือหากคุณใช้งาน JFFS2 หรือ YAFFS ในแฟลช NAND ขนาดใหญ่โดยเฉพาะหากคุณกำลังบันทึก ปิดการใช้งานสิ่งใดก็ตามที่เขียนไปยังแฟลชและดูว่ามีประโยชน์หรือไม่ ตารางกระบวนการของคุณมีลักษณะอย่างไร คุณสามารถใช้ ftrace เป็นทางเลือกสุดท้ายหากคุณมี toolchain เพื่อสร้างเคอร์เนล
Jonathan Ben-Avraham

sar -bu อาจทำ .. linux.die.net/man/1/sar
Grizly

มีการใช้แฟลชอยู่บ้าง การ์ด SD พร้อมระบบไฟล์ ext4 ที่ติดตั้งอยู่ และการเขียนลงไปนั้นเป็นสาเหตุที่เป็นไปได้ของปัญหาเหล่านี้ (แต่ทำไมใช่มั้ย) แต่อาจไม่ใช่เพียงปัญหาเดียว
awy

คำตอบ:


1

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

ตัวอย่างเช่น

perf record -R -a -g fp -e cycles -e syscalls:sys_enter_poll -e syscalls:sys_exit_poll
#Just ctrl+c if you are done, and view ith
perf script 

มันจะแสดงเวลาเข้า / ออก syscall ทั้งหมดและพารามิเตอร์ (เช่น strace) ให้ชื่อของไบนารีเรียก syscall และตัวอย่าง callstack ของ CPU แต่ละตัวที่ความถี่บางอย่าง (รวมถึงสัญลักษณ์เคอร์เนล) ดังนั้นคุณสามารถดูรหัสที่ถูกเรียกใช้ระหว่าง syscall ได้ ในระบบมัลติโปรเซสเซอร์คุณต้องใส่ใจกับ cpu id (เช่น [001])


ฉันจะดูการสร้างความสมบูรณ์แบบสำหรับแพลตฟอร์ม - ขอบคุณสำหรับเคล็ดลับ
awy

0

อาจatopทำให้เข้าใจถึงปัญหาของคุณ

มันสามารถแสดงกระบวนการที่ออกแล้วและมันสามารถแสดงCPU , หน่วยความจำ , ดิสก์และเครือข่ายการใช้ประโยชน์

คุณสามารถเรียกใช้มันแบบโต้ตอบปล่อยให้มันเขียนไปยังไฟล์ข้อความหรือเรียกใช้มันsarในช่วงเวลาที่กำหนดไว้ล่วงหน้าสร้างไฟล์ประวัติไบนารีที่คุณสามารถผ่านไปในภายหลัง

ฉันใช้มันเพื่อค้นหาหมูทุกชนิดที่หายาก :-)

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