tar가 CPU와 디스크를 너무 많이 사용하지 않도록 방지(100%인 경우 구형 노트북이 충돌함)

tar가 CPU와 디스크를 너무 많이 사용하지 않도록 방지(100%인 경우 구형 노트북이 충돌함)

1TB의 데이터를 외부 디스크에 백업하고 싶습니다.

나는 다음 명령을 사용하고 있습니다 :tar cf /media/MYDISK/backup.tar mydata

문제: CPU를 100% 사용하거나 디스크를 100% 사용할 때마다 불량한 노트북이 작동을 멈추고 충돌합니다.(이것에 반응하고 싶다면여기 쓰시 오). 그래서 CPU 사용률과 디스크 사용률을 50% 정도 유지하고 싶습니다.

내 질문: 명령을 사용하여 CPU와 디스크를 제한하는 방법은 무엇입니까 tar?

Rsync에는 --bwlimit 옵션이 있지만 1) 작은 파일이 많고 2) 트리보다는 개별 파일 관리를 선호하기 때문에 아카이브를 원합니다. 이것이 내가 사용하는 것입니다 tar.

답변1

당신은 그것을 사용할 수 있습니다pv파이프의 대역폭을 제한하십시오. 사용 사례는 강력한 IO 바인딩이므로 파이프라인을 통한 CPU 오버헤드 증가는 눈에 띄지 않아야 하며 CPU 조절을 수행할 필요가 없습니다.

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

답변2

당신은 시도 할 수 있습니다CPU 조절 도구이는 CPU 비율을 제한합니다. 표준 도구가 아니므로 설치해야 합니다. 다음은 Readme에서 간략하게 발췌한 내용입니다.

"Cpulimit는 프로세스의 CPU 사용량을 제한하는 도구입니다(CPU 시간이 아닌 백분율로 표시). [...] 사용되는 CPU 수 제어는 SIGSTOP 및 SIGCONT POSIX 신호를 전송하여 수행됩니다. 프로세스. 지정된 프로세스의 모든 하위 프로세스와 스레드는 동일한 비율의 CPU를 공유합니다.

그런 다음 IO 사용량을 제한하기 위해 ionice를 권장합니다. 비록 제한은 최대 처리량이 아니라 동시 액세스이지만... 그러나 사용 방법은 다음과 같습니다.

ionice -c 3 <your_command>

답변3

실제로 프로세스를 실행할 수는 없습니다.더 적은. 더 낮은 우선순위를 부여 할 수 있지만 nice이는 다른 프로세스에 비해 상대적입니다. 프로세스가 실행 중인 동안 CPU 쿨러를 실행하는 한 가지 방법은 usleep(3)특정 시간 내에 프로세스를 실행 상태에서 강제로 벗어나게 하는 것입니다. 그러나 여기에는 패치를 적용하거나 패치 tar가 많이 적용된 기능을 사용할 수 있는 메커니즘을 사용하는 작업이 포함됩니다 LD_PRELOAD(예: ).tarfopen(3)

가장 좋은 해결책은 슈퍼유저에서 언급한 하드웨어 수정입니다. 노트북을 시원하게 유지하거나 CPU 클럭을 낮추는 것입니다.

짜증나지만 잠재적으로 해결 가능한 해결 방법(실제로는 패치워크)이 "매크로" 수준에서 작동합니다. tar100밀리초 동안 200밀리초마다 실행하는 대신 2초마다 1초 동안 실행되도록 할 수 있습니다. 참고: 이것은 끔찍하고 끔찍한 패치워크입니다. 하지만 어쩌면 효과가 있을 수도 있습니다!

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초 절전 = 4초마다 1 = 25% 듀티 사이클). sleep그런데 쉘 명령에는 약간의 시간이 걸릴 수 있습니다. 그래서 당신은 그렇게 말할 수도 있습니다 sleep 0.1. 확실히 하려면 0.001 이상으로 유지하고 스크립트 실행에도 시간이 추가된다는 점을 잊지 마십시오.

답변4

CPU를 제한하는 보다 일반적인 방법은 를 사용하는 것입니다 . 이는 계산적으로 비용이 많이 드는 작업을 수행할 수 있는 것 외에 볼 수 있는 최대치 이기 /sys때문에 어쨌든 원하는 것 같습니다 .tartar

이를 달성하는 방법은 다음과 같습니다.

  1. /sys/devices/system/cpu/cpuX/cpufreq각 CPU 로 이동합니다 ( cpuX각 CPU로 교체).
  2. 그런 다음 파일을 확인하여 scaling_available_frequenciesCPU가 지원하는 주파수를 확인하십시오.
  3. 주파수(1234567이라고 가정)를 선택하고 실행합니다.echo 1234567 > scaling_max_freq

이렇게 하면 CPU가 지정된 주파수를 초과하는 것을 방지할 수 있습니다.

관련 정보