แก้ไขการใช้ xargs แบบขนาน


9

ฉันใช้xargsโทรสคริปต์ไพ ธ อนเพื่อประมวลผลไฟล์ขนาดเล็กประมาณ 30 ล้านไฟล์ ฉันหวังว่าจะใช้xargsเพื่อขนานกระบวนการ คำสั่งที่ฉันใช้คือ:

find ./data -name "*.json" -print0 |
  xargs -0 -I{} -P 40 python Convert.py {} > log.txt

โดยทั่วไปConvert.pyจะอ่านในไฟล์jsonขนาดเล็ก(4kb) ทำการประมวลผลและเขียนไปยังไฟล์ 4kb อื่น ฉันกำลังทำงานบนเซิร์ฟเวอร์ที่มี 40 คอร์ CPU และไม่มีกระบวนการอื่นที่ใช้งาน CPU สูงบนเซิร์ฟเวอร์นี้

จากการตรวจสอบ htop (btw มีวิธีอื่นที่ดีในการตรวจสอบประสิทธิภาพของ CPU หรือไม่) ฉันพบว่า-P 40ไม่เร็วเท่าที่ควร บางครั้งแกนทั้งหมดจะหยุดและลดลงจนเกือบเป็นศูนย์ประมาณ 3-4 วินาทีจากนั้นจะฟื้นตัวเป็น 60-70% จากนั้นฉันพยายามลดจำนวนกระบวนการแบบขนานเป็น-P 20-30แต่ก็ยังไม่เร็วมาก พฤติกรรมในอุดมคติควรเป็นแบบความเร็วเชิงเส้น มีข้อเสนอแนะใด ๆ สำหรับการใช้ xargs แบบขนานหรือไม่


6
คุณน่าจะโดน I / O มากที่สุด: ระบบไม่สามารถอ่านไฟล์ได้เร็วพอ ลองเริ่มต้นมากกว่า 40: วิธีนี้จะดีถ้ากระบวนการบางอย่างต้องรอ I / O
Ole Tange

สคริปต์ประมวลผลชนิดใด ฐานข้อมูล / เครือข่าย / io ใด ๆ ที่เกี่ยวข้อง? ใช้เวลานานเท่าไหร่?
Fox

1
ฉันสอง @OleTange นั่นคือพฤติกรรมที่คาดหวังถ้าคุณเรียกใช้กระบวนการมากเท่าที่คุณมีแกนและงานของคุณเป็น IO ผูกพัน ก่อนอื่นแกนจะรอ IO สำหรับงานของพวกเขา (sleep) จากนั้นพวกมันจะประมวลผลแล้วทำซ้ำ หากคุณเพิ่มกระบวนการเพิ่มเติมกระบวนการเพิ่มเติมที่ไม่ได้ทำงานอยู่บนแกนประมวลผลปัจจุบันจะเริ่มต้นการทำงานของ IO แบบขนานซึ่งเมื่อเสร็จแล้วจะกำจัดหรืออย่างน้อยก็ลดระยะเวลาสลีปบนแกนนอนของคุณ
PSkocik

1- คุณเปิดใช้งานไฮเปอร์เธรดหรือไม่ 2- ในสิ่งที่คุณมีอยู่ log.txt จะถูกเขียนทับจริง ๆ ด้วยการเรียกแต่ละครั้งไปที่ convert.py ... ไม่แน่ใจว่านี่เป็นพฤติกรรมที่ตั้งใจหรือไม่
Bichoy

xargs -Pและ>กำลังเปิดรับเงื่อนไขการแข่งขันเนื่องจากปัญหาครึ่งสายgnu.org/software/parallel/การใช้ GNU Parallel แทนจะไม่มีปัญหานั้น
Ole Tange

คำตอบ:


4

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

หากคุณสามารถปรับโครงสร้างโปรแกรมไพ ธ อนเพื่อรับรายการไฟล์แทนที่จะเป็นไฟล์เดียวคุณจะได้รับการปรับปรุงประสิทธิภาพอย่างมาก จากนั้นคุณยังสามารถใช้ xargs เพื่อปรับปรุงประสิทธิภาพต่อไป ตัวอย่างเช่น 40 กระบวนการแต่ละการประมวลผล 1,000 ไฟล์:

find ./data -name "*.json" -print0 |
  xargs -0 -L1000 -P 40 python Convert.py

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

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


1

ดังนั้นก่อนอื่นให้พิจารณาข้อ จำกัด :

ข้อ จำกัด ของแต่ละงานคืออะไร? ถ้าเป็น I / O คุณอาจจะได้งานหลาย ๆ งานต่อซีพียูคอร์ขึ้นไปจนถึงขีด จำกัด ของ I / O แต่ถ้ามันเป็นซีพียูมากมันจะแย่กว่าการทำงานแบบไม่มีจุดหมายมากกว่างานที่มีคอร์ CPU

ความเข้าใจของฉันเกี่ยวกับสิ่งเหล่านี้คือGNU Parallelจะช่วยให้คุณควบคุมงานได้ดีขึ้น ฯลฯ

ดูGNU parallel vs & (ฉันหมายถึงพื้นหลัง) vs xargs -Pสำหรับคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับความแตกต่างของทั้งสอง


0

อย่างที่คนอื่นพูดกันตรวจสอบว่าคุณเป็น I / O-bound นอกจากนี้ man page ของ xargs แนะนำให้ใช้-nกับ-Pคุณไม่ต้องพูดถึงจำนวนConvert.pyกระบวนการที่คุณเห็นว่าทำงานแบบขนาน

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

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