류짱:Beyond MySelf

IRP(I/O 요청 패킷) / irpstacksize / Event id 2011 /DeviceTree 본문

Microsoft/Windows Platform

IRP(I/O 요청 패킷) / irpstacksize / Event id 2011 /DeviceTree

リュちゃん 2011. 5. 25. 20:30

서버 운영 중에 "명령 처리에 사용할 서버 저장 공간이 부족합니다." irpstacksize"가 너무 작아서 서버가 로컬 장치를 사용 할 수 없습니다"라는 오류 메시지를 접하게 됩니다.

어떤 이유로 그와 같은 메시지가 발생하고 조치 방법은 무엇인지 확인 해 보도록 하겠습니다.

[
환 경]

Windows Server 2003 SE x86 + sp2

Host name: ryuchan.kr

[증 상]
1. 공유 디렉토리 연결 시 "시스템 오류가 1130(가) 생겼습니다. "명령 처리에 사용할 서버 저장 공간이 부족합니다." 메시지 발생



2.Event 2011의 지속 발생
"서버의 구성 매개 변수 "irpstacksize" 너무 작아서 서버가 로컬 장치를 사용 할 수 없습니다. 이 매개 변수의 값을 늘리 십시오"

 

[원 인]

IRP(I/O request packet, I/O 요청 패킷) I/O 시스템이 I/O 요청을 처리할 때 필요한 정보를 저장 하는 곳입니다. 스레드가 I/O 서비스를 호출 할 때 I/O 관리자는 I/O 서비스가 I/O 시스템을 통해 진행 됨에 따라 그 동작을 나타내기 위해IRP를 만듭니다.

IRP
는 고정 된 헤더와 하나 이상의 Stack location(스택위치)으로 구성 된 두 개의 파트로 이루어지는데 Stack location (스택위치)은 함수 코드와 함수와 관계된 연산인자, 호출자의 파일 객체 포인터를 담고 있습니다
.

IRPStackSize
매개 변수는 Windows 2000 Server Windows Server 2003에서 사용하는 IRP(I/O 요청 패킷)스택 위치 (Stack location) 를 지정합니다
.
특정 전송, MAC (미디어 엑세스 제어) 드라이버 또는 파일 시스템 드라이버에 대해서 이 숫자를 늘려야 할 수 있습니다.


가령, 해당 서버의 D 드라이브 경우 Mvfs, symsnap, FltMgr, Ntfs 등 여러 드라이버가 Attach 되었으며, 해당 드라이버들이 Attach 될 때마다 그 숫자는 11부터 (파일시스템의 Stack location Ranges는 서버마다 조금 다르지만 해당 서버의 경우 11부터 시작) 드라이버당 1 값이 계속 증가합니다.

그 중 \FileSystem\Mvfs 의 깊이 즉, Stack location 을 확인해 본 결과 , 이것이 16임 확인 하였습니다. 해당 시스템의 IRPStackSize 의 기본값은 15였지만 Stack size 가 한 개 더 Over되어있기 때문에 Event 2011이 계속 발생을 하였습니다.

 

참고로 위의 Range 에서처럼 irpstacksize 50까지는 증가가 가능하지만, 그 만큼 Buffer 에 대한 메모리가 소모되기 때문에 너무 높게 올리지 않으실 것을 권장합니다

 

1: kd> !devstack 8af0b718

!DevObj !DrvObj !DevExt ObjectName

88a01ec8 \FileSystem\Mvfs 88a01f80

8ab90cf8 \Driver\AhnFlt2K 8ab90db0

8aaac9a8 \Driver\drveng 8aaaca60

88dae3c0 \FileSystem\symsnap88dae478

89e3f898 \FileSystem\FltMgr 89e3f950

> 8af0b718 \FileSystem\Ntfs 8af0b7d0

 

가장 상위의 mvcs stack size를 확인하여 Default 값이 15보다 큰 것을 확인 하였습니다.

1: kd> dt _device_object 88a01ec8 stacksize

nt!_DEVICE_OBJECT

+0x030 StackSize : 16 ''

----------------------------------------------------------------------------------------------------------------------------------

lkd> !driveinfo d:

