ป้องกัน tar จากการใช้ CPU และดิสก์มากเกินไป (แล็ปท็อปเก่าล่มถ้า 100%)


15

ฉันต้องการสำรองข้อมูล 1 เทราไบต์ไปยังดิสก์ภายนอก

ฉันใช้คำสั่งนี้: tar cf /media/MYDISK/backup.tar mydata

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

คำถามของฉัน: วิธีการเร่งความเร็ว CPU และดิสก์ด้วยtarคำสั่ง?

Rsync มีตัวเลือก --bwlimit แต่ฉันต้องการเก็บถาวรเพราะ 1) มีไฟล์ขนาดเล็กจำนวนมาก 2) ฉันชอบที่จะจัดการไฟล์เดียวมากกว่าต้นไม้ tarนั่นเป็นเหตุผลที่ผมใช้


1
เป็นความคิดที่ฉลาดที่จะสร้างลูกแก้วขนาดใหญ่เช่นนี้: DDD แล้วคำสั่ง 'ดี' ล่ะ?
jirib

1
@JiriXichtkniha: niceจะไม่ป้องกันการใช้งาน CPU 100%
Nicolas Raoul

คำตอบ:


22

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

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar

1
ดียิ่งกว่าที่ฉันคาดไว้! ฉัน จำกัด IO ถึง 5mb / วินาทีและ CPU อยู่ที่ 13% (ดูเหมือนสมเหตุสมผลกับการเข้ารหัสที่เกิดขึ้น)
นิโคลัสราอูล

1
ดีมาก!. อาจแนะนำให้ใช้แฟล็ก -q เพื่อกำจัดแถบความคืบหน้า
szabgab

