타르가 너무 많은 CPU 및 디스크를 사용하지 못하도록 방지 (100 % 인 경우 이전 랩톱 충돌) 100 % 디스크를 사용할 때마다

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

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

문제 : 100 % CPU 또는 100 % 디스크를 사용할 때마다 저조한 노트북이 작동을 멈추고 충돌합니다 (이에 대해 반응하려면 여기에 작성하십시오 ) . 그래서 나는 약 50 %의 CPU와 50 %의 디스크 최대를 유지하고 싶습니다.

내 질문 : tar명령으로 CPU와 디스크를 조절하는 방법은 무엇입니까?

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



답변

pv파이프의 대역폭을 조절하는 데 사용할 수 있습니다 . 사용 사례는 IO에 강하게 묶여 있으므로 파이프를 통과하는 추가 CPU 오버 헤드는 눈에 띄지 않아야하며 CPU 조절을 수행 할 필요가 없습니다.

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

답변

CPU 백분율을 제한하는 cpulimit 도구 를 사용해 볼 수 있습니다 . 표준 도구가 아니므로 설치해야합니다. README에 대한 간략한 발췌문은 다음과 같습니다.

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

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

ionice -c 3 <your_command>

답변

실제로 프로세스를 실행할 수는 없습니다. . nice우선 순위를 낮추는 데 사용할 수 있지만 다른 프로세스와 관련이 있습니다. 프로세스가 실행되는 동안 CPU 쿨러를 실행하는 방법 usleep(3)은 프로세스를 특정 시간 동안 실행 상태에서 강제 종료하는 데 사용 하는 것이지만 패치를 tar사용하거나 LD_PRELOAD메커니즘을 tar사용하여 많이 사용하는 패치 기능을 제공하는 것입니다 (예 : fopen(3)).

가장 좋은 해결 방법은 슈퍼 유저에서 언급 한 하드웨어 인 것 같습니다. 랩탑을 시원하게 유지하거나 CPU 시계를 낮추는 것입니다.

성가 시지만 실행 가능한 해결 방법 (실제로 kludge)은 ‘매크로 스코픽’수준에서 작동합니다. tar200ms마다 100ms 를 실행하는 대신 2 초마다 1 초씩 실행할 수 있습니다. 참고 : 이것은 끔찍하고 끔찍한 kludge입니다. 그러나, 그것은 심지어 작동 할 수도 있습니다!

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 이상으로 유지하고 스크립트 실행에 시간이 더 걸린다는 것을 잊지 마십시오.


답변

CPU를 제한하는보다 일반적인 목적은 사용하는 것입니다 /sys 입니다. tar계산적으로 값 비싼 작업을 수행 할 수있는 것 이외의 다른 작업을 tar수행하는 것이 가장 중요합니다.

이를 수행하는 방법은 다음과 같습니다.

  1. 이동 /sys/devices/system/cpu/cpuX/cpufreq각 CPU 하십시오 ( cpuX각 CPU로 교체 ).
  2. 그런 다음 파일을 살펴보십시오 scaling_available_frequencies 에서 CPU가 지원하는 주파수를 확인하십시오.
  3. 빈도를 정하고 (1234567이라고 함) echo 1234567 > scaling_max_freq

이렇게하면 CPU가 지정된 주파수를 초과하지 못하게됩니다.


답변