일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- paged pool
- 인문고전
- Local TempDB
- Windows Server 2016 Hyper-v Cluster
- SQL Server 2012R2 FCI
- windows update
- 클러스터
- Nested VM
- Hyper-V
- LiveKD
- FTP7.5
- dsquery
- MSCS on VMWare
- windbg
- cluster node as Domain controller
- Session space
- windows debugging tool
- failover cluster
- Windows Server 2008
- windows media service
- 프로세스 CPU 사용량
- nonpaged pool
- 안철수
- Windows Server 2016
- SQL Server 2008
- 터키여행
- ftp7.5 장애조치 클러스터
- iSCSI target
- Xperf
- 작업관리자
- Today
- Total
류짱:Beyond MySelf
IRP(I/O 요청 패킷) / irpstacksize / Event id 2011 /DeviceTree 본문
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
감사합니다.^^