ช่างเป็นคำสั่งที่ยอดเยี่ยม !!! หากคุณไม่ได้มีไว้ในของคุณ Debian / Ubuntu apt-get install pvรันเพียง ฉันขอแนะนำให้เพิ่ม `-b 'หลังจาก-L 1m: วิธีนี้ตัวนับไบต์ที่เพิ่มขึ้นจะถูกพิมพ์อัปเดตทุก ๆ วินาที ด้วยวิธีนี้คุณจะรู้ได้ว่ามีกี่ไบต์ที่ถูกเขียนจนถึงตอนนี้
lucaferrario

นอกจากนี้โปรดทราบว่าหากคุณบีบอัดเอาต์พุต (โดยใช้tar czfแทนtar cf) ขีด จำกัด หมายถึงเอาต์พุตบีบอัด (ดังนั้นเมื่อ-L 1mเขียนดิสก์ของคุณจะไม่เกิน 1 MB / s .... แต่การอ่านดิสก์ของคุณอาจจะอยู่ระหว่าง 1 MB / s และ 5 MB / s ขึ้นอยู่กับประเภทเนื้อหาของคุณ)
lucaferrario

เยี่ยมมาก! เมื่อทำการบีบอัดด้วย xz ฉันไปป์ผ่าน pv ก่อนแล้วจึงผ่าน xz
Jean-Bernard Jansen

8

คุณสามารถลองใช้เครื่องมือ cpulimitซึ่ง จำกัด เปอร์เซ็นต์ CPU มันไม่ใช่เครื่องมือมาตรฐานดังนั้นคุณจะต้องติดตั้ง นี่คือข้อความที่ตัดตอนมาอย่างย่อของ README:

"Cpulimit เป็นเครื่องมือที่พยายาม จำกัด การใช้งาน CPU ของกระบวนการ (แสดงเป็นเปอร์เซ็นต์ไม่ใช่ในเวลา CPU) [... ] การควบคุมปริมาณ cpu ที่ใช้จะทำการส่งสัญญาณ SIGSTOP และ SIGCONT POSIX ไปยังกระบวนการทั้งหมด กระบวนการ children และเธรดของกระบวนการที่ระบุจะแบ่งเปอร์เซ็นต์ CPU เดียวกัน "

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

ionice -c 3 <your_command>

ที่ดี! ดูเหมือนว่า cpulimit คือสิ่งที่ฉันกำลังมองหา
Nicolas Raoul

2

คุณไม่สามารถทำให้กระบวนการทำงานน้อยลงได้ คุณสามารถใช้niceเพื่อให้มันมีลำดับความสำคัญต่ำกว่า แต่ที่เกี่ยวข้องกับกระบวนการอื่น ๆ วิธีเรียกใช้ตัวระบายความร้อนซีพียูในขณะที่กระบวนการทำงานนั้นใช้usleep(3)เพื่อบังคับให้กระบวนการออกจากสถานะการทำงานเป็นระยะเวลาหนึ่ง แต่อาจเกี่ยวข้องกับการแพตช์tarหรือการใช้LD_PRELOADกลไกเพื่อให้ฟังก์ชั่นการปะติดที่tarใช้มากfopen(3))

ฉันสงสัยว่าวิธีแก้ปัญหาที่ดีที่สุดของคุณคือฮาร์ดแวร์ที่คุณได้กล่าวถึงใน SuperUser: ทำให้แล็ปท็อปเย็นและ / หรือลดนาฬิกา CPU

วิธีแก้ปัญหาที่น่ารำคาญ แต่อาจเป็นไปได้ (kludge จริงๆ) ทำงานในระดับ 'macroscopic' แทนที่จะทำtar100ms ทุก ๆ 200ms คุณสามารถทำให้มันวิ่งหนึ่งวินาทีจากทุก ๆ สองวินาที หมายเหตุ: นี่เป็นกระบองที่น่ากลัวและน่ากลัว แต่เดี๋ยวก่อนมันอาจทำงานได้!

tar cjf some-file.tar.bz2 /some-directory &
while true; do
    sleep 1  # Let it run for a second
    kill -STOP $! 2>/dev/null || break
    sleep 1  # Pause it for a second
    kill -CONT $! 2>/dev/null || break
done

ครั้งแรกที่sleepปรับเวลาพักคนที่สองจะปรับเวลารันไทม์ เมื่อมันมาถึงตอนนี้มันมีรอบการทำงาน 50% เพื่อให้อุณหภูมิลดลงคุณอาจจำเป็นต้องลดรอบการทำงานเป็น 25% หรือต่ำกว่า (เรียกใช้ 1 วินาที, 3 วินาทีหลับ = 1 ของทุก ๆ 4 วินาที = 25% รอบการทำงาน) คำสั่ง shell sleepสามารถใช้เวลาเป็นเศษส่วนได้ ดังนั้นคุณสามารถพูดsleep 0.1ได้ เก็บมากกว่า 0.001 เพื่อให้แน่ใจและอย่าลืมว่าการเรียกใช้สคริปต์เพิ่มขึ้นตามเวลาด้วย


+1 ความคิดที่ดี! ฉันคิดว่ามันคล้ายกับเครื่องมือ cpulimit ที่ Huygens แนะนำ
Nicolas Raoul

ยกเว้นเครื่องมือของ Huuygens นั้นดีกว่าและใช้งานได้มากกว่าซึ่งเป็นสาเหตุที่คำตอบนั้นได้ +1 ของฉันเอง :)
Alexios

0

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

วิธีการทำเช่นนี้คือ:

  1. ไปที่/sys/devices/system/cpu/cpuX/cpufreqCPU แต่ละตัวของคุณ (แทนที่cpuXด้วย cpu แต่ละอัน)
  2. จากนั้นค้นหาไฟล์scaling_available_frequenciesเพื่อดูความถี่ที่ CPU ของคุณรองรับ
  3. เลือกความถี่ (สมมติว่า 1234567) และทำ echo 1234567 > scaling_max_freq

สิ่งนี้จะป้องกันไม่ให้ CPU สูงกว่าความถี่ที่ระบุ


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