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