NFS 파일 서버로 사용하는 Amazon EC2 인스턴스가 있습니다. 5x1TB 볼륨 RAID0 어레이를 사용합니다. 시스템은 I/O 집약적이며 파일은 항상 NFS 공유를 통해 작성/복사/삭제됩니다. 나는 종종 사용된 디스크 공간과 여유 공간의 큰 차이를 발견합니다. (시스템이 유휴 상태이고 파일 공유/시스템에 파일이 기록되지 않을 때 확인합니다). 이에 대한 유일한 "수정"은 인스턴스를 종료하고 다시 시작하는 것입니다(다시 시작해도 작동하지 않고 시스템이 정지될 뿐입니다). 재부팅하면 실행 fsck
되고 시스템 로그(많은)에서 "참조되지 않은" inode가 정리되는 것을 볼 수 있습니다(전체 로그가 아님).
25.110924] EXT4-fs (dm-1): ext4_orphan_cleanup: deleting unreferenced inode 122291727
[ 25.114687] EXT4-fs (dm-1): ext4_orphan_cleanup: deleting unreferenced inode 122291723
[ 25.118610] EXT4-fs (dm-1): ext4_orphan_cleanup: deleting unreferenced inode 122291703
[ 25.135184] EXT4-fs (dm-1): ext4_orphan_cleanup: deleting unreferenced inode 122291722
[ 25.140005] EXT4-fs (dm-1): ext4_orphan_cleanup: deleting unreferenced inode 122291725
[ 25.144013] EXT4-fs (dm-1): ext4_orphan_cleanup: deleting unreferenced inode 122291705
[ 25.148008] EXT4-fs (dm-1): 735 orphan inodes deleted
[ 25.150286] EXT4-fs (dm-1): recovery complete
[ 26.126887] EXT4-fs (dm-1): mounted filesystem with ordered data mode. Opts: (null)
[ OK ]
온라인에서 어떤 해결책도 찾을 수 없습니다. 이 문제의 원인이나 예방 방법을 아는 사람이 있습니까? 아니면 드라이브를 마운트 해제하지 않고도 문제를 해결할 수 있습니까?
추가 정보:
버전 정보:
Linux version 3.10.42-52.145.amzn1.x86_64 (mockbuild@gobi-build-64003) (gcc version 4.8.2 20131212 (Red Hat 4.8.2-7) (GCC) ) #1 SMP Tue Jun 10 23:46:43 UTC 2014
RAID0 어레이는 /etc/fstab
다음과 같이 마운트됩니다.
/dev/vg0/data /data ext4 defaults,auto,noatime,noexec 0 0
/etc/mdadm.conf:
DEVICE /dev/xvdk /dev/xvdj /dev/xvdi /dev/xvdh /dev/xvdg
ARRAY /dev/md0 metadata=1.2 name=ip-172-31-10-215:0 UUID=4c4fb472:e0540788:69a83d01:a75a8a3e
/etc/export:
/data *(rw,sync)
클라이언트는 다음과 같이 NFS 공유를 마운트합니다.
x.x.x.x:/data /mnt/fileserver nfs defaults 0 0
답변1
귀하가 설명하는 동작은 파일이 삭제되었음에도 불구하고 응용 프로그램이 파일을 열어두기 때문에 발생할 수 있습니다. 한 애플리케이션이 파일(예: tail
)을 열고 다른 애플리케이션이 나타나서 파일(예: rm
)을 삭제하는 경우 첫 번째 애플리케이션은 해당 애플리케이션이 파일을 닫을 때까지 파일에 대한 참조를 계속 보유합니다. 이 시점에서 파일 시스템은 파일이 삭제되었으며 어떤 응용 프로그램에서도 열리지 않았음을 인식하고 참조를 지웁니다.
이는 파일과 inode가 어떻게 관련되어 있는지에 대한 지나치게 단순화된 설명입니다. 파일은 기본적으로 특정 inode에 하나 이상의 이름을 할당하는 파일 시스템의 레코드입니다. 열린 파일은 실제로 inode를 통해 참조됩니다. 파일을 삭제하면 실제로 파일 이름과 inode 사이의 링크가 제거되지만, 열린 파일은 열린 파일 설명자와 inode 사이의 링크도 유지합니다. 파일을 닫으면 열린 파일 설명자와 inode 사이의 링크가 제거됩니다. 파일 시스템은 모든 링크가 제거될 때까지 inode를 회수하지 않습니다.
파일 시스템에서 보고한 여유 공간을 보면 현재 사용된 것으로 표시된 모든 inode와 관련된 공간을 알 수 있습니다. 모든 디렉터리를 살펴보고 각 파일/디렉터리가 사용하는 파일 공간을 합산하면 파일이 삭제되었지만 여전히 열려 있는 경우에는 더 적을 수 있습니다. 디렉터리 검색에서는 삭제된 이름 링크가 있는 파일이 사용하는 공간을 볼 수 없습니다.
시스템을 강제 종료하면 응용 프로그램에 파일을 닫을 기회가 제공되지 않습니다. 이러한 기회가 없으면 파일 시스템은 삭제된 파일의 열린 파일 설명자가 사용하는 inode를 회수할 기회가 없습니다. 시스템이 부팅되면 파일 시스템은 이러한 inode를 볼 수 있지만 이를 가리키는 항목은 없습니다. 이를 "고아 inode"라고 하며 파일 시스템은 파일 참조를 제거하고 있음을 알려줍니다.
열린 파일 설명자가 있는 프로세스를 찾는 데 사용할 수 있는 도구가 있습니다 lsof
. 프로세스에서 이 명령을 실행하면 해당 프로세스에 대해 열려 있는 모든 파일 설명자가 표시됩니다. (deleted)
버전에 따라 삭제된 파일은 일반적으로 로 표시됩니다 .