메소드 헤드가 있는 Powershell Invoke-WebRequest가 너무 많은 RAM을 할당함

메소드 헤드가 있는 Powershell Invoke-WebRequest가 너무 많은 RAM을 할당함

Powershell v 4.0이 설치된 서버에서 문제가 발견되었습니다. (Powershell 5.1을 사용하는 서버는 동일한 문제의 영향을 받지 않는 것 같습니다)

이것은 이상한 행동입니다호출-웹 요청명령.

다음 예를 들어보세요.

어떤 이유에서인지 서버에 다운로드하기 전에 파일 크기를 알아야 합니다.

그런 다음 다음 명령을 사용합니다.

$WebClient = Invoke-WebRequest -Uri $element -Method Head -Credential $Cred
$filesize = $webClient.Headers.'Content-Length'

문제는보내기 전에$WebClient 요청 Powershell 사용(커밋 RAM용)은 약 120MB이지만요청 후powershell은 RAM을 파일 $filesize 값으로 확대합니다(예: 원격 파일은 800MB, 새 커밋 RAM은 920MB).

1GB RAM으로 제한된 Powershell WinRM 세션을 사용하여 작업하는 경우 이는 문제가 될 수 있습니다. (OOM)

답변1

Invoke-WebRequestHEAD메소드를 사용하면 헤더만 가져오고 아무것도 다운로드하지 않을 수 있습니다 . 요청하는 리소스의 길이가 알려진 경우 Content-Length사용할 수 있는 헤더를 얻게 됩니다.

(Invoke-WebRequest $url -Method Head).Headers.'Content-Length'

모든 서버가 모든 요청에 ​​대해 헤더를 반환하는 것은 아닙니다 Content-Length. 이 경우 전체 파일을 읽는 위의 방법을 사용해야 하지만 속도가 느리고 메모리가 낭비됩니다.

인터넷 요청을 수행하는 Windows DLL에 직접 인터페이스할 수도 있습니다. WinINet (Windows Server에서는 사용할 수 없음) 또는 다음을 사용하여 Windows HTTP 서비스.

관련 정보