메모리 관련 리소스 부족으로 Windows 행 현상이 발생할 수 있는 경우는 여러 가지가 있습니다. blogCommitted page Commit limit에 도달하여 Windows 행 현상이 발생한 사례입니다. 아래는 시스템 행이 발생한 Windows 서버의 행 메모리 덤프에서 !vm을 실행한 결과입니다.

 

3: kd> !vm

 

*** Virtual Memory Usage ***

           Physical Memory:      851259 (   3405036 Kb)

           Page File: \??\C:\pagefile.sys

             Current:   4193280 Kb  Free Space:         0 Kb

             Minimum:   4193280 Kb  Maximum:      4193280 Kb

           Available Pages:       21762 (     87048 Kb)

           ResAvail Pages:       804189 (   3216756 Kb)

           Locked IO Pages:           0 (         0 Kb)

           Free System PTEs:     361267 (   1445068 Kb)

 

           ******* 190 system cache map requests have failed ******

 

           Modified Pages:       688784 (   2755136 Kb)

           Modified PF Pages:    688782 (   2755128 Kb)

           NonPagedPool Usage:    18735 (     74940 Kb)

           NonPagedPool Max:     522360 (   2089440 Kb)

           PagedPool 0 Usage:     10809 (     43236 Kb)

           PagedPool 1 Usage:      4678 (     18712 Kb)

           PagedPool 2 Usage:      1292 (      5168 Kb)

           PagedPool 3 Usage:      1178 (      4712 Kb)

           PagedPool 4 Usage:      1299 (      5196 Kb)

           PagedPool Usage:       19256 (     77024 Kb)

           PagedPool Maximum:    523264 (   2093056 Kb)

 

           ********** 18414 pool allocations have failed **********

 

           Session Commit:         6078 (     24312 Kb)

           Shared Commit:       1684402 (   6737608 Kb)

           Special Pool:              0 (         0 Kb)

           Shared Process:         3891 (     15564 Kb)

           PagedPool Commit:      19320 (     77280 Kb)

           Driver Commit:         12323 (     49292 Kb)

           Committed pages:     1883592 (   7534368 Kb)   => 7.5G

           Commit limit:        1882974 (   7531896 Kb)   => 7.5G

 

           ********** Number of committed pages is near limit ********

 

           ********** 106828 commit requests have failed  **********

 

Committed page란 가상 메모리의 backing store , RAM이나 paging file에 맵핑된 page를 의미합니다. 전체 Committed pages Commit limit 에 도달하였다는 것은 거의 대부분의 RAM paging file이 모두 사용되었음을 의미합니다. 실제 위 !vm 의 실행 결과를 보면 page file free space zero 입니다.

 

이 사례의 Committed pages가 다 소모된 원인은 특정 프로세스에서 SECTION OBJECT (File Mapping Object) leak을 유발했기 때문이었습니다. 해당 문제를 유발한 프로세스가 현재 소유하고 있는 커널 Handle은 무려 11만개 이상이었으며, 대부분이 SECTION Object에 의한 handle이었습니다.

SECTION OBJECT (File Mapping Object)는 응용 프로그램에서 MMF(Memory Mapped File)등을 이용했을 때 사용되는 커널 구조체입니다.

 

PROCESS 881ff198  SessionId: 0  Cid: 0494    Peb: 7ffd9000  ParentCid: 02a4

    DirBase: 74624000  ObjectTable: 98a813f8  HandleCount: 118767.

    Image: ******.exe

 

3: kd> !handle

processor number 3, process 881ff198

PROCESS 881ff198  SessionId: 0  Cid: 0494    Peb: 7ffd9000  ParentCid: 02a4

    DirBase: 74624000  ObjectTable: 98a813f8  HandleCount: 118767.

    Image: ******..exe

 

.

1538: Object: 891d4a50  GrantedAccess: 000f0007 Entry: 893c0a70

Object: 891d4a50  Type: (854314d0) Section

    ObjectHeader: 891d4a38 (old version)

        HandleCount: 1  PointerCount: 1

 

153c: Object: 893a3688  GrantedAccess: 000f0007 Entry: 893c0a78

Object: 893a3688  Type: (854314d0) Section

    ObjectHeader: 893a3670 (old version)

        HandleCount: 1  PointerCount: 1