프로세스가 대화식으로 수행되는 것보다 예약 된 작업으로 느리게 실행 된 작업으로 실행하는 데

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

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

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



답변

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

어쨌든 예약 된 작업 우선 순위 수정을 사용하더라도 작업의 메모리 우선 순위는 4로 설정되어 일반 설정 5보다 한 단계 낮습니다. 작업의 메모리 우선 순위를 수동으로 5까지 올렸을 때 성능이 향상되었습니다. 프로세스를 대화식으로 실행하는 것과 같습니다.

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

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


답변

문제는 프로세스가 낮은 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에서 예약 된 작업의 초기 우선 순위를 수정할 방법이 없습니다.


답변

사용자 X로 예약 된 작업으로 실행하도록 설정 한 다음 실행하기 전에 사용자 X로 로그인하면 세션이 실행될 때 세션에서 창이 열리고 세션에서 실행됩니다.

이렇게하면 시간이 더 오래 걸리나요? 이것이 무엇을 의미하는지 모르겠지만 유용한 차별화 요소가 될 수 있습니다. 로그인 할 때 사용자 계정이 가지고 있지만 예약 된 작업으로 실행할 때는 시간 초과와 실패가 발생하는 네트워크 액세스가있을 수 있습니까? 새 사용자 계정을 만들고 해당 계정에서 예약 된 작업으로 실행하면 동작이 달라 집니까?

또 다른 아이디어 : 예약 된 작업으로 실행할 때-이제 스크립트의 우선 순위를 수정 했으므로 하위 프로세스가 모두 정상 또는 정상 이하로 실행됩니까?


답변

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

prio더 높은 우선 순위를 강제하는 데 사용하십시오 .


답변

처음에는 보통 우선 순위보다 더 많이 사용할 수 있습니다 (예 : 높음).

초반에는 포 그라운드 세션이 일부 리소스, 주로 하드 디스크 IO 및 메모리를 사용하므로 예약 된 작업이 줄어드는 것보다 이해해야합니다. 명확한 벤치 마크를 위해서는 powershell 스크립트 실행 중에 로그 오프해야합니다

또한 프로세스 속도를 높이기 위해 더 많은 메모리 추가 / 램 드라이브 사용 / 여러 하드 디스크에서 분할 작업 사용 가능


답변

이 질문은 얼마 전부터 Windows Server 2008R2에 대한 것입니다. 같은 질문이 있었지만 Windows 10의 경우도 마찬가지입니다. Windows 10 (1703 및 1809에서 확인 됨)에서 가져온 XML을 통해 “우선 순위”를 4로 설정하면 동일한 기본 우선 순위, 동적 우선 순위, I / O 우선 순위를 제공하기에 충분합니다 및 대화식으로 시작된 프로세스로서의 메모리 우선 순위.


답변

우선 순위를 설정하기위한 powershell 스 니펫은 다음과 같습니다 (원격 powershell 세션에서 작동합니다).

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = New-ScheduledTaskSettingsSet ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -Trigger $currentTask.Triggers -Action $currentTask.Actions -Settings $settings -User "NT AUTHORITY\SYSTEM"