Ubuntu – No space left on device 장애 처리

HYEONG HWAN, MUN/ 7월 21, 2022/ 미분류/ 0 comments

https://blog.lael.be/post/11329

리눅스 사용 중에 No space left on device 장애 대응 방법에 대해 설명한다.

 

1. 증상

이미지 캐시 서버에서 서비스 불능 장애가 발생했다.

 

2. 장애 대응

1) 서버 이상 징후는 없어보였다.

2) 문제가 발생한 코드 단위로 디버깅하였고, 캐시 파일이 생성되지 않는 것을 확인하였다.

3) 해당 서버의 ssh shell 로 접속하였고, 수동으로 캐시 생성 작업을 진행해 보았다.

mkdir: cannot create directory ‘test’: No space left on device

# df -h

disk free space 는 충분했다.

TIP : 만약 디스크 공간을 다 소비했을 경우, 사용할 수 있는 명령어는 rm 뿐이다. 무조건 무언가를 삭제해야 한다.
나의 경우 이럴 때를 대비하여 swap 메모리를 설정해둔다. 문제가 발생하면 swap을 해제하고(삭제하고) 서버를 정상화 시킨다음 장애 대응을 계속 진행한다.

 

디스크 공간이 충분한데 왜 생성이 되지 않는 것일까?

# df -i

 

 

inode

리눅스 파일 시스템에서 Meta data 를 저장하는 공간. 일반적으로 256 Byte 크기입니다.

아이노드에 포함된 정보
파일 모드 : 파일과 관계된 접근과 실행 권한을 저장하는 16비트 플래그. (파일 종류, SetUID, SetGid, Sticky, Owner-Group-Other Perm bit)
링크 수 : 이 아이노드에 대한 디렉터리 참조 수
소유자 아이디 : 파일의 소유자
그룹 아이디 : 이 파일과 관계된 그룹 소유자
파일 크기 : 파일의 바이트 수
파일 주소 : 주소 정보(39바이트)
마지막 접근 : 마지막으로 파일에 접근한 시각
마지막 수정 : 마지막으로 파일을 수정한 시각
아이노드 수정 : 마지막으로 아이노드를 수정한 시각

 

즉, 디스크 메타데이터 공간이 가득차서, 파일을 더 이상 생성하지 못하는 것이다.

일반적으로 hdd, ssd 환경에서는 디스크 1G 64000개의 inode 를 할당한다.
예를 들어서 50GB 디스크를 사용한다면, 320만개의 inode 가 할당될 것이다.

NVME SSD 환경에서는 디스크 1G128000개의 inode 를 할당할 것이다. (이 경우 50GB 디스크를 사용한다면 640만개의 inode 할당)

정상적인 환경에서는 서버를 수십년 사용해도 inode 장애가 발생하지 않는다. 하지만 160KB보다 작은 파일을 수십만개 생성하는 경우 문제가 발생하게 된다.

 

 

inode full 문제 해결 방법

bytes-per-inode (inode_ratio) 는 디스크를 처음 포맷할 때 정해지며, 변경할 수 없습니다. (GB 당 6.4 만개 또는 12.8 만개)

 

따라서 파일을 삭제해서, inode 공간을 비워주는 방법 밖에 없습니다. (free up inode space)
또는 디스크를 확장하여 물리적인 inode 공간을 늘려주는 방법도 있습니다. (expand inode space)

 

나의 최종 대응

운영비용을 추가하고 싶지 않기 때문에, 디스크를 확장하지 않고, 파일/폴더를 삭제하였다.
캐시 서버이기 때문에 캐시데이터는 다시 생성할 수 있다. 작은 크기의 불변하는 고정데이터 이지만 캐시파일을 주기적으로 정리하는 프로세스를 만들어서, inode full 장애를 막아야겠다.
그리고 모니터링 항목에 inode count 도 추가해야겠음.

 

 

엔터프라이즈 모니터링쪽 살펴봤는데, disk management 에 free space 랑 free inode 를 살펴보더라.

 

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*