1. 개요
- OS: Rocky Linux 8.6 / NFS v4 사용
문서중앙화 프로젝트 수행 중, 리눅스 서버가 Unity 스토리지에 NFS로 마운트하여 문서 파일들을 불러오는 구조로 인프라가 구성되어 있었다. 간략히 작성한 구성도는 아래와 같다.

HTTP 서비스의 경우에는 L4에서 Active-Active로 로드밸런싱되며 (Hash) DB 이중화의 경우 서버에 설치된 이중화 솔루션을 통해 Active-Passive로 이중화되어 있는 구조다.
1-1) 장애 증상
간헐적이고 불규칙적으로 30분 ~ 4시간동안 사용자의 문서 열기는 문제가 없으나 (Read) 문서를 저장할 때 (Write) 몇 분 정도의 긴 시간이 소요
1-2) 장애 발생 시간 및 대상
6건의 장애 발생 시간을 모두 분석한 결과 겹치는 시간대는 아예 없었으며, 심지어 업무 종료 이후 시간에도 발생하였다.
해당 증상은 운영서버#1에서 발생하기도 하고, 운영서버#2에서 발생하기도 하고, 동시에 발생하기도 했다.
1-3) 분석 내용
네트워크의 경우 전체적인 CPU 사용량, 메모리 사용량, 그리고 실시간 트래픽 사용량과 인터페이스 Duplex등의 상태 등 모두를 분석해보았을 때 트래픽이 많은 시간대는 아니었다. 그리고 Ping Loss 또는 지연시간이 밀리는 증상 역시 없었다.
스토리지의 경우, 스토리지의 리소스 역시도 안정적이었으며 I/O 사용량도 그렇게 많지 않았다.
단서가 되었던 것은 서버의 경우인데 top 명령어를 입력했을 때 아래와 같이 192.168.1.4 (스토리지 NFS IP)-m 이라는 프로세스가 CPU 100%를 계속하여 점유하고 있던 것으로 확인되었다.

해당 프로세스는 커널 프로세스로, kill 커맨드로도 종료할 수 없었고 방법은 오직 서버를 리부팅하는 것 뿐이었다.
(하지만 전환 과정 동안 서비스 중단 및 데이터 유실이 우려되어 실제로는 진행하기 어려웠다)
그리고 커널 내에서 발생되는 증상이었기에 OS에서 로그를 전부 분석하더라도 NFS를 포함하여 그 어떠한 특이 로그도 확인되지 않았다.
관련된 증상에 대하여 구글링을 하더라도 그 어떤 답도 찾을 수 없었다. 다른 Side Effect로 인하여 발생된 증상으로 처음에는 추측하였기에, 모든 구간의 장비를 (서버, L4, 스토리지, 스위치, 회선, 방화벽) 전수조사하였으나 어떠한 특이점도 확인되지 않았다.
어쨌든 NFS가 관련되어 있음은 확실해 보였다.
2. 해결 과정
2-1) 커널 디버그 시행
전수조사를 했음에도 특이점이 없다고 판단, ftrace를 통해 서버의 커널 디버그를 시행하는 거 밖에는 방법이 없다고 판단하였다.
ftrace를 실행하자 해당 프로세스의 CPU가 100%에 바로 도달하였고, 확실히 무언가 이슈가 있긴 하다는 것을 짐작할 수 있었다.
그리고 결과물 파일을 열자 아래와 같은 증상을 확인할 수 있었다.

1. nfs_server_return_marked_delegations () 함수가 nfs_is_valid_delegation() 을 0.000001초 단위로 호출하고 있었다.
2. NFSv4의 delegation (위임) 상태 확인 수행 과정에서 루프가 발생하는 것으로 추측하였다.
* Delegation (위임): NFSv4의 기능으로, NFS 서버가 (스토리지) NFS 클라이언트 (서버) 에게 파일 관리를 위임하는 기능이다.
- Read Delegation: 동시 부여 가능
- Write Delegation: 동시 처리는 불가하며 순차 처리로 성능 부하 시 쓰기 속도 저하 발생 -> 현재 발생 증상과 깊은 관련 확인
즉, NFSv4에서 처리 효율화를 위한 Delegation 기능으로 인한 이슈로 볼 수 있었다.
2-2) Delegation.c 코드 분석

① nfs4_is_valid_delegation 단계에서 delegation이 반환 대상이나
② inode가 null이어서 처리 못하는 delegation이 goto restart 구문에서 루프 발생
2-3) 버그 리포팅 확인
https://bugzilla.redhat.com/show_bug.cgi?id=2176575 링크에서 동일한 증상의 버그 리포팅을 간신히 확인할 수 있었다.

그리고 실제로 해당 버그로 인해 delegation.c 소스 코드가 수정된 것도 확인할 수 있었다.
2-4) 조치
소스 코드는 수정되었더라도 커널 버전을 한참 올려야 했기에, NFSv3으로의 다운그레이드를 통해 delegation 기능 자체를 사용하지 않고 우회하는 것으로 결정하였다. 그 이후 간헐적으로 발생되는 증상은 아예 해소되었고 지옥에서 벗어날 수 있었다.
3. 정리
커널 버그로 인한 증상으로 네트워크에서도, 서버에서도, 스토리지에서도 그 어떠한 특이 로그를 확인할 수 없는 이슈였으며 불규칙적이고 간헐적으로 발생되는 증상으로 트러블슈팅이 매우 어려웠다. 이슈 발생 기간 동안 엄청난 공포와 스트레스였으며.. (커널 프로세스라 복구법이 리부팅) 아무튼 해결이 된 후 한참 지난 후에 내용을 공유한다.
이 증상으로 인해 고통받는 누군가가 있으면 도움이 되기를 빈다.