프로세스는 대화형 방식보다 예약된 작업으로 더 느리게 실행됩니다.

프로세스는 대화형 방식보다 예약된 작업으로 더 느리게 실행됩니다.

CPU와 IO를 매우 많이 사용하고 실행하는 데 약 4시간이 걸리는 예약된 작업이 있습니다(궁금하신 경우 소스 코드 작성). 작업은 작업을 수행하기 위해 다양한 하위 프로세스를 생성하는 Powershell 스크립트입니다. 동일한 사용자 계정으로 Powershell 프롬프트에서 동일한 프로세스를 대화형으로 실행하면 약 2시간 30분 안에 실행됩니다. 작업이 Windows Server 2008 R2에서 실행 중입니다.

내가 알고 싶은 것은 예약된 작업으로 실행하는 데 훨씬 더 오랜 시간이 걸리는 이유입니다. 즉, 한 시간 이상 더 걸립니다. 제가 알아차린 한 가지는 작업 스케줄러가 보통 미만 우선순위로 실행되므로 작업이 시작되면 동일하게 낮은 우선순위를 상속한다는 것입니다. 그러나 Powershell 프로세스 우선 순위를 다시 보통으로 설정하도록 스크립트를 업데이트했는데 여전히 시간이 오래 걸립니다.

두 시나리오 사이에 무엇이 다를 수 있는지 아는 사람이 있나요? 나는 프로세서와 IO 로드의 차이를 배제했습니다. 이 작업은 시스템이 사용되는 유일한 작업이므로 리소스를 놓고 경쟁할 수 있는 다른 작업은 실행되지 않습니다.

답변1

여기서는 "일반적인" 프로세스 우선순위 이상의 것이 있는 것으로 보입니다. 질문에서 언급했듯이 작업 스케줄러는 기본적으로 작업을 일반 우선순위보다 낮은 우선순위로 실행합니다.StackOverflow에 대한 이 질문일반 우선순위로 실행되도록 작업을 수정하는 방법을 설명하지만 수정 후에도 한 가지 약간 다른 점은 메모리 우선순위입니다. 메모리 우선 순위는 Windows Vista의 새로운 기능이며 이에 대한 설명은 다음과 같습니다.이 Technet 기사. 다음을 사용하여 메모리 우선 순위를 볼 수 있습니다.프로세스 탐색기는 모든 관리자나 프로그래머에게 꼭 필요한 도구입니다.

아무튼, 예약된 작업 우선순위 수정에도 불구하고 작업의 메모리 우선순위는 4로 설정되어 있는데, 이는 일반 설정인 5보다 한 단계 낮은 수치입니다. 수동으로 작업의 메모리 우선순위를 5까지 올렸더니 성능이 계속 나오더군요. 프로세스를 대화식으로 실행하는 것과 동일합니다.

우선순위를 높이는 방법에 대한 자세한 내용은 다음을 참조하세요.관련 StackOverflow 질문에 대한 내 대답IO 우선순위에 대해; 메모리 우선 순위 설정은 NtSetInformationProcess PROCESS_INFORMATION_CLASS를 통해 유사하게 수행되며 ProcessMemoryPriority값은 39 또는 0x27입니다. 다른 사람이 필요로 하고 프로그래머 도구에 액세스할 수 없는 경우 이를 설정하는 데 사용할 수 있는 무료 유틸리티를 만들 수도 있습니다.

편집: 작업의 메모리 우선순위를 쿼리하고 설정하기 위한 무료 유틸리티를 작성했습니다.여기에서 사용 가능. 다운로드에는 소스 코드와 컴파일된 바이너리가 모두 포함되어 있습니다.

답변2

문제는 프로세스가 낮은 I/O 우선순위와 낮은 메모리 우선순위로 시작된다는 것입니다. 이를 확인하는 가장 쉬운 방법은 sysinternals의 프로세스 탐색기를 사용하는 것입니다. 이 예약된 작업에서 생성된 프로세스의 속성을 살펴보면 해당 프로세스의 I/O 우선 순위는 낮음이고 메모리 우선 순위는 2임을 알 수 있습니다.

이 문제에 대한 해결책은 다음과 같습니다.

  1. 작업 만들기
  2. 작업을 마우스 오른쪽 버튼으로 클릭하고 "내보내기"
  3. 방금 내보낸 task.xml 파일을 편집합니다.
  4. 다음과 비슷한 줄을 찾을 수 있습니다.<Priority>7</Priority>
  5. 값을 일반 우선순위(4~6 사이)로 변경합니다. 잠재적 가치 표:TaskSettings.Priority 속성
    • 값 4는 대화형 프로세스와 동일한 I/O 및 메모리 우선순위를 갖습니다. 5와 6의 값은 메모리 우선순위가 낮습니다.
  6. 작업 스케줄러에서 처음 생성한 작업을 삭제하세요.
  7. 작업 스케줄러의 작업 영역에 있는 XML 파일에서 작업을 가져옵니다.

불행하게도 GUI에서는 예약된 작업의 초기 우선순위를 수정할 수 있는 방법이 없습니다.

답변3

다음은 우선순위 설정을 위한 Powershell 코드 조각입니다(원격 Powershell 세션에서 작동합니다!).

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = $currentTask.Settings ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -TaskPath $currentTask.TaskPath -Settings $settings

답변4

예약된 작업은 기본적으로 낮은 우선순위로 실행될 수도 있습니다.

더 높은 우선순위를 강제하는 데 사용됩니다 prio.

관련 정보