fio 출력은 두 위치에 두 개의 대역폭 숫자(읽기 및 쓰기용)를 표시합니다. 이 두 숫자는 무엇을 나타냅니까? 처리량 테스트를 위해 어느 것을 고려해야 하며, 다른 하나는 어떤 목적으로 고려해야 합니까?
1 {JOB}:{1}_{4k}_{5}: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodep th=32
2 ...
3 fio-3.1
4 Starting 16 threads
5
6 {JOB}:{1}_{4k}_{5}: (groupid=0, jobs=16): err= 0: pid=143919: Thu Oct 10 18:35:14 2019
7 read: IOPS=50.1k, BW=196MiB/s (205MB/s)(34.4GiB/180002msec)
8 slat (nsec): min=1210, max=191233, avg=3335.76, stdev=1810.98
9 clat (usec): min=166, max=16660, avg=695.21, stdev=319.44
10 lat (usec): min=169, max=16662, avg=698.62, stdev=319.39
11 clat percentiles (usec):
12 | 1.00th=[ 338], 5.00th=[ 396], 10.00th=[ 433], 20.00th=[ 482],
13 | 30.00th=[ 515], 40.00th=[ 537], 50.00th=[ 570], 60.00th=[ 685],
14 | 70.00th=[ 832], 80.00th=[ 914], 90.00th=[ 1012], 95.00th=[ 1188],
15 | 99.00th=[ 1532], 99.50th=[ 2057], 99.90th=[ 3490], 99.95th=[ 3884],
16 | 99.99th=[ 5997]
17 bw ( KiB/s): min= 5883, max=16873, per=6.26%, avg=12545.77, stdev=3041.02, samples=5760
18 iops : min= 1470, max= 4218, avg=3136.15, stdev=760.26, samples=5760
19 write: IOPS=952k, BW=3720MiB/s (3901MB/s)(654GiB/180002msec)
20 slat (nsec): min=1192, max=927014, avg=3640.66, stdev=1926.60
21 clat (usec): min=98, max=10023, avg=496.01, stdev=170.79
22 lat (usec): min=100, max=10025, avg=499.72, stdev=170.69
23 clat percentiles (usec):
24 | 1.00th=[ 273], 5.00th=[ 326], 10.00th=[ 355], 20.00th=[ 388],
25 | 30.00th=[ 420], 40.00th=[ 445], 50.00th=[ 457], 60.00th=[ 474],
26 | 70.00th=[ 486], 80.00th=[ 510], 90.00th=[ 865], 95.00th=[ 930],
27 | 99.00th=[ 1004], 99.50th=[ 1029], 99.90th=[ 1188], 99.95th=[ 1287],
28 | 99.99th=[ 1467]
29 bw ( KiB/s): min=121170, max=307136, per=6.26%, avg=238474.82, stdev=57541.32, samples=5760
30 iops : min=30292, max=76784, avg=59618.41, stdev=14385.36, samples=5760
31 lat (usec) : 100=0.01%, 250=0.25%, 500=73.65%, 750=12.84%, 1000=11.71%
32 lat (msec) : 2=1.52%, 4=0.02%, 10=0.01%, 20=0.01%
33 cpu : usr=6.39%, sys=33.77%, ctx=40608436, majf=0, minf=11562
34 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
35 submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
36 complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
37 issued rwt: total=9019565,171442027,0, short=0,0,0, dropped=0,0,0
38 latency : target=0, window=0, percentile=100.00%, depth=32
39
40 Run status group 0 (all jobs):
41 READ: bw=196MiB/s (205MB/s), 196MiB/s-196MiB/s (205MB/s-205MB/s), io=34.4GiB (36.9GB), run=180002-180002msec
42 WRITE: bw=3720MiB/s (3901MB/s), 3720MiB/s-3720MiB/s (3901MB/s-3901MB/s), io=654GiB (702GB), run=180002-180002mse c
43
44 Disk stats (read/write):
45 nvme1n1: ios=9013394/171326957, merge=0/0, ticks=6201303/82738341, in_queue=103287914, util=100.00%
예를 들어 읽기의 경우 관련 줄은 다음과 같습니다.
7: read: IOPS=50.1k, BW=196MiB/s (205MB/s)(34.4GiB/180002msec)
17: bw ( KiB/s): min= 5883, max=16873, per=6.26%, avg=12545.77, stdev=3041.02, samples=5760
41: READ: bw=196MiB/s (205MB/s), 196MiB/s-196MiB/s (205MB/s-205MB/s), io=34.4GiB (36.9GB), run=180002-180002msec
7행의 "BW"는 무엇을 의미하고, 17행의 "bw"는 무엇을 의미합니까? 그것들은 어떻게 다른가요? 처리량 테스트를 위해 어떤 것을 고려해야 합니까?
답변1
읽기/쓰기/가지치기
[...] BW는 평균 대역폭 속도로, 2의 거듭제곱(10의 거듭제곱)으로 표시됩니다.
[...]
무게
샘플 기반 대역폭 통계
하나(BW)는 total I/O / time
작업이 실행되는 동안 일정 기간 동안 수집된 샘플을 평균하여 계산된 다른 하나(bw)입니다( samples=5760
줄 끝 참고). 이전 버전의 fio의 버그로 인해 여러 작업을 동시에 실행하는 경우 샘플 데이터가 매우 이상하게 보일 수 있습니다. 최신 fio를 사용하면 더 합리적인 결과를 얻을 수 있습니다.https://github.com/axboe/fio/releases최신 버전을 얻으려면).
처리량 테스트를 위해 어느 것을 고려해야 하며, 다른 하나는 어떤 목적으로 고려해야 합니까?
BW는 일반적으로 보고 싶은 것이지만 bw의 샘플링 통계(예: max, min, stdev)는 무언가 심각하게 잘못되었다는 강력한 경고 신호가 될 수 있습니다(그러나 위의 이전 fio 버전에 대한 경고 참조).
답변2
Sitsofe Wheeler가 좀 더 포괄적인 답변을 했다고 생각합니다.https://www.spinics.net/lists/fio/msg05517.html그들은 썼다:
BW는 초당 평균입니다. bw는 평균 중의 평균이다...
BW는 수행한 모든 I/O(1189MiB)를 합산하고 초 단위 시간으로 나누어 계산됩니다.
(1189*1024.0)/(13001/1000.0)/1024 ~ 91.5
bw는 bw 로그의 모든 "값"을 더하고 해당 값의 수로 나누어 계산됩니다. 각 값 자체는 일종의 평균이지만, 어느 기간이 지났는지 알 수 없습니다. 이것은 큰 변화를 가져올 수 있습니다.
2초 동안 실행되는 작업이 있다고 상상해 보세요. 처음 1초 동안 10MB의 데이터가 2개의 I/O를 거칩니다. 2초 안에 2개의 I/O를 통해 100MByte가 완성된다. BW는
120 / 2 = 60MBytes/s
. 그런데 bw값이 이렇다고 생각해보세요0. 10240, 0, 0 0, 10240, 0, 1024 1, 102400, 0, 2048 1, 102400, 0, 3072 (10240 * 2 + 102400 * 2)/4.0/1024.0 = 55.0
각 bw 항목의 평균 기간은 반드시 알 수 없으며 항목이 1초가 아닌 기간에 걸쳐 평균화되는 경우 "평균 평균"은 초당이 아닙니다. 이 (KiB/s)가 실제로 오해의 소지가 있는지 궁금합니다.
다음은 제가 직접 테스트한 좀 더 심각한 예입니다.
512M: (groupid=0, jobs=1): err= 0: pid=15001: Sun Sep 6 22:45:26 2020
write: IOPS=0, BW=153MiB/s (161MB/s)(45.0GiB/301044msec); 0 zone resets
slat (msec): min=103, max=4290, avg=2819.80, stdev=988.46
clat (msec): min=11, max=13196, avg=9817.42, stdev=1824.07
lat (msec): min=2825, max=17272, avg=13162.17, stdev=1957.18
clat percentiles (msec):
| 1.00th=[ 12], 5.00th=[ 8020], 10.00th=[ 8087], 20.00th=[ 8658],
| 30.00th=[ 9060], 40.00th=[ 9597], 50.00th=[10134], 60.00th=[10268],
| 70.00th=[10671], 80.00th=[10939], 90.00th=[11610], 95.00th=[12147],
| 99.00th=[13221], 99.50th=[13221], 99.90th=[13221], 99.95th=[13221],
| 99.99th=[13221]
bw ( KiB/s): min=1046483, max=1048576, per=100.00%, avg=1048454.31, stdev=492.65, samples=86
iops : min= 1, max= 2, avg= 1.94, stdev= 0.24, samples=86
lat (msec) : 20=1.11%
cpu : usr=3.17%, sys=2.22%, ctx=185445, majf=0, minf=21
IO depths : 1=1.1%, 2=2.2%, 4=96.7%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,90,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=4
Run status group 0 (all jobs):
WRITE: bw=153MiB/s (161MB/s), 153MiB/s-153MiB/s (161MB/s-161MB/s), io=45.0GiB (48.3GB), run=301044-301044msec
전체 실행의 평균 속도는 153MiB/s로 표시되지만 대역폭 샘플링 속도는 1024MiB/s(iiuc)입니다.