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


15

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

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

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

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

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


1
그런 거대한 타르볼을 만드는 영리한 아이디어 : DDD 'nice'명령은 어떻습니까?
jirib

1
@JiriXichtkniha : nice100 % CPU 사용을 막지 않을 것입니다
Nicolas Raoul

답변:


22

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

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

1
내가 기대했던 것보다 훨씬 낫습니다! IO를 5mb / 초로 제한하고 CPU는 13 %로 유지됩니다 (암호화가 진행되는 것으로 합리적입니다).
Nicolas Raoul

1
아주 좋아요!. 진행률 표시 줄을 제거하기 위해 -q 플래그를 권장 할 수도 있습니다.
szabgab

그런 위대한 명령 !!! 데비안 / 우분투에없는 경우 실행하십시오 apt-get install pv. 다음에`-b`를 추가하는 것이 좋습니다 -L 1m:이 방법으로 매분 업데이트되는 증분 바이트 카운터가 인쇄됩니다. 이런 식으로 당신은 지금까지 몇 바이트가 쓰여 졌는지 알 것입니다
lucaferrario

또한 출력을 압축하는 경우 ( tar czf대신에 사용 tar cf) 제한은 압축 된 출력을 의미하므로 -L 1m디스크 쓰기는 1MB / s를 초과하지 않습니다. 그러나 디스크 읽기는 아마도 1MB / s입니다. 및 콘텐츠 유형에 따라 5MB / s)
lucaferrario

좋은 트릭! xz로 압축 할 때 먼저 pv를 통해 xz를 통해 파이프합니다.
Jean-Bernard Jansen '12

8

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

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

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

ionice -c 3 <your_command>

큰! cpulimit가 내가 찾고있는 것 같습니다.
니콜라스 라울

2

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


+1 좋은 생각입니다! Huygens가 제안한 cpulimit 도구와 비슷하다고 생각합니다.
Nicolas Raoul 2016 년

Huuygens의 도구가 훨씬 우수하고 실용적이라는 점을 제외하고는 그 대답이 내 +1을 얻은 이유입니다. :)
Alexios 2016 년

0

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가 지정된 주파수를 초과하지 못하게됩니다.


고마워요,하지만 난 이미 가능한 가장 낮은 주파수에 있습니다. 나는 그것을 언급 했어야했다. 이러한 문제가 나타나기 시작하자마자 언더 클럭킹을 시작했습니다.
Nicolas Raoul 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.