ทำไม `strace 'ไม่แสดงว่ากระบวนการนี้กำลังรออะไรอยู่


11

อันยิ่งใหญ่straceได้ทำให้ฉันผิดหวัง เป็นไปได้อย่างไร?


time fooแสดงให้เห็นว่าfooใช้เวลาหลายวินาทีในการเรียกใช้ ("ของจริง") แต่ใช้เวลา cpu เล็กน้อยทั้งใน userspace ("ผู้ใช้") และในเคอร์เนล ("sys") สำหรับผู้อยากรู้อยากเห็นfooมีการกำหนดไว้ด้านล่าง

ดังนั้นจึงใช้เวลาส่วนใหญ่รออย่างอื่นไม่ดำเนินการตามคำสั่งของ CPU โดยปกติแล้วฉันจะเห็นว่ามันกำลังรออยู่strace- นั่นคือสิ่งที่การโทรของระบบถูกปิดกั้นเป็นเวลานาน น่าเสียดายที่วิธีนี้ใช้ไม่ได้ผล

strace -ttt -T -C -w fooแสดงการเรียกระบบการประทับเวลาและสรุปเวลา (จริง) ที่ใช้ในการโทรของระบบ แต่กระบวนการนี้แสดงให้เห็นว่าการใช้เวลาเล็กน้อยโดยรวม (จริง) ในการโทรของระบบ


foojournalctl -b -u dev-hugepages.mountเป็นจริง ยกเว้นว่าฉันต้องเปลี่ยนอาร์กิวเมนต์สุดท้ายเป็นหน่วย systemd ที่แตกต่างกันในแต่ละครั้งเพื่อทำซ้ำสิ่งนี้ กล่าวอีกนัยหนึ่งความล่าช้าที่ฉันกำลังตรวจสอบเกิดขึ้นในครั้งแรกที่ฉันพยายามรับบันทึกสำหรับหน่วย systemd ใดหน่วยหนึ่ง แก้ไข : หลังจากตอบคำถามหลักผมยังตระหนักถึงเหตุผลที่ผมมีปัญหานี้ซ้ำล่าช้า

เวลาที่ใช้ในกระบวนการนี้เป็นปัญหาเฉพาะดูเหมือนว่ามันจะไม่เกิดขึ้นในทุกระบบ https://github.com/systemd/systemd/issues/7963


อืม ... เนื่องจากโปรแกรม "foo" ของคุณไม่ได้เป็นเพียงกระบวนการเดียวที่ง่ายต่อการประมวลผลเธรดเดียวคุณจะได้รับการบริการที่ดีขึ้นด้วยการบอก strace ให้ติดตามและแนบกับส้อม '-ff' คือเพื่อนของคุณ! :) จากนั้นคุณจะต้องใช้ "-o / dev / shm / strace-foo" เพื่อเชื่อมไฟล์ strafe ประมวลผลไฟล์เหล่านั้นทั้งหมดไว้ในที่เดียว เพียงข้อเสนอแนะ
Jesse Adelman

@JesseAdelman ฉันคิดว่าjournalctlใช้เพียงกระบวนการเดียวเท่านั้น ฉันมีความรู้สึกjournalctlใช้เธรดพิเศษหนึ่งชุดไม่ว่าด้วยเหตุผลใด - iirc มีการโทรแบบโคลนเดียว () ฉันคิดว่านี่หมายความว่าคุณมีความถูกต้องทางเทคนิค แต่ก็ไม่เกี่ยวข้องกับคำถาม timeดูกระบวนการโดยรวมและแสดงให้เห็นว่ากระบวนการโดยรวมค่อนข้างง่วงนอน (บล็อกบางอย่าง) straceแสดงการนอนหลับไม่เพียงพอ มันไม่สำคัญว่าเธรดที่สองกำลังหลับอยู่เธรดหลักจะต้องง่วงมากเพื่ออธิบายtimeผลลัพธ์
sourcejedi

คำตอบ:


18

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

หากคุณใช้/usr/bin/timeโปรแกรมแทนtimeshell builtin คุณอาจสังเกตเห็น:

0.04user 0.10system 0:02.29elapsed 6%CPU (0avgtext+0avgdata 40464maxresident)k
73632inputs+0outputs (376major+1081minor)pagefaults 0swaps

majorpagefaults เป็นสิ่งที่ต้องการระบบไฟล์ IO minorหน้าเว็บเริ่มต้นมีความสำคัญน้อยกว่ามาก (อาจเป็นเพียง "TLB miss")

ฉันสงสัยว่าinputsจะเป็นจำนวนหน้าทั้งหมดที่อ่าน ขณะนี้ฉันคิดว่าหน้าเว็บที่แมปไฟล์นั้นมีขนาดเท่ากันเสมอ ในกรณีส่วนใหญ่ 4096 ไบต์ แต่คุณสามารถตรวจสอบgetconf PAGESIZEได้

ดังนั้นสิ่งนี้จึงแสดงถึง ~ 290 เมกะไบต์อ่านอะไรมากกว่า 100 เมกะไบต์ต่อวินาทีความเร็วมาตรฐานสำหรับฮาร์ดดิสก์เช่นของฉัน ไขปริศนาแล้ว!


โปรดทราบว่าคุณกำลังสมมติว่าคุณมี CPU ฟรีทั้งหมดสำหรับกระบวนการนี้ มิฉะนั้นกระบวนการอาจถูกบล็อกเพียงแค่รอให้กระบวนการอื่นให้ผล CPU

straceแสดงเฉพาะเมื่อกระบวนการเข้าสู่ (และจากนั้นออก) เคอร์เนลเนื่องจากการเรียกระบบ หรือเมื่อมีการส่งสัญญาณยูนิกซ์ อย่างไรก็ตามมีการขัดจังหวะประเภทอื่นซึ่งstraceไม่แสดงเลย ดังนั้นสิ่งเหล่านี้รวมถึง

  • ความผิดพลาดของหน้า
  • ตัวจับเวลาขัดจังหวะ ใช้เพื่อสลับไปยังกระบวนการอื่นเมื่อกระบวนการปัจจุบันหมดเวลาในการจัดสรรซีพียู

1
คำตอบที่ดีขอแสดงความยินดี! เป็นเรื่องสำคัญที่จะต้องเข้าใจถึงข้อ จำกัด ของเครื่องมือที่ใช้ +1; ฉันยังสนุกกับหัวข้อเหล่านี้: unix.stackexchange.com/questions/418354/ …และunix.stackexchange.com/questions/419697/…
Rui F Ribeiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.