Linux 서버를 운영하다 보면 커널 로그나 애플리케이션 로그에서 General Protection Fault, general protection fault, GPF라는 오류를 발견하는 경우가 있습니다. 이 오류는 CPU가 허용되지 않은 메모리 접근이나 잘못된 명령 실행을 감지했을 때 발생하는 예외(Exception)입니다.
General Protection Fault는 사용자 프로그램에서 발생할 수도 있고, 커널 내부에서 발생할 수도 있습니다. 커널에서 발생하는 경우에는 Kernel Oops나 Kernel Panic으로 이어질 가능성이 있으므로 즉시 원인을 분석해야 합니다.
이번 글에서는 Linux에서 General Protection Fault가 발생하는 원인과 실무에서 사용하는 분석 및 해결 방법을 자세히 알아보겠습니다.
General Protection Fault란 무엇인가?
General Protection Fault는 CPU가 잘못된 메모리 접근이나 보호 규칙 위반을 감지했을 때 발생하는 예외입니다.
대표적인 로그는 다음과 같습니다.
general protection fault: 0000 [#1] SMP
또는
BUG: general protection fault
또는
kernel BUG at mm/slab.c
이 오류는 프로그램 오류일 수도 있지만, 커널 모듈이나 하드웨어 문제일 수도 있습니다.
General Protection Fault가 발생하는 대표적인 원인
다음과 같은 상황에서 자주 발생합니다.
- NULL Pointer 접근
- 잘못된 메모리 주소 접근
- 커널 버그
- 디바이스 드라이버 오류
- 메모리(RAM) 불량
- CPU 오류
- 손상된 커널 모듈
- 오버클럭
- 파일 시스템 오류
- 오래된 BIOS 및 펌웨어
실무에서는 Call Trace와 발생한 프로세스를 먼저 확인하는 것이 중요합니다.
1. 커널 로그 확인하기
먼저 커널 로그를 확인합니다.
dmesg | grep -i "general protection"
또는
journalctl -k | grep -i "general protection"
오류 발생 시간과 CPU 번호를 함께 확인합니다.
2. Call Trace 확인하기
General Protection Fault에는 대부분 Call Trace가 포함됩니다.
dmesg | grep -A 50 "Call Trace"
또는
journalctl -k | grep -A 50 "Call Trace"
Call Trace를 통해 어떤 함수에서 오류가 발생했는지 분석합니다.
3. 오류가 발생한 프로세스 확인하기
다음과 같은 로그를 확인합니다.
CPU: 2 PID: 18453 Comm: mysqld
또는
CPU: 0 PID: 1234 Comm: nginx
Comm 항목을 보면 어떤 프로세스에서 문제가 발생했는지 알 수 있습니다.
4. 커널 버전 확인하기
현재 실행 중인 커널 버전을 확인합니다.
uname -r
설치된 커널 목록
RPM 계열
rpm -qa | grep kernel
Debian 계열
dpkg -l | grep linux-image
커널 업데이트 직후 발생했다면 커널 버그 가능성도 고려해야 합니다.
5. 메모리 상태 확인하기
메모리 오류 여부를 확인합니다.
free -h
추가로 메모리 테스트를 수행합니다.
- MemTest86+
- ECC Error 확인
- BMC/IPMI 로그 확인
메모리 오류는 GPF의 주요 원인 중 하나입니다.
6. 하드웨어 이벤트 로그 확인하기
IPMI 환경에서는 다음 명령으로 확인합니다.
ipmitool sel list
다음 항목을 확인합니다.
- ECC Error
- CPU Error
- Machine Check Exception
- Thermal Event
하드웨어 이상이 발견되면 우선적으로 조치해야 합니다.
7. 커널 모듈 확인하기
현재 로드된 커널 모듈을 확인합니다.
lsmod
특정 모듈 정보 확인
modinfo 모듈명
최근 설치한 드라이버나 서드파티 모듈이 원인일 수도 있습니다.
8. Crash Dump 분석하기
kdump가 활성화되어 있다면 Crash Dump를 확인합니다.
ls /var/crash
분석
crash vmcore
Crash Dump를 통해 오류 당시의 메모리와 CPU 상태를 분석할 수 있습니다.
9. CPU 상태 확인하기
CPU 사용률을 확인합니다.
top
또는
mpstat -P ALL 1
CPU 과부하나 특정 코어의 이상 여부를 확인합니다.
10. BIOS 및 펌웨어 확인하기
오래된 BIOS와 펌웨어는 예상하지 못한 CPU 예외를 유발할 수 있습니다.
다음 항목을 점검합니다.
- BIOS
- CPU Microcode
- RAID Firmware
- BMC Firmware
최신 안정 버전으로 유지하는 것이 좋습니다.
General Protection Fault 문제를 확인하는 순서
실무에서는 다음 순서대로 분석하는 것이 효율적입니다.
dmesg확인journalctl -k확인- Call Trace 분석
- 발생한 프로세스 확인
- 커널 버전 확인
- 메모리 검사
- 하드웨어 이벤트 로그 확인
- 커널 모듈 확인
- Crash Dump 분석
- BIOS 및 펌웨어 점검
이 순서대로 점검하면 대부분의 원인을 체계적으로 파악할 수 있습니다.
Segmentation Fault와의 차이점
| 구분 | General Protection Fault | Segmentation Fault |
|---|---|---|
| 발생 위치 | 커널 및 사용자 공간 | 주로 사용자 프로그램 |
| 원인 | CPU 보호 예외 | 잘못된 메모리 접근 |
| 영향 | 시스템 또는 프로그램 | 해당 프로세스 |
| 심각도 | 높음 | 보통 |
General Protection Fault는 시스템 전체에 영향을 줄 수 있으므로 Segmentation Fault보다 더 심각하게 다뤄야 합니다.
자주 묻는 질문
General Protection Fault가 발생하면 서버를 재부팅해야 하나요?
커널에서 발생한 경우에는 재부팅이 필요할 수 있습니다. 다만 재부팅 전에 로그와 Crash Dump를 확보하는 것이 원인 분석에 큰 도움이 됩니다.
RAM 불량도 원인이 될 수 있나요?
네. ECC 오류나 메모리 손상은 General Protection Fault를 유발하는 대표적인 원인 중 하나입니다.
애플리케이션에서도 General Protection Fault가 발생할 수 있나요?
가능합니다. 잘못된 메모리 접근이나 라이브러리 문제로 인해 사용자 프로그램에서도 GPF가 발생할 수 있습니다.
마무리
General Protection Fault는 Linux 시스템에서 CPU가 메모리 보호 규칙 위반을 감지했을 때 발생하는 중요한 예외입니다. dmesg, journalctl, Call Trace, lsmod, ipmitool, crash 등을 활용하면 원인을 효과적으로 분석할 수 있습니다. 특히 커널 모듈과 하드웨어 상태를 함께 점검하면 장애 재발을 예방하는 데 큰 도움이 됩니다.