ext4 포맷 속도 개선

Linux에서 ext4 파일시스템을 사용하면서 종종 겪는 이슈 중의 하나가 바로 포맷 속도 입니다. 과거에는 이러한 포맷 속도가 그렇게까지 문제가 되지 않았지만 6TB, 8TB 디스크가 보편화 되면서 이러한 큰 디스크를 포맷할 때 시간이 너무 많이 소요되는 문제가 있습니다.

사실, 이게 딱히 문제라고 보긴 어렵지만 특정 경우에는 (포맷 작업을 순차적으로 처리하는 업무라던지 ) 많은 시간을 소모하는 포맷 작업이 부담스러울 수 있습니다. 그러다보니 ext4를 주력으로 하는 Ubuntu 같은 배포판에서도 포맷 속도가 빠른 XFS를 선호하시는 분도 보았었습니다. (저는 개인적인 선호도로 XFS를 씁니다)

그래서, 특별한 기술은 아니지만 이러한 ext4의 포맷 속도를 개선 할 방법을 소개합니다. ext4가 포맷 작업을 할 때 가장 많은 시간을 할애하는 부분은 inode table을 초기화 하는 작업입니다. 특히, 디스크 크기가 크면 클 수록 inode의 개수도 많기 때문에 더 많은 시간이 소요됩니다. 이를 백그라운드에서 초기화 작업을 하도록 옵션을 지정 할 수 있습니다.

$ sudo mkfs.ext4 -E lazy_itable_init=1 /dev/sdc1

위와 같이 lazy_itable_init 옵션을 지정해서 포맷하면 inode table 초기화를 포맷 시점에 하지 않고 마운트 된 후에 초기화 작업을 수행하게 됩니다.

단, 주의할 점은 이렇게 포맷 된 볼륨은 처음 마운트 되면 초기화 작업이 안정적으로 마무리 되어야 하기 때문에 초기화가 완전히 끝나기 전에 갑작스런 시스템 크래시로 인해 마운트가 해제 되었다가 마운트를 다시하게 되면 파일시스템에 손상이 생길 수 있습니다. (그래서 최대한 손상을 줄이기 위해서 저널 초기화도 지연시키는 lazy_journal_init 옵션은 쓰지 않고 inode table 초기화만 지연시키는 옵션을 사용합니다.)

또한, 백그라운드에서 초기화 작업을 수행하기 때문에 마운트 후에 초기화가 완료될 때 까지 I/O 성능이 조금 떨어질 수 있습니다.

위 예시 처럼 포맷한 후에 볼륨을 마운트 해서 iostat으로 모니터링하면 지속적으로 초기화 작업(inode table zeroing)을 수행하는 걸 확인 할 수 있습니다.

$ iostat -x 1 /dev/sdc
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.82    0.00    0.34    1.35    0.00   97.50

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sdc               0.35   166.55    3.76   18.66    32.81  6804.69   304.93     6.34  282.67   2.88   6.45

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.13    0.00    0.46    4.42    0.00   95.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sdc               0.00     0.00    0.00   12.00     0.00 12288.00  1024.00     0.06    5.00   2.00   2.40