Ngăn tar sử dụng quá nhiều CPU và đĩa (máy tính xách tay cũ gặp sự cố nếu 100%)


15

Tôi muốn sao lưu 1 terabyte dữ liệu vào đĩa ngoài.

Tôi đang sử dụng lệnh này: tar cf /media/MYDISK/backup.tar mydata

VẤN ĐỀ: Máy tính xách tay kém của tôi bị đóng băng và gặp sự cố bất cứ khi nào tôi sử dụng 100% CPU hoặc 100% đĩa (nếu bạn muốn phản ứng về điều này, vui lòng viết tại đây ) . Vì vậy, tôi muốn giữ ở mức khoảng 50% CPU và tối đa 50% đĩa.

Câu hỏi của tôi: Làm thế nào để điều tiết CPU và đĩa bằng tarlệnh?

Rsync có tùy chọn --bwlimit, nhưng tôi muốn lưu trữ vì 1) có nhiều tệp nhỏ 2) Tôi thích quản lý một tệp hơn là một cây. Đó là lý do tại sao tôi sử dụng tar.


1
Thật là một ý tưởng thông minh để tạo ra tarball lớn như vậy: DDD Còn về lệnh 'đẹp' thì sao?
jirib

1
@JiriXichtkniha: nicesẽ không ngăn chặn việc sử dụng CPU 100%
Nicolas Raoul

Câu trả lời:


22

Bạn có thể sử dụng pvđể điều tiết băng thông của đường ống. Vì trường hợp sử dụng của bạn bị ràng buộc IO mạnh mẽ, nên chi phí CPU được thêm vào khi đi qua một đường ống không đáng chú ý và bạn không cần phải thực hiện bất kỳ điều chỉnh CPU nào.

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

1
Thậm chí tốt hơn những gì tôi đã mong đợi! Tôi đang giới hạn IO ở mức 5mb / giây và CPU vẫn ở mức 13% (có vẻ hợp lý với việc mã hóa đang diễn ra).
Nicolas Raoul

1
Rất đẹp!. Có lẽ cũng đề xuất cờ -q để loại bỏ thanh tiến trình.
szabgab

thật là một mệnh lệnh tuyệt vời !!! Nếu bạn không có nó trong Debian / Ubuntu, hãy chạy apt-get install pv. Tôi khuyên bạn nên thêm `-b` sau -L 1m: bằng cách này, bộ đếm byte gia tăng sẽ được in, cập nhật mỗi giây. Theo cách này, bạn biết có bao nhiêu byte đã được viết cho đến bây giờ
lucaferrario

Ngoài ra, xin lưu ý rằng nếu bạn nén đầu ra (sử dụng tar czfthay vì tar cf) thì giới hạn chỉ đến đầu ra được nén (vì vậy với -L 1mghi đĩa của bạn sẽ không vượt quá 1 MB / s .... nhưng số lần đọc đĩa của bạn có thể nằm trong khoảng 1 MB / s và 5 MB / s, tùy thuộc vào loại nội dung của bạn)
lucaferrario

Thủ thuật tuyệt vời! Khi nén với xz, tôi dẫn qua pv trước rồi qua xz.
Jean-Bernard Jansen

8

Bạn có thể thử công cụ cpulimit giới hạn tỷ lệ phần trăm CPU. Nó không phải là một công cụ tiêu chuẩn, vì vậy bạn sẽ phải cài đặt nó. Đây là một đoạn trích nhanh của README:

"Cpulimit là một công cụ cố gắng hạn chế việc sử dụng CPU của một quá trình (tính bằng phần trăm, không phải theo thời gian của CPU). [...] Việc kiểm soát lượng cpu đã sử dụng được thực hiện gửi tín hiệu SIGSTOP và SIGCONT POSIX cho các quy trình. các tiến trình con và luồng của tiến trình đã chỉ định sẽ chia sẻ cùng một phần trăm CPU. "

