동일한 파일에 동시 쓰기를 수행하면 디스크 I/O 성능이 저하됩니다.

동일한 파일에 동시 쓰기를 수행하면 디스크 I/O 성능이 저하됩니다.

여러 프로세스의 동시 디스크 I/O를 벤치마킹하고 있는데 동일한 파일이나 다른 파일에 쓸 때 매우 다른 결과가 나타납니다. 저는 O_DIRECT를 사용하고 있기 때문에 이런 차이를 예상하지 못했습니다.

사용된 스크립트:

#!/bin/sh
set -eu
nprocs=$1
for i in $(seq $nprocs)
do
    target=test_file$i
    [[ "${2:-}" == "same" ]] && target=test_file
    echo $(date) - Run $i/$nprocs $(dd if=/dev/zero of=$target bs=2k count=128000 oflag=direct 2>&1) &
done

결과:

# iostat while running: sh mkfile.sh 10
vg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.39    0.00    9.62   12.09    0.00   77.89

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00 11016.00     0.00 33409.50     6.07    81.36    0.12    0.00    0.12   0.09 100.00


# iostat while running: sh mkfile.sh 10 same
vg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.51    0.00    7.95    4.87    0.00   86.67

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00 7780.00     0.00 16362.00     4.21     0.75    0.10    0.00    0.10   0.10  74.90

차이점은 W/S, 11016.00(여러 파일) ​​및 7780.00(단일 파일)에서 확인할 수 있습니다. dd는 O_DIRECT를 사용하기 때문에 동일한 물리적 영역에 쓰는 것과 관계없이 어떤 종류의 커널 수준 잠금도 있을 것으로 예상하지 않습니다. avgqu-sz는 낮고 %util은 100%가 아니므로 물리적 잠금을 가질 수 없습니다. I/O 경합 1.

나는 여기서 아주 사소한 것을 놓치고 있음에 틀림없다 :)

IOPS 비율이 훨씬 낮은 이유를 알고 계십니까?

관련 정보