Linux에서 ENA 커널 드라이버 문제 해결
Linux에서 ENA 커널 드라이버 문제 해결 (Troubleshoot the ENA kernel driver on Linux)
ENA(Elastic Network Adapter)는 운영 체제 상태를 개선하고 예상치 못한 하드웨어 동작이나 장애로 인한 장기 중단 가능성을 줄이도록 설계됐어요. ENA 아키텍처는 장치·드라이버 장애를 시스템에 가능한 한 투명하게 유지해요.
출처: 문서
본문
인스턴스에 연결할 수 없다면 "Troubleshoot connectivity issues" 섹션부터 시작하세요. 6세대 인스턴스 유형으로 마이그레이션한 후 성능 저하가 발생하면 "6세대 인스턴스로 마이그레이션하기 전에 해야 할 일" 관련 문서를 참고하세요.
연결할 수 있다면 이 주제의 후반부에서 다루는 장애 감지·복구 메커니즘으로 진단 정보를 수집할 수 있어요.
연결 문제 해결
개선된 네트워킹을 활성화하면서 연결이 끊기면 ena 모듈이 인스턴스의 현재 실행 커널과 호환되지 않을 수 있어요. 특정 커널 버전용 모듈을 설치하고(dkms 없이, 또는 잘못 구성된 dkms.conf 파일로) 인스턴스 커널이 업데이트된 경우 이런 일이 발생할 수 있어요. 부팅 시 로드된 인스턴스 커널에 ena 모듈이 제대로 설치되어 있지 않으면 인스턴스가 네트워크 어댑터를 인식하지 못해 인스턴스에 연결할 수 없게 돼요.
PV 인스턴스나 AMI에 대해 개선된 네트워킹을 활성화해도 인스턴스에 연결할 수 없게 될 수 있어요. ENA로 개선된 네트워킹을 활성화한 후 인스턴스에 연결할 수 없으면 인스턴스의 enaSupport 속성을 비활성화해 스톡 네트워크 어댑터로 폴백할 수 있어요.
ENA로 개선된 네트워킹 비활성화(EBS 지원 인스턴스):
- 로컬 컴퓨터에서 Amazon EC2 콘솔,
stop-instances명령(AWS CLI), 또는Stop-EC2Instancecmdlet(AWS Tools for PowerShell)으로 인스턴스를 중지해요. modify-instance-attribute명령(또는Edit-EC2InstanceAttributecmdlet)으로--no-ena-support옵션을 사용해 개선된 네트워킹 속성을 비활성화해요.- 인스턴스를 시작해요.
- (선택) 인스턴스에 연결해 현재 커널 버전으로
ena모듈을 재설치해요.
ENA로 개선된 네트워킹 비활성화(instance store 지원 인스턴스):
- Amazon S3 기반 AMI를 만드는 방식으로 새 AMI를 만들어요.
- AMI를 등록할 때
--no-ena-support옵션(또는-EnaSupport $false파라미터)을 포함시켜요.
Keep-alive 메커니즘
ENA 장치는 고정 속도(보통 1초마다)로 keep-alive 이벤트를 게시해요. ENA 드라이버는 이 keep-alive 메시지의 존재를 확인하는 watchdog 메커니즘을 구현해요. 메시지가 있으면 watchdog이 재무장(재설정)되고, 없으면 드라이버가 장치 장애가 발생했다고 결론 내리고 다음을 수행해요.
- 현재 통계를 syslog로 덤프
- ENA 장치 재설정
- ENA 드라이버 상태 재설정
위 재설정 절차로 인해 짧은 시간 동안 일부 트래픽 손실이 발생할 수 있지만(TCP 연결은 복구할 수 있어야 함), 그 외에는 사용자에게 영향을 주지 않아야 해요. ENA 장치는 복구 불가능한 구성을 로드한 후 알 수 없는 상태에 도달하면 keep-alive 알림을 보내지 않아 간접적으로 장치 재설정 절차를 요청할 수도 있어요.
다음은 재설정 절차의 예시예요.
[18509.800135] ena 0000:00:07.0 eth1: Keep alive watchdog timeout. // watchdog 프로세스가 재설정 시작
[18509.815244] ena 0000:00:07.0 eth1: Trigger reset is on
[18509.825589] ena 0000:00:07.0 eth1: tx_timeout: 0 // 드라이버가 현재 통계 로깅
[18509.834253] ena 0000:00:07.0 eth1: io_suspend: 0
[18509.842674] ena 0000:00:07.0 eth1: io_resume: 0
[18509.850275] ena 0000:00:07.0 eth1: wd_expired: 1
[18509.857855] ena 0000:00:07.0 eth1: interface_up: 1
[18509.865415] ena 0000:00:07.0 eth1: interface_down: 0
[18509.873468] ena 0000:00:07.0 eth1: admin_q_pause: 0
........
[18511.280972] ena 0000:00:07.0 eth1: free uncompleted tx skb qid 3 idx 0x7 // down 프로세스 종료 시 드라이버가 완료되지 않은 패킷 폐기
[18511.420112] [ENA_COM: ena_com_validate_version] ena device version: 0.10 // 드라이버 up 프로세스 시작
[18511.420119] [ENA_COM: ena_com_validate_version] ena controller version: 0.0.1 implementation version 1
[18512.252108] ena 0000:00:07.0: Device watchdog is Enabled
[18512.772641] [ENA_COM: ena_com_set_hash_function] Feature 10 isn't supported
[18512.772647] [ENA_COM: ena_com_set_hash_ctrl] Feature 18 isn't supported
[18512.775945] ena 0000:00:07.0: Device reset completed successfully // 재설정 완료
Register read timeout
ENA 아키텍처는 메모리 매핑 I/O(MMIO) 읽기 작업의 제한적 사용을 제안해요. MMIO 레지스터는 ENA 장치 드라이버가 초기화 절차 중에만 접근해요.
드라이버가 로그(dmesg 출력에서 확인 가능)에 읽기 작업 실패를 기록하면 호환되지 않거나 잘못 컴파일된 드라이버, 바쁜 하드웨어 장치, 또는 하드웨어 장애 때문일 수 있어요. 간헐적 읽기 실패 로그는 문제로 보지 않아요. 드라이버가 재시도하기 때문이에요. 다만 읽기 실패를 포함하는 로그 항목의 연속된 시퀀스는 드라이버나 하드웨어 문제를 나타내요.
타임아웃으로 인한 읽기 작업 실패를 나타내는 드라이버 로그 예시:
[ 47.113698] [ENA_COM: ena_com_reg_bar_read32] reading reg failed for timeout. expected: req id[1] offset[88] actual: req id[57006] offset[0]
[ 47.333715] [ENA_COM: ena_com_reg_bar_read32] reading reg failed for timeout. expected: req id[2] offset[8] actual: req id[57007] offset[0]
[ 47.346221] [ENA_COM: ena_com_dev_reset] Reg read32 timeout occurred
통계 (Statistics)
네트워크 성능 부족이나 지연 문제가 있으면 장치 통계를 검색해 검토해야 해요. 이러한 통계는 ethtool로 얻을 수 있어요.
[ec2-user ~]$ ethtool -S ethN
NIC statistics:
tx_timeout: 0
suspend: 0
resume: 0
wd_expired: 0
interface_up: 1
interface_down: 0
admin_q_pause: 0
bw_in_allowance_exceeded: 0
bw_out_allowance_exceeded: 0
pps_allowance_exceeded: 0
conntrack_allowance_available: 450878
conntrack_allowance_exceeded: 0
linklocal_allowance_exceeded: 0
queue_0_tx_cnt: 4329
queue_0_tx_bytes: 1075749
queue_0_tx_queue_stop: 0
...
주요 출력 파라미터 설명:
tx_timeout– Netdev watchdog가 활성화된 횟수suspend/resume– 드라이버가 suspend/resume 작업을 수행한 횟수wd_expired– 드라이버가 지난 3초 동안 keep-alive 이벤트를 받지 못한 횟수interface_up/interface_down– ENA 인터페이스가 올라온/내려간 횟수admin_q_pause– admin 큐가 실행 상태로 발견되지 않은 횟수bw_in_allowance_exceeded– 인바운드 총 대역폭이 인스턴스 최대치를 초과해 큐잉되거나 드롭된 패킷 수bw_out_allowance_exceeded– 아웃바운드 총 대역폭이 최대치를 초과해 큐잉되거나 드롭된 패킷 수pps_allowance_exceeded– 양방향 PPS가 인스턴스 최대치를 초과해 큐잉되거나 드롭된 패킷 수conntrack_allowance_available– 해당 인스턴스 유형의 Connections Tracked 허용량에 도달하기 전에 인스턴스가 수립할 수 있는 추적된 연결 수. Nitro 기반 인스턴스에서만 사용 가능하고 FreeBSD 인스턴스나 DPDK 환경에서는 지원되지 않아요.conntrack_allowance_exceeded– 연결 추적이 인스턴스 최대치를 초과해 새 연결을 수립할 수 없어 드롭된 패킷 수linklocal_allowance_exceeded– 로컬 프록시 서비스로의 트래픽 PPS가 네트워크 인터페이스 최대치를 초과해 드롭된 패킷 수. Amazon DNS 서비스, Instance Metadata Service, Amazon Time Sync Service로의 트래픽에 영향을 주지만 사용자 지정 DNS 리졸버로의 트래픽에는 영향이 없어요.queue_N_tx_cnt/queue_N_tx_bytes/queue_N_tx_queue_stop– 이 큐의 전송 패킷 수 / 전송 바이트 수 / 큐가 가득 차 중지된 횟수queue_N_rx_cnt/queue_N_rx_bytes– 이 큐의 수신 패킷 수 / 수신 바이트 수.queue_N_rx_refil_partial,queue_N_rx_page_alloc_fail,queue_N_rx_skb_alloc_fail,queue_N_rx_dma_mapping_err가 0이 아니면 낮은 메모리/시스템 리소스를 나타내요.
syslog의 드라이버 오류 로그
ENA 드라이버는 시스템 부팅 중 syslog에 로그 메시지를 작성해요. 문제가 발생하면 이 로그를 검사해 오류를 찾을 수 있어요.
부팅 중 나타날 수 있는 무시해도 되는 경고:
Set host attribute isn't supported– 이 장치에 대해 host 속성이 지원되지 않음failed to alloc buffer for rx queue– 복구 가능한 오류로, 오류 발생 시 메모리 부족 문제가 있었을 수 있음Feature X isn't supported– 해당 feature가 ENA에서 지원되지 않음. X 값: 10(RSS Hash 함수 구성), 12(RSS Indirection table 구성), 18(RSS Hash Input 구성), 20(인터럽트 조절), 27(ENA 드라이버가 snmpd에서 이더넷 기능 폴링을 지원하지 않음)Failed to config AENQ/Trying to set unsupported AENQ events– AENQ 구성 관련 지원되지 않는 설정
최적이 아닌 구성 알림 (Sub-optimal configuration notifications)
ENA 장치는 변경할 수 있는 드라이버의 최적이 아닌 구성 설정을 감지해요. 장치가 ENA 드라이버에 알리고 콘솔에 경고를 로깅해요.
Sub-optimal configuration notification code: 1. Refer to AWS ENA documentation for additional details and mitigation options.
- Code 1: 넓은 LLQ 구성의 ENA Express는 권장되지 않음 – ENA Express ENI가 wide LLQ로 구성됨. ENA Express ENI를 사용할 때 wide LLQ 설정을 비활성화할 것을 권장해요.
sudo rmmod ena && sudo modprobe ena force_large_llq_header=0
- Code 2: ENA Express ENI의 최적이 아닌 Tx 큐 깊이는 권장되지 않음 – ENA Express ENI를 사용할 때 모든 Tx 큐를 네트워크 인터페이스 최대값으로 확대할 것을 권장해요. LLQ 크기를 조정하려면
ethtool -g interface로 최대 깊이를 찾고ethtool -G interface tx depth로 Tx 큐를 최대 깊이로 설정해요. - Code 3: ENA가 일반(regular) LLQ 크기이고 Tx 패킷 트래픽이 지원 최대 헤더 크기를 초과함 – 기본적으로 ENA LLQ는 최대 96바이트의 Tx 패킷 헤더 크기를 지원해요. 헤더 크기가 96바이트보다 크면 패킷이 드롭돼요. 이를 완화하려면 wide-LLQ를 활성화해 지원되는 Tx 패킷 헤더 크기를 최대 224바이트로 늘릴 것을 권장해요.
다만 wide-LLQ를 활성화하면 최대 Tx 링 크기가 1000에서 512 항목으로 줄어요. wide-LLQ는 모든 Nitro v4 이상 인스턴스 유형에서 기본적으로 활성화돼요.
- Nitro v4 인스턴스 유형은 기본 최대 wide-LLQ Tx 링 크기 512 항목을 가지며 변경할 수 없어요.
- Nitro v5 인스턴스 유형은 기본 wide-LLQ Tx 링 크기 512 항목을 가지며 최대 1000 항목까지 늘릴 수 있어요.
Cets:
ethtool -g interface
ethtool -G interface tx depth