Sau đó, tôi sẽ khuyên dùng ionice để hạn chế việc sử dụng IO, mặc dù đó là quyền truy cập đồng thời sẽ bị hạn chế, không phải thông lượng tối đa ... Không bao giờ đây là cách sử dụng nó:

ionice -c 3 <your_command>

Tuyệt quá! Có vẻ như cpulimit là những gì tôi đang tìm kiếm.
Nicolas Raoul

2

Bạn thực sự không thể có được một quá trình để chạy ít hơn . Bạn có thể sử dụng niceđể ưu tiên thấp hơn, nhưng điều đó liên quan đến các quy trình khác. Cách để chạy bộ làm mát CPU trong khi chạy quy trình là sử dụng usleep(3)để buộc quá trình ra khỏi trạng thái chạy trong một khoảng thời gian nhất định, nhưng điều đó sẽ liên quan đến việc vá tarhoặc sử dụng LD_PRELOADcơ chế để cung cấp chức năng vá tarsử dụng nhiều (ví dụ: fopen(3)).

Tôi nghi ngờ cách giải quyết tốt nhất của bạn là những phần cứng bạn đã đề cập trên SuperUser: giữ cho máy tính xách tay mát mẻ và / hoặc hạ thấp xung nhịp CPU.

Một cách giải quyết khó chịu nhưng có thể khả thi (một loại bùn, thực sự) hoạt động ở mức độ 'vĩ mô'. Thay vì tarchạy 100ms cứ sau 200ms, bạn có thể khiến nó chạy một giây trong số hai giây. Lưu ý: đây là một loại bùn khủng khiếp, khủng khiếp. Nhưng này, nó thậm chí có thể làm việc!

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

Cái thứ nhất sleepđiều chỉnh thời gian ngủ, cái thứ hai điều chỉnh thời gian chạy. Hiện tại, nó có chu kỳ thuế 50%. Để giữ nhiệt độ xuống thấp, rất có thể bạn sẽ cần phải giảm chu kỳ thuế xuống còn 25% hoặc thấp hơn (chạy 1 giây, ngủ 3 giây = 1 cứ sau 4 giây = chu kỳ nhiệm vụ 25%). Bằng cách này, lệnh shell sleepcó thể mất thời gian phân số. Vì vậy, bạn thậm chí có thể nói sleep 0.1. Giữ chắc chắn hơn 0,001 để chắc chắn và đừng quên rằng việc thực thi tập lệnh cũng tăng thêm thời gian.


+1 ý tưởng hay! Tôi đoán nó tương tự như công cụ cpulimit mà Huygens gợi ý.
Nicolas Raoul

Ngoại trừ công cụ của Huuygens tốt hơn và thực tế hơn nhiều, đó là lý do tại sao câu trả lời đó có +1 của riêng tôi. :)
Alexios

0

Một cách mục đích chung hơn để giới hạn CPU là sử dụng /sys. Điều này có vẻ giống như những gì bạn muốn vì những thứ khác ngoài tarkhả năng thực hiện các nhiệm vụ tính toán đắt tiền, chỉ là bạn đang thấy tarnó làm điều đó nhiều nhất.

Cách để làm điều này là:

  1. đi đến /sys/devices/system/cpu/cpuX/cpufreqtừng CPU của bạn (thay thế cpuXbằng từng cpu).
  2. Sau đó nhìn vào tệp scaling_available_frequenciesđể xem CPU của bạn hỗ trợ tần số nào.
  3. Chọn một tần số (giả sử 1234567) và làm echo 1234567 > scaling_max_freq

Điều này sẽ ngăn CPU không vượt quá tần số đã chỉ định.


Cảm ơn, nhưng tôi đã ở tần số thấp nhất có thể. Đáng lẽ tôi phải đề cập điều đó. Tôi bắt đầu ép xung ngay khi những vấn đề này bắt đầu xuất hiện.
Nicolas Raoul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.