ฉันจะป้องกันตัวเองจากการระบุเธรดมากเกินไปโดยไม่ตั้งใจเมื่อรวบรวมได้อย่างไร


2

เมื่อฉันรวบรวมสิ่งที่ฉันมักจะต้องการที่จะทำอย่างรวดเร็วดังนั้นในเวิร์กสเตชันของฉันฉันออก

make -j16

และ (gnu) make เริ่มการคอมไพล์ด้วย 16 คอร์ อย่างไรก็ตามเมื่อฉันกลับไปที่แล็ปท็อปของฉันฉันไม่มี 16 คอร์ที่นั่น ดังนั้นเมื่อฉันมีคำสั่งเดียวกันกับที่เครื่องของฉันค้างไว้จนตาย ฉันไม่สามารถเปลี่ยนเป็นเทอร์มินัลทางเลือกผ่าน CTRL + ALT + F1 เป็นต้นและการเข้าสู่ระบบระยะไกลจะไม่สำเร็จ CTRL + C, CTRL + 4 จะไม่มีการพิจารณาใด ๆ (BTW: การฆ่าอัตโนมัติจะไม่สำเร็จเช่นหน่วยความจำอัตโนมัติ) ฉันต้องปิดเครื่องแล้ว (ฉันใช้ Ubuntu 11.10 กับเคอร์เนล 3.0.x)

ทางออกหนึ่งคือการล่วงหน้าจำนวนแกนที่มีอยู่ในเครื่องปัจจุบันที่มีเป้าหมายทำให้ขนาดเล็กที่เป้าหมาย "ขนาน" อื่น ๆ ขึ้นอยู่และไม่ได้ใช้ "make -j $ NUMCORES" โดยตรง (ฉันได้ทำไปแล้วและรับรู้ด้วยโปรแกรม c ++ ขนาดเล็กโดยใช้บูสต์เธรด) แต่นี่จะไม่ปกป้องฉันจากการระบุ "make -j16" โดยไม่ตั้งใจอีกครั้ง

นอกจากนี้แกน "มากเกินไป" ต้องไม่เป็นจำนวนแกนเดียวกัน (รวมถึงแกนเกลียว) ที่มีอยู่เนื่องจาก +1 หรือ +2 เธรดจะไม่ฆ่าเครื่อง

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


1
สำหรับการแก้ปัญหาแรกexport MAKEFLAGS="-j$(nproc)"สามารถใช้; ไม่จำเป็นต้องใช้ makefiles พิเศษ สำหรับครั้งที่สองalias make="nice ionice make"อาจ?
grawity

ทำไมคุณไม่โพสต์สิ่งนี้เป็นคำตอบ? ขอบคุณ!
คณิตศาสตร์

1
เนื่องจากไม่ได้ป้องกันไม่ให้คุณทำงานmake -j16จึงให้โอกาสในการฟื้นตัวเพียงเล็กน้อยเท่านั้น
grawity

ใช่คุณพูดถูก;) อย่างไรก็ตามมันดีกว่าเป้าหมายการทำแบบพิเศษที่ฉันจ้างมาจนถึงตอนนี้!
คณิตศาสตร์

คำตอบ:


5

คุณไม่จำเป็นต้องเขียน Makefiles พิเศษใด ๆ เพื่อกำหนดจำนวนแกน ค่าเริ่มต้นสามารถระบุได้ในสภาพแวดล้อมและcoreutils Linux มาพร้อมกับเครื่องมือที่เรียกว่าnproc:

export MAKEFLAGS="-j$(nproc)"

หากnprocไม่มีอยู่ในระบบของคุณทางเลือก (สำหรับ Linux เท่านั้น) คือgetconf:

export MAKEFLAGS="-j$(getconf _NPROCESSORS_ONLN)"

การป้องกันบางส่วนจากการค้างที่สมบูรณ์สามารถทำได้โดยการรันmake(พร้อมกับกระบวนการบิลด์ทั้งหมด) ที่ CPU ต่ำและลำดับความสำคัญของ IO:

alias make="nice ionice make"

อย่างไรก็ตามโปรดทราบว่าสิ่งนี้จะทำให้การรวบรวมช้าลงหากกระบวนการอื่นกำลังใช้ดิสก์ IO หรือ CPU อย่างมากในเวลาเดียวกัน


คุณสามารถเขียนสคริปต์ wrapper (หรือฟังก์ชั่นเชลล์) ที่ตรวจสอบข้อโต้แย้งทั้งหมดที่ให้ไว้:

make() {
    local arg
    for arg; do
        [[ $arg == -j* ]] && {
            echo "Rejecting '$arg' in make args. Use 'command make ...' to bypass."
            return 1
        }
    done
    command make "$@"
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.