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