`ทำให้ -j '(ไม่มีข้อโต้แย้ง) เป็นอันตรายหรือไม่? [ปิด]


13

ก่อนหน้านี้ในวันนี้เมื่อมีการสร้างสิ่งที่ฉันตัดสินใจที่จะทำงานmakeเป็น

$ make -j

บางทีอาจจะออกมาจากนิสัยกับโปรแกรมอื่น ๆ เช่นcabalที่-jเริ่มต้นที่วงเงินที่เหมาะสม

ประมาณ 20 วินาทีต่อมาสก์ท็อปของฉันทั้งหมด grinds ต้องหยุดชะงัก ฉันมองหาสัญญาณต่าง ๆ ของกิจกรรม ไม่มีแฟน ๆ ปั่น ไฟ HDD เป็นสีเขียวค้าง แต่ฉันไม่ได้ยินการทำงานของดิสก์ hmmmmm หลังจากเงียบไป 10 นาทีในที่สุดฉันก็เห็นการตอบรับของปุ่มกดแรกที่ฉันทำเมื่อหลายปีก่อนและฉันก็เริ่มได้ยินเสียงที่คุ้นเคยของดิสก์อย่างรุนแรง 20 นาทีต่อมาเมื่อฉันพยายามที่จะลุยเข้าไปในอาคารที่ไม่ตอบสนองฉันก็เลยยุบและใช้ REISUB


ตอนแรกฉันคิดว่าแอปพลิเคชันเดสก์ท็อปที่ไม่เกี่ยวข้องจะต้องเป็นผู้ร้ายเพราะฉันมีหน่วยความจำที่ จำกัด ในเซสชันทุบตีแบบโต้ตอบเพื่อป้องกันไม่ให้ฉันใส่ตัวเองลงในสถานการณ์เช่นนี้! แต่/var/log/syslogบอกเล่าเรื่องราวที่แตกต่าง; นักฆ่า OOM ทิ้งบางส่วนpsทิ้งซึ่งมีพิรุธเต็มไปด้วยc++และcc1plusกระบวนการ!

นี่คือการวิเคราะห์ความถี่ของการทิ้งหนึ่งในนั้น:

Command          Number of appearances
'sh'                    322
'c++'                   321
'cc1plus'               321
'chrome'                 27
'make'                   27
'bash'                    3
all else combined       120

ดังนั้นฉันจะตรวจสอบ man page สำหรับ GNU make: (เน้นการเพิ่ม)

-j [jobs], --jobs [= jobs] ระบุจำนวนงาน (คำสั่ง) เพื่อให้ทำงานพร้อมกัน หากมีมากกว่าหนึ่งตัวเลือก -j ตัวเลือกสุดท้ายจะมีผลบังคับใช้ หากกำหนดอ็อพชัน -j โดยไม่มีอาร์กิวเมนต์ให้จะไม่ จำกัด จำนวนงานที่สามารถรันพร้อมกัน


ฉันลังเลที่จะตรวจสอบว่าฉันสามารถทำซ้ำปัญหา(หมอมันเจ็บเมื่อฉันทำเช่นนี้ ... )แต่ผลการสอบสวนจนถึงตอนนี้ดูเหมือนจะเป็นวิ่งกลับบ้าน: ชัดเจนmake -jและกระบวนการที่เกิดขึ้นหลายร้อยต้อง เคยเป็นสาเหตุของการแฮงค์และดิสก์ thrashing ที่กล่าวว่าการค้นหาอินเทอร์เน็ตฉันไม่สามารถหาคำเตือนได้มากนัก ฉันกำลังกระโดดไปสู่ข้อสรุป?

คือmake -jเป็นอันตรายก็จะดูเหมือนกับผมหรือเปล่า ถ้าเป็นเช่นนั้นทำไมบนโลกถึงอยู่ที่นั่นและสิ่งที่สามารถทำได้เพื่อพิสูจน์ความงี่เง่า?


หมายเหตุ: ในคำถามสุดท้ายฉันกำลังพิจารณาการเพิ่มalias make="make -j4"เพื่อกำจัดความจำเป็นในการเพิ่ม-jNอาร์กิวเมนต์ แต่ฉันยังไม่ได้คิดถึงผลที่จะเกิดขึ้นทั้งหมด ...
ประสบการณ์ HP

1
สำหรับข้อ จำกัด ทั่วโลกโดยใช้เป็นสิ่งอำนวยความสะดวกของตัวเองและไม่make export MAKEFLAGS="-j 4"ต่อการสืบสวน ฉัน คำแนะนำในการ อ่าน ก่อนที่จะ พิมพ์ PS: <จำนวนแกน> + 2 ทำให้ฉันดีมาเกือบสองทศวรรษแล้ว ย้อนกลับไปในวันนั้นไลนัสทำเกมสุดท้ายmake -j128ก่อนที่จะปล่อยเคอร์เนล
Bananguin

คำตอบ:


6

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

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

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

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

ดังนั้นวิธีการพิสูจน์งี่เง่ามันได้หรือไม่

นี่คือคำแนะนำทีละขั้นตอนที่แน่นอน:

  1. เรียนรู้การใช้เครื่องมือของคุณ

โปรดสังเกตด้วยว่าการ-jตั้งค่าสถานะไปยัง BSD make นั้นต้องการอาร์กิวเมนต์และการตั้งค่าสถานะนี้ไม่เป็นมาตรฐาน (มาตรฐาน Unix POSIX ไม่ได้กล่าวถึง)


4

คุณยังสามารถ จำกัด การใช้-l:

-l [load], --load-average [= load] ระบุว่าไม่ควรเริ่มงานใหม่ (คำสั่ง) หากมีงานอื่นที่กำลังทำงานอยู่และค่าเฉลี่ยการโหลดอย่างน้อยโหลด (หมายเลขทศนิยม) หากไม่มีอาร์กิวเมนต์ให้ลบขีด จำกัด การโหลดก่อนหน้านี้

make -j -l4แต่ทราบว่ามันไม่ได้ดูเหมือนจะช่วยในการทำงานเช่นนี้

มีการเริ่มงานมากเกินไปก่อนที่ค่าเฉลี่ยการโหลดจะเพิ่มขึ้นเกินขีด จำกัด (จากประสบการณ์ของฉัน) make -j8 -l4ดังนั้นการรวมกันสามารถทำงานได้เช่น

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