배경: 컴퓨터 클러스터가 있고 노드가 할당되면 작업이 요청한 크기의 tmp 디렉터리를 가져옵니다. 그러나 요청된 총 디스크 공간이 사용 가능한 공간보다 큰 경우 동일한 시스템에 두 개의 작업을 보낼 수 있다는 것을 알았습니다. 오류를 fallocate
및 에서 추적했습니다 mkfs.ext4
.
1.1T의 여유 디스크 공간이 있는 테스트 노드/머신에서 tmp 디렉터리를 마운트하기 위한 가상 디스크를 만들었습니다. 사용 fallocate
및 mkfs.ext4
:
# fallocate -l 900G /tmp/disk-test1
# /sbin/mkfs.ext4 -F /tmp/disk-test1
# fallocate -l 900G /tmp/disk-test2
# /sbin/mkfs.ext4 -F /tmp/disk-test2
크기가 900G인 두 개의 파일을 생성합니다.
# ll --block-size=G /tmp/
...
-rw-r--r--. 1 root root 900G Jul 4 14:03 disk-test1
-rw-r--r--. 1 root root 900G Jul 4 14:03 disk-test2
...
그리고 사용 가능한 디스크 공간을 확인하세요
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg.01-lv_root 1.1T 8.6G 1.1T 1% /
...
/tmp 디렉토리:
# df -h /tmp
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg.01-lv_root 1.1T 8.6G 1.1T 1% /
나는 이런 일이 일어나는 것을 원하지 않습니다. 여유 공간이 부족한 경우 가상 디스크를 생성해서는 안 되며, 일단 마운트되면 가상 디스크에 대한 쓰기는 해당 크기에 따라 제한되어야 합니다.
여기서 무슨 일이 일어나고 있는 걸까요?
답변1
예, 재현할 수 있습니다:
# df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/root 30G 14G 14G 51% /
# fallocate -l 8G test1.disk
# df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/root 30G 22G 5.8G 80% /
# mkfs -text4 test1.disk
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done
Creating filesystem with 2097152 4k blocks and 524288 inodes
...
# df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/root 30G 14G 14G 51% /
파일이 d 일 때 디스크 사용량은 증가 fallocate
하지만 d 이후에는 다시 감소합니다 mkfs
. 참고하세요"장치 블록 폐기: 완료"출력에서 mke2fs
. (Frost Schutz가 댓글에서 이것을 언급했습니다..)
이것맨 페이지에는 다음과 같은 내용이 있습니다.-E discard
:
mkfs가 실행 중일 때 청크를 삭제해 보십시오
(처음에 청크를 삭제하는 것은 솔리드 스테이트 장치 및 희소/씬 프로비저닝된 스토리지에 유용합니다). ...기본 설정입니다.
반대 의 경우 nodiscard
도 시도해 보겠습니다.
# df -h .; fallocate -l 8G test2.disk; mkfs -text4 -Enodiscard test2.disk; df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/root 30G 14G 14G 51% /
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 2097152 4k blocks and 524288 inodes
...
Filesystem Size Used Avail Use% Mounted on
/dev/root 30G 22G 5.9G 79% /
이제 또 하나가 fallocate -l 8G
실패했습니다.