Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

듀얼 채널 메모리 정렬을 지키지 않은 컴퓨터의 Windows 비정상 종료 현상(Blue Screen)

이상하군요, 메모리를 128GB로 올렸는데 블루 스크린이 1주일에 서너 번씩 발생하기 시작했습니다. 그런 탓에 (내심 Radeon 그래픽 카드를 의심한 탓에 ^^;) 그래픽 카드를 GeForce로 바꾸기까지 했지만, ^^; 그 현상은 없어지지 않았습니다.

재미있는 건, WinDbg로 메모리 덤프를 분석했을 때,

1: kd> !analyze -v
Loading Kernel Symbols
...[생략]...
Loading User Symbols
PEB is paged out (Peb.Ldr = 000000eb`bdb53018).  Type ".hh dbgerr001" for details
Loading unloaded module list
...[생략]...

DPC_WATCHDOG_VIOLATION (133)
The DPC watchdog detected a prolonged run time at an IRQL of DISPATCH_LEVEL
or above.
Arguments:
Arg1: 0000000000000001, The system cumulatively spent an extended period of time at
    DISPATCH_LEVEL or above.
Arg2: 0000000000001e00, The watchdog period (in ticks).
Arg3: fffff80449f1c340, cast to nt!DPC_WATCHDOG_GLOBAL_TRIAGE_BLOCK, which contains
    additional information regarding the cumulative timeout
Arg4: 0000000000000000

...[생략]...

KEY_VALUES_STRING: 1

    ...[생략]...

BUGCHECK_CODE:  133

BUGCHECK_P1: 1

BUGCHECK_P2: 1e00

BUGCHECK_P3: fffff80449f1c340

BUGCHECK_P4: 0

FILE_IN_CAB:  MEMORY.DMP

DUMP_FILE_ATTRIBUTES: 0x1800

FAULTING_THREAD:  ffff850df7a1f080

DPC_TIMEOUT_TYPE:  DPC_QUEUE_EXECUTION_TIMEOUT_EXCEEDED

TRAP_FRAME:  fffff48a2453ede0 -- (.trap 0xfffff48a2453ede0)
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=0000000000000000 rbx=0000000000000000 rcx=ffff850d00000000
rdx=0000000000000000 rsi=0000000000000000 rdi=0000000000000000
rip=fffff8044962614f rsp=fffff48a2453ef70 rbp=fffff48a2453eff0
 r8=ffff850d00000000  r9=fffff48a2453f4b0 r10=ffff850dcd9be180
r11=fffff48a2453ff18 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0         nv up ei pl nz na po nc
nt!KiPageFault+0x34f:
fffff804`4962614f 0fbaa5f800000009 bt      dword ptr [rbp+0F8h],9 ss:0018:fffff48a`2453f0e8=00050286
Resetting default scope

...[생략]...

PROCESS_NAME:  svchost.exe

STACK_TEXT:  
ffffbc00`e8632c88 fffff804`49437a19     : 00000000`00000133 00000000`00000001 00000000`00001e00 fffff804`49f1c340 : nt!KeBugCheckEx
ffffbc00`e8632c90 fffff804`49437281     : 00034590`38a0710d ffffbc00`e8618180 00000000`016cad66 00000000`00000000 : nt!KeAccumulateTicks+0x239
ffffbc00`e8632cf0 fffff804`49435311     : 00000000`00000000 ffffbc00`e9565800 ffffbc00`e8618180 00000000`00000000 : nt!KiUpdateRunTime+0xd1
ffffbc00`e8632ea0 fffff804`49434d3a     : fffff804`49e5fea0 ffffbc00`e9565830 ffffbc00`e9565830 00000000`00000002 : nt!KeClockInterruptNotify+0xc1
ffffbc00`e8632f40 fffff804`49515f8c     : 00000365`9710cacd ffff850d`c5514480 ffff850d`c5514530 00000000`00000000 : nt!HalpTimerClockInterrupt+0x10a
ffffbc00`e8632f70 fffff804`4961711a     : fffff48a`2453ee60 ffff850d`c5514480 fffff48a`2453f1e8 00000000`00000000 : nt!KiCallInterruptServiceRoutine+0x9c
ffffbc00`e8632fb0 fffff804`496179e7     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiInterruptSubDispatchNoLockNoEtw+0xfa
fffff48a`2453ede0 fffff804`4962614f     : ffff850d`cd9be180 00000000`00000050 00000000`00000002 00000000`00000000 : nt!KiInterruptDispatchNoLockNoEtw+0x37
fffff48a`2453ef70 fffff804`4961f387     : ffff850d`cd9be180 fffff804`494e3261 ffff850e`051df490 ffff850e`0639e070 : nt!KiPageFault+0x34f
fffff48a`2453f100 fffff804`494e3261     : ffff850e`051df490 ffff850e`0639e070 fffff48a`2453f170 00000000`00000000 : nt!ExpInterlockedPopEntrySListFault
fffff48a`2453f110 fffff804`4dd94e71     : 00000000`00001002 fffff48a`2453f7e8 fffff48a`2453f261 fffff804`4db6892a : nt!ExAllocateFromLookasideListEx+0x11
fffff48a`2453f150 fffff804`4dd928f4     : 00000000`00000017 ffff850d`e5fd1cc0 fffff48a`2400ff02 ffff850e`2700ff02 : tcpip!WfpAllocateFromPerProcessorLookasideList+0x39
fffff48a`2453f180 fffff804`4dd91b5a     : badbadfa`badbadfa 00000000`91870032 badbadfa`badbadfa ffff850d`cd973aa0 : tcpip!WfpAleInsertRemoteEndpoint+0x97c
fffff48a`2453f650 fffff804`4dd90be0     : ffff850d`e53b20f0 fffff804`4df22bd2 fffff804`5c131c00 00000000`00000000 : tcpip!WfpAlepAuthorizeSend+0xab2
fffff48a`2453fab0 fffff804`4dd6276c     : fffff48a`2453fdd8 ffff850d`ce862000 ffff850d`00000004 00000000`00000000 : tcpip!WfpAleAuthorizeSend+0x3c4
fffff48a`2453fe60 fffff804`4dd9c758     : 00000000`00000000 00000000`00000180 00000000`00000001 ffff850d`f0e067c0 : tcpip!ProcessALEForTransportPacket+0x82c
fffff48a`245400d0 fffff804`4dd7e67d     : 00000000`00040246 fffff804`4948e36c ffffbc00`e9051180 ffffbc00`e9051180 : tcpip!WfpProcessOutTransportStackIndication+0x3c8
fffff48a`245403f0 fffff804`4dd7d367     : fffff804`4df4e000 00000000`00000000 00000000`00000000 00000000`00000000 : tcpip!IppInspectLocalDatagramsOut+0x85d
fffff48a`24540740 fffff804`4dd78e66     : ffff850d`e53b2000 00000000`00000000 fffff804`4df4e000 ffff850d`fa27acc0 : tcpip!IppSendDatagramsCommon+0x407
fffff48a`24540900 fffff804`4dd777fa     : ffff850d`ceb86400 00000000`00000000 ffff850e`211e72e8 fffff804`00000000 : tcpip!UdpSendMessagesOnPath+0x10e6
fffff48a`24540d20 fffff804`4dd77505     : fffff48a`245411f0 ffff850e`211e72d0 fffff48a`245411f0 fffff48a`24541b01 : tcpip!UdpSendMessages+0x2da
fffff48a`245410e0 fffff804`49480aba     : 00000000`00000000 ffff850e`211e7280 00000000`00000000 ffff850d`c54549f0 : tcpip!UdpTlProviderSendMessagesCalloutRoutine+0x15
fffff48a`24541110 fffff804`49480a2d     : fffff804`4dd774f0 fffff48a`245411f0 00000000`00000000 00000000`00000000 : nt!KeExpandKernelStackAndCalloutInternal+0x7a
fffff48a`24541180 fffff804`4ddbab1a     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KeExpandKernelStackAndCalloutEx+0x1d
fffff48a`245411c0 fffff804`4ef79728     : 00000000`00000000 fffff48a`24541b60 ffff850d`fea2dd80 fffff48a`24541b60 : tcpip!UdpTlProviderSendMessages+0x7a
fffff48a`24541230 fffff804`4ef78fa7     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : afd!AfdFastDatagramSend+0x708
fffff48a`24541470 fffff804`498c72ae     : fffff48a`00000000 00000000`00000000 fffff48a`24541b60 ffffffff`f6769800 : afd!AfdFastIoDeviceControl+0x1857
fffff48a`24541810 fffff804`498c6e36     : 00000000`000000d6 00000000`00000000 00000000`00000000 00000000`00000000 : nt!IopXxxControlFile+0x45e
fffff48a`24541a00 fffff804`4962a508     : 00000000`000002dc 00000000`ffffffff 00000000`00003e80 00000000`000006e8 : nt!NtDeviceIoControlFile+0x56
fffff48a`24541a70 00007ffb`87570484     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x28
000000eb`be27f2b8 00000000`00000000     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007ffb`87570484
...[생략]...

딱히 3rd-party 드라이버가 문제를 일으킨 것 같지는 않다는 점입니다. 위의 경우에는 그 한 사례를 든 것인데요, 저때는 tcpip.sys에서 발생한 듯 보이지만 그다음 발생한 덤프에서의 분석은 매번 다른 지점에서, 즉 아무런 연관을 찾을 수가 없었습니다.




대부분의 경우에는 "PAGE_FAULT_IN_NONPAGED_AREA" 오류가 발생했는데요, 그러다 문든 생각난 것이, 메모리를 기존 2개에서 추가로 2개를 더 장착하면서 이 현상이 더 뚜렸했었고 왠지 메모리 뱅크 정렬이 안 된 것 같다는 점이었습니다. 64GB일 때의 메모리가 2개 연속 장착돼 있었는데 사실 듀얼 채널이라면 한 칸을 건너 뛰는 식으로 장착돼 있었어야 합니다. 단지, 제가 컴퓨터 조립을 해 본지 오래돼서 근래에는 듀얼 채널의 구조가 이런 식으로 바뀌었나 싶어 무시하고 추가로 2개를 남은 슬롯에 더 장착했던 건데요, 그래서 확인을 위해 해당 메인 보드의 매뉴얼을 봤더니,

TUF GAMING B550M-PLUS (WI-FI) User’s Manual ( English Edition )
; https://dlcdnets.asus.com/pub/ASUS/mb/SocketAM4/TUF_GAMING_B550M-PLUS_(WI-FI)/E17266_TUF_GAMING_B550M-PLUS_WI-FI_UM_v2_WEB.pdf?model=TUF%20GAMING%20B550M-PLUS%20(WI-FI)

원래의 (한 칸 띄고 장착하는) 듀얼 채널 방식이 맞았습니다.

DDR4 DIMM_A1 (64bit, 288-pin module) == B1과 쌍으로 듀얼 채널
DDR4 DIMM_A2 (64bit, 288-pin module) == B2와 쌍으로 듀얼 채널
DDR4 DIMM_B1 (64bit, 288-pin module) 
DDR4 DIMM_B2 (64bit, 288-pin module)

그러니까, (A1, B1), (A2, B2)의 쌍으로 다루는 듀얼 채널의 구조에서 기존 A1, A2에 연속으로 장착됐던 64GB 메모리 상태는 성능 향상의 장점을 누리지 못했던 것이고, 그런 상태에서 다음과 같은 식으로 추가 장착했으니,

DDR4 DIMM_A1 (64bit, 288-pin module) - 기존 RAM (B1의 다른 메모리와 듀얼 채널)
DDR4 DIMM_A2 (64bit, 288-pin module) - 기존 RAM (B2의 다른 메모리와 듀얼 채널)

DDR4 DIMM_B1 (64bit, 288-pin module) - 신규 RAM
DDR4 DIMM_B2 (64bit, 288-pin module) - 신규 RAM

미세하게 다른 메모리 규격으로 인해 블루 스크린이 (무작위로) 발생한 것입니다. 결국, 다음과 같이 메모리 장착을 바꿨고,

DDR4 DIMM_A1 (64bit, 288-pin module) - 기존 RAM
DDR4 DIMM_A2 (64bit, 288-pin module) - 신규 RAM

DDR4 DIMM_B1 (64bit, 288-pin module) - 기존 RAM
DDR4 DIMM_B2 (64bit, 288-pin module) - 신규 RAM

이후부터 (거의 6개월 넘게) 정말 블루 스크린이 발생하지 않게 되었습니다. ^^;




참고로, 기존/신규 RAM 모두 삼성이었고 라벨에 적힌 정보까지도 동일했지만 생산지가 달랐습니다.

기존 RAM: 32GB 2Rx8 PC4-3200AA-UB2-11 (Made in Korea) M378A4G43AB2-CWE
          SEC 031 K4AAG08 5WA BCWE

신규 RAM: 32GB 2Rx8 PC4-3200AA-UB2-11 (Made in China) M378A4G43AB2-CWE
          SEC 313 K4AAG08 5WA BCWE

저 정도의 아주 미세한 차이인데도 듀얼 채널에서 블루 스크린이 뜰 정도라면, 듀얼 채널의 메모리 접근 동기화가 꽤나 높은 수준의 정확성을 요구하는 것 같습니다. ^^;

기왕 이야기가 나온 김에, 블루 스크린과 관련한 사례로 아래의 경우도 재미있습니다. ^^

Janet Jackson had the power to crash laptop computers
; https://devblogs.microsoft.com/oldnewthing/20220816-00/?p=106994

Janet Jackson had the power to crash laptop computers, follow-up
; https://devblogs.microsoft.com/oldnewthing/20220920-00/?p=107201

This Janet Jackson BASSLINE breaks laptops
; https://youtu.be/-y3RGeaxksY

특정 제조사의 랩탑 모델에서 Janet Jackson의 "Rhythm Nation" 음악을 재생하면 비정상 종료한다는 이야기입니다. 조사 과정에서 그 노래의 뮤직 비디오를 재생해도 동일한 현상이 발생한다는 것과, 심지어 그 노래를 재생하지 않은 랩탑조차도 그 음악을 재생하고 있는 랩탑 근처에만 있으면 비정상 종료한다는 점이 발견됩니다.

원인은, 해당 랩탑에 탑재된 5400 RPM 하드 디스크의 회전에서 발생한 진동과 겹치는 주파수가 그 음악에서 발생했기 때문이라고 합니다.(주파수가 공명하면서, 즉 공진으로 인해 그 세기가 강해져 아마도 하드 디스크의 헤드가 오작동하지 않았나 싶습니다.) 해결은, 랩탑 제조업체가 그 주파수에 해당하는 음이 나오면 제거하도록 audio 파이프라인에 사용자 정의 필터를 추가했다고. ^^;

시간이 지나, Windows 7에서는 APO(Audio Processing Objects) 정책에 모든 오디오 필터를 비활성화시킬 수 있는 새로운 규칙을 제공했는데요,

Protecting Windows users from Janet Jackson’s Rhythm Nation
; https://devblogs.microsoft.com/oldnewthing/20250429-42/?p=111127

문제는 "Rhythm Nation" 등의 오작동을 해결하는 오디오 필터까지 그 규칙의 대상에 포함시켰다는 점입니다. 이로 인해, 그런 하드웨어적인 문제를 모르는 사용자들은 음악에서 제공하는 풍부한 사운드를 즐기기 위해 "모든 오디오 필터를 비활성화"하는 선택을 무심코 할 수 있는 가능성이 열려버린 것입니다.

이러한 문제가 인정돼 마이크로소프트 측은 "제조사의 특별한 오디오 필터"는 "모든 오디오 필터"의 범위로부터는 제외했다고 합니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 5/3/2025]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  127  128  129  130  [131]  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
1780정성태10/15/201424249오류 유형: 249. The application-specific permission settings do not grant Local Activation permission for the COM Server application with CLSID
1779정성태10/15/201419763오류 유형: 248. Active Directory에서 OU가 지워지지 않는 경우
1778정성태10/10/201418230오류 유형: 247. The Netlogon service could not create server share C:\Windows\SYSVOL\sysvol\[도메인명]\SCRIPTS.
1777정성태10/10/201421330오류 유형: 246. The processing of Group Policy failed. Windows attempted to read the file \\[도메인]\sysvol\[도메인]\Policies\{...GUID...}\gpt.ini
1776정성태10/10/201418344오류 유형: 245. 이벤트 로그 - Name resolution for the name _ldap._tcp.dc._msdcs.[도메인명]. timed out after none of the configured DNS servers responded.
1775정성태10/9/201419461오류 유형: 244. Visual Studio 디버깅 (2) - Unable to break execution. This process is not currently executing the type of code that you selected to debug.
1774정성태10/9/201426657개발 환경 구성: 246. IIS 작업자 프로세스의 20분 자동 재생(Recycle)을 끄는 방법
1773정성태10/8/201429823.NET Framework: 471. 웹 브라우저로 다운로드가 되는 파일을 왜 C# 코드로 하면 안되는 걸까요? [1]
1772정성태10/3/201418616.NET Framework: 470. C# 3.0의 기본 인자(default parameter)가 .NET 1.1/2.0에서도 실행될까? [3]
1771정성태10/2/201428120개발 환경 구성: 245. 실행된 프로세스(EXE)의 명령행 인자를 확인하고 싶다면 - Sysmon [4]
1770정성태10/2/201421719개발 환경 구성: 244. 매크로 정의를 이용해 파일 하나로 C++과 C#에서 공유하는 방법 [1]파일 다운로드1
1769정성태10/1/201424140개발 환경 구성: 243. Scala 개발 환경 구성(JVM, 닷넷) [1]
1768정성태10/1/201419560개발 환경 구성: 242. 배치 파일에서 Thread.Sleep 효과를 주는 방법 [5]
1767정성태10/1/201424675VS.NET IDE: 94. Visual Studio 2012/2013에서의 매크로 구현 - Visual Commander [2]
1766정성태10/1/201422523개발 환경 구성: 241. 책 "프로그래밍 클로저: Lisp"을 읽고 나서. [1]
1765정성태9/30/201426066.NET Framework: 469. Unity3d에서 transform을 변수에 할당해 사용하는 특별한 이유가 있을까요?
1764정성태9/30/201422313오류 유형: 243. 파일 삭제가 안 되는 경우 - The action can't be comleted because the file is open in System
1763정성태9/30/201423881.NET Framework: 468. PDB 파일을 연동해 소스 코드 라인 정보를 알아내는 방법파일 다운로드1
1762정성태9/30/201424564.NET Framework: 467. 닷넷에서 EIP/RIP 레지스터 값을 구하는 방법 [1]파일 다운로드1
1761정성태9/29/201421626.NET Framework: 466. 윈도우 운영체제의 보안 그룹 이름 및 설명 문자열을 바꾸는 방법파일 다운로드1
1760정성태9/28/201419909.NET Framework: 465. ICorProfilerInfo::GetILToNativeMapping 메서드가 0x80131358을 반환하는 경우
1759정성태9/27/201431016개발 환경 구성: 240. Visual C++ / x64 환경에서 inline-assembly를 매크로 어셈블리로 대체하는 방법파일 다운로드1
1758정성태9/23/201437905개발 환경 구성: 239. 원격 데스크톱 접속(RDP)을 기존의 콘솔 모드처럼 사용하는 방법 [1]
1757정성태9/23/201418461오류 유형: 242. Lync로 모임 참여 시 소리만 들리지 않는 경우 - 두 번째 이야기
1756정성태9/23/201427483기타: 48. NVidia 제품의 과다한 디스크 사용 [2]
1755정성태9/22/201434275오류 유형: 241. Unity Web Player를 설치해도 여전히 설치하라는 화면이 나오는 경우 [4]
... 121  122  123  124  125  126  127  128  129  130  [131]  132  133  134  135  ...