Drive d:, DriveObject e14706a0

   Directory Object: e1002988  Name: D:

        Target String is '\Device\HarddiskVolume3'

        Drive Letter Index is 4 (D:)

    Volume DevObj: a50d54b8

    Vpb: a50d5430  DeviceObject: a4575718

    FileSystem: \FileSystem\Ntfs

Cannot get  ntfs!VOLUME_DEVICE_OBJECT.Vcb @ a4575718

lkd> !devstack a4575718

  !DevObj   !DrvObj            !DevExt   ObjectName

  a2bcfd00  \FileSystem\FltMgr a2bcfdb8 

  a33f0168  \FileSystem\Mvfs   a33f0220 

  a353e7d0  \Driver\AhnFlt2K   a353e888 

  a4364a38  \Driver\drveng     a4364af0 

  a49207c0  \FileSystem\symsnapa4920878 

  a436da00  \FileSystem\FltMgr a436dab8 

> a4575718  \FileSystem\Ntfs   a45757d0 

lkd> dt_device_object a2bcfd00 stacksize

nt!_DEVICE_OBJECT

   +0x030 StackSize : 19 ''

lkd> dt_device_object a33f0168 stacksize

nt!_DEVICE_OBJECT

   +0x030 StackSize : 18 ''

_________________________________________________________________________________________________________________________________

아래 그림은 동일한 오류가 발생한 다른 시스템입니다. 이 시스템의 경우 DeviceTree라는 프로그램을 이용해서 실제 머신의 파일 시스템에 Atteched 된 필터 드라이버들을 확인 한 것입니다. Drveng 드라이버의 stacksize가 16임을 확인 할 수 있습니다.





 

DeviceTree
http://www.osronline.com/article.cfm?article=97


해당 툴은 MS에서 제공하는 공식 툴은 아닙니다. 실제 서버에서 사용 전 반드시 테스트 머신에서 확인 해 보시기 바랍니다.


[조치 방법]
아래 레지스트리 키로 이동하여 irpstacksize값을 늘립니다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\

레지스트리는 수정 전 반드시 백업 하시기 바랍니다^^

1. 시작을 누르고 실행을 누릅니다.
2.
regedit를 입력한 다음 확인을 누릅니다.
3.
아래 키로 이동합니다.
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Parameters
4.
오른쪽 창에서 IRPStackSize 값을 두 번 누릅니다.
    참고: IRPStackSize 값이 아직 없을 경우 다음 절차를 사용하여 값을 만듭니다.
    a.
레지스트리의 Parameters 폴더에서 오른쪽 창을 마우스 오른쪽 단추로 누릅니다.
b.
새로 만들기를 가리킨 다음 DWord 을 누릅니다.
c.
IRPStackSize를 입력합니다.
중요: 값 이름은 대/소문자를 구분하므로 표시되는 대로 "IRPStackSize"를 정확하게 입력합니다.

5.
단위를 10진수로 변경합니다.
6.
값 데이터 상자에 나열된 값보다 큰 값을 입력합니다.

4
단계에서 설명한 절차를 사용하여 IRPStackSize 값을 만든 경우 기본값은 15입니다. 값을 3씩 늘리는 것이 좋습니다. 따라서 이전 값이 11이었으면 14를 입력한 다음 확인을 누릅니다.

7.
레지스트리 편집기를 닫습니다.
8.
컴퓨터를 다시 시작합니다.

앞의 절차를 완료한 후에도 문제가 지속되면 IRPStackSize의 값을 더 크게 늘리십시오.

Windows 2000
Windows Server 2003에서 IRPStackSize 매개 변수의 기본값은 15입니다. 값의 범위는 11(16진수 값 0xb) ~ 50(16진수 값 0x32)입니다.



[참고 자료]
Windows 2000 및 Windows Server 2003 IRPStackSize 매개 변수에 대한 설명
http://support.microsoft.com/kb/285089

IRPStackSize

http://technet.microsoft.com/ko-kr/library/cc755824(WS.10).aspx

IRPStackSize and Clusters
http://blogs.technet.com/b/askcore/archive/2008/01/25/irpstacksize-and-clusters.aspx

바이러스 백신 소프트웨어로 인해 이벤트 ID 2011이 발생할 수 있다
http://support.microsoft.com/kb/177078

Error message: "Not enough server storage is available to process this command"
http://support.microsoft.com/kb/106167/en-us


감사합니다.^^