`nice`는 Linux에 별로 도움이 되지 않습니다.

`nice`는 Linux에 별로 도움이 되지 않습니다.

저는 원격 데비안 설치의 일반 사용자(관리자가 아님)입니다. 나는 그곳에서 매우 다양한 전용 웹 서버를 운영하고 있습니다. 매일 서버에서 생성되는 로그는 크기가 매우 커서 때로는 월별 타르볼로 패키징하고 일정 시간 후에 압축해야 할 때도 있습니다. 먼저 나는 이것을 시도했다:

tar rf 2014-12.tar 2014-12-*.log

10분 후, 한 고객이 전화를 걸어 서버가 응답을 멈췄다고 말했습니다. 실제로 서버 프로세스는 "보류" 상태이며 모든 관심은 tar 프로세스에 집중되어 있습니다. 에 따르면 총 CPU 로드는 top5%에 불과합니다. 그런 다음 다음을 시도합니다.

nice -n19 tar rf 2014-12.tar 2014-12-*.log &

서버 프로세스를 모니터링할 수 있도록 백그라운드로 명령을 보냅니다. 서버 프로세스가 느려지는 것을 관찰했지만 너무 많이 느려지지는 않았으므로 허용할 수 있습니다. 약 5분 동안 모든 것이 잘 작동하다가 갑자기 서버가 다시 작동을 멈췄습니다. tar 프로세스를 종료하고 서버가 즉시 작동하기 시작하는 것을 보았습니다.

서버는 많은 클라이언트가 연결하는 TCP 소켓을 수신하고 있습니다. tar가 실행되는 동안 서버는 계속 작동하지만 잠시 후 select 호출이 읽기 가능한 소켓 업데이트를 중지하는 것 같습니다.

모든 것이 혼란스럽습니다. 다른 작업이 실행되고 있는데 몇 분 후에 서버가 끊어지는 것 같지만 그 외에는 몇 달 동안 문제 없이 실행됩니다. 에 따르면 top내 프로세스는 전체 CPU의 약 5% 이상을 차지하지 않는 것 같습니다. 이유는 무엇입니까? 서버 프로세스를 방해하지 않고 로그를 어떻게 압축할 수 있나요?

답변1

muru가 말했듯이 niceCPU 스케줄링만 제어합니다. 당신은 당시 CPU 사용량이 5% 정도에 불과했다고 직접 지적했습니다. 이는 시스템이 심각하게 IO 바인딩되어 있음을 의미하며, 이는 디스크 읽기/쓰기가 병목 현상을 일으킨다는 것을 의미합니다.

명령을 통해 프로세스에 부여된 IO 우선순위를 제어할 수 있습니다 ionice. 세 가지 예약 클래스 중 하나에 프로세스를 넣을 수 있습니다.

  • 유휴 - 다른 프로그램에서 디스크가 필요하지 않을 때만 디스크 시간을 얻습니다.
  • 최선의 노력 - 기본적으로 기본값
  • 실시간 - 이 클래스는 무슨 일이 일어나든 먼저 디스크에 액세스합니다.

옵션을 사용하여 클래스를 지정할 수 있습니다 -c. 1 = 실시간, 2 = 최선, 3 = 유휴.

또한 최선 노력 상황과 실시간 상황 모두에서 동일한 수준의 프로세스 간 미세 조정을 위한 8가지 우선 순위 수준이 있습니다.

나는 보통 "유휴"의 가장 낮은 수준인 taror rsync와 같은 명령을 실행합니다. ionice -c3이렇게 하면 다른 프로세스에 디스크 액세스가 부족하지 않습니다.

IMHO는 ioniceCFQ I/O 스케줄러(커널 매개변수)에서 가장 잘 작동합니다.

답변2

관찰한 동작은 파일 시스템의 구현 세부 사항일 수 있습니다. 즉, 메모리에 대량의 데이터를 수집하고 일괄적으로 쓰는 것일 수 있습니다. 이 문제를 해결하는 가장 쉬운 방법은 기록할 데이터의 양을 줄이는 것입니다 =). 이 문제를 방지하려면 즉시 파일을 가져오는 것이 좋습니다. 디스크 속도가 느리면 보관되지 않은 tar를 저장할 의미가 없습니다. 아카이브를 생성하려면 tar 명령줄에 -z 옵션을 추가하기만 하면 됩니다 tar rzf 2014-12.tar.gz 2014-12-*.log. 대부분의 경우 압축 및 압축 해제 시 CPU를 거의 사용하지 않기 때문에 gzip을 사용하는 것이 좋습니다. 이 접근 방식을 사용하면 tar 생성 시간을 10~20배로 줄일 수 있고 파일 시스템에 기록되는 데이터의 양도 같은 비율로 줄일 수 있습니다.

또한 매일 손으로 타르를 바르는 것은 이상한 생각이라는 점을 지적하고 싶습니다. 시스템이 이 모든 작업을 자동으로 수행하도록 일반적인 logrorate 및 cron/anacron 작업을 설정하는 것이 좋습니다.

그런데 어떤 종류의 파일 시스템이 있나요? (사용 mount|grep $(stat --printf "%m" .))

관련 정보