สิ่งที่อาจทำให้เกิดการแขวนเมื่อรวบรวมในหลายแกน


17

เมื่อวานฉันพยายามรวบรวมแพ็คเกจROOTจากแหล่งที่มา ตั้งแต่ผมได้รับการรวบรวมไว้ในเครื่องมอนสเตอร์ 6 make -j 6หลักฉันตัดสินใจที่จะไปข้างหน้าและสร้างโดยใช้หลายแกนใช้ การคอมไพล์นั้นราบรื่นและเร็วมากในตอนแรก แต่ในบางจุดmakeใช้ CPU 100% เพียงแกนเดียว

ฉันทำ Google และพบโพสต์นี้บนกระดานข้อความ ROOT เนื่องจากฉันสร้างคอมพิวเตอร์เครื่องนี้ขึ้นมาเองฉันจึงกังวลว่าฉันไม่ได้ใช้ฮีทซิงค์อย่างถูกต้องและ CPU นั้นร้อนเกินไปหรือมีอะไรบางอย่าง น่าเสียดายที่ฉันไม่มีตู้เย็นในที่ทำงานที่ฉันสามารถติดมันได้ค่ะ ;-)

ฉันติดตั้งlm-sensorsแพคเกจและวิ่งmake -j 6อีกครั้งคราวนี้ตรวจสอบอุณหภูมิของ CPU แม้ว่าจะสูง (ใกล้ถึง 60 C) แต่ก็ไม่เคยผ่านอุณหภูมิสูงหรือวิกฤต

ฉันพยายามวิ่งmake -j 4แต่makeบางครั้งก็หยุดทำงานในระหว่างการรวบรวมคราวนี้ในจุดที่ต่างออกไป

ในที่สุดฉันก็รวบรวมทำงานmakeและก็ทำงานได้ดี คำถามของฉันคือทำไมมันแขวนอยู่ เนื่องจากความจริงที่ว่ามันหยุดที่จุดที่แตกต่างกันสองจุดฉันจะเดาว่ามันเป็นเพราะสภาพการแข่งขันบางอย่าง แต่ฉันคิดว่าmakeควรฉลาดพอที่จะรับทุกอย่างในลำดับที่ถูกต้องเนื่องจากมันมี-jตัวเลือก


4
เสียงเหมือนสภาพการแข่งขัน สิ่งหนึ่งที่คุณสามารถทำได้คือติดกับกระบวนการสร้างการทำงาน (สิ่งที่หมุนอยู่) โดยใช้เช่นstrace -p <pid>และดูว่าคุณสามารถค้นหาสิ่งที่มันกำลังมองหา / strace จะแสดงเฉพาะ syscalls ให้คุณ (ไม่ใช่การเรียกใช้ฟังก์ชั่น) แต่ก็ยังสามารถให้ข้อมูลที่มีค่าแก่คุณได้ถ้ามันหมุนขณะที่ดูหรือหาไฟล์ใดไฟล์หนึ่ง
jlp

หัวข้อที่คุณพบโอกาสในการขายผ่านทาง Google -j >1สรุปว่าไม่มีใครสามารถที่จะรวบรวมมันด้วย
นิลส์

ไม่เกี่ยวข้องกับการรวบรวมแบบขนาน แต่ฉันมี makefile แบบแขวนซึ่งใช้เวลานานในการดีบัก ปรากฎว่ามันเป็นเพียงแค่ในการเริ่มต้นของตัวแปรที่$(shell ...)ถูกเรียกใช้คำสั่งในท้ายที่สุดซึ่งเป็นที่รอสำหรับการป้อนข้อมูลจาก stdinนี่เป็นสาเหตุเมื่อตัวแปรว่างเปล่าและไม่มีการส่งผ่านอาร์กิวเมนต์ไฟล์ไปยังคำสั่ง
jozxyqk

คำตอบ:


13

ฉันไม่ได้รับคำตอบสำหรับปัญหาที่แม่นยำนี้ แต่ฉันสามารถพยายามบอกใบ้ให้คุณเห็นถึงสิ่งที่อาจเกิดขึ้น: การพึ่งพาที่ไม่ได้รับใน Makefiles

ตัวอย่าง:

target: a.bytecode b.bytecode
    link a.bytecode b.bytecode -o target

a.bytecode: a.source
    compile a.source -o a.bytecode

b.bytecode: b.source
    compile b.source a.bytecode -o a.bytecode

ถ้าคุณเรียกmake targetทุกอย่างจะคอมไพล์อย่างถูกต้อง การคอมไพล์ของa.sourceถูกดำเนินการ (โดยพลการ แต่กำหนดไว้ล่วงหน้า) ก่อน จากนั้นb.sourceจะทำการรวบรวม

แต่ถ้าคุณmake -j2 targetทั้งสองcompileคำสั่งจะทำงานแบบขนาน และคุณจะสังเกตเห็นว่าการขึ้นต่อกันของ Makefile นั้นเสีย การรวบรวมที่สองถือว่าa.bytecodeรวบรวมแล้ว แต่มันไม่ปรากฏในการอ้างอิง ดังนั้นข้อผิดพลาดน่าจะเกิดขึ้น บรรทัดการพึ่งพาที่ถูกต้องสำหรับb.bytecodeควรเป็น:

b.bytecode: b.source a.bytecode

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


น่าสนใจ คุณรู้หรือไม่ว่ามีเครื่องมือใด ๆ ที่สามารถเรียกใช้ผ่าน makefile และตรวจสอบการอ้างอิงเหล่านี้ได้หรือไม่?
user545424

ฉันไม่รู้อะไรเลย ในกรณีใด ๆ เครื่องมือดังกล่าวสามารถค้นหาข้อผิดพลาดที่ชัดเจน ถ้าไม่เข้าใจไวยากรณ์สำหรับแต่ละคำสั่งที่ปรากฏใน Makefile และรู้ว่าการพึ่งพา (โดยนัย) คืออะไร
Stéphane Gimenez

2

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


1

ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่ก็ยังปรากฏขึ้นที่ด้านบนของผลการค้นหาดังนั้นนี่คือทางออกของฉัน:

GNU make มีกลไกงานเซิร์ฟเวอร์เพื่อให้แน่ใจว่ามีการทำและลูก ๆ ที่เรียกซ้ำไม่ใช้เกินจำนวนแกนที่ระบุ: http://make.mad-scientist.net/papers/jobserver-implementation/

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

https://bugzilla.redhat.com/show_bug.cgi?id=654822

ฉันพบข้อผิดพลาดนี้เมื่อสร้าง binutils ด้วย GNU make บนกล่อง Solaris ของฉันโดยที่ "sed" ไม่ใช่ GNU sed การเล่นซอกับ PATH เพื่อให้ sed == gsed ให้ความสำคัญกับระบบ sed แก้ไขปัญหา แต่ฉันไม่รู้ว่าทำไม sed ใช้โทเค็นจากท่อถึงแม้ว่า


0

ระบบของคุณอาจไม่เป็นไร แต่มันอาจเป็นสภาพการแข่งขันที่เกิดขึ้นmakeเมื่อรันบิวด์แบบขนาน

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


0

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

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