Tôi đang cố gắng so sánh tốc độ ghi tổng hợp khi ghi vào tệp trong hệ thống tệp GPFS, so với ghi trực tiếp vào đĩa trên hệ thống với Red Hat Enterprise Linux Server phát hành 6.4 (Santiago). Đối với ứng dụng của tôi, tôi cần đo tốc độ thô, tức là không tận dụng bộ đệm. Tôi không hiểu tác động của tùy chọn trực tiếp được sử dụng dd
để bỏ qua bộ đệm. Khi ghi trực tiếp vào thiết bị khối, tôi nhận được tỷ lệ thấp hơn đáng kể khi tôi sử dụng oflag=direct
, so với ghi vào tệp trong hệ thống tệp GPFS. Lý do tại sao điều này xảy ra?
Để đo tốc độ tổng hợp, tôi tạo p
các quy trình đang chạy dd
đồng thời ghi vào thiết bị khối hoặc tệp. Sau đó tôi tổng các p
tỷ lệ thu được để có được tỷ lệ ghi tổng hợp.
#!/bin/bash
directdiskrate=~/scratch/rate5
syncdiskrate=~/scratch/rate4
filerate=~/scratch/rate3
numruns=1
numthreads=30
#to disk use both conv=fsync and oflag=direct
writetodiskdirect="dd if=/dev/zero of=/dev/sdac bs=256k count=4096 conv=fsync oflag=direct iflag=fullblock"
for p in $(seq $numthreads)
do
#parses output of dd, rate is on last line, each field separated by ,s
$writetodiskdirect 2>&1|tail -n 1|awk 'BEGIN { FS = "," } ; { print $3 }'|sed -e 's/MB\/s//g'>>$directdiskrate&
done
wait
#to disk use only conv=fsync option
writetodisksync="dd if=/dev/zero of=/dev/sdac bs=256k count=4096 conv=fsync iflag=fullblock"
for p in $(seq $numthreads)
do
#parses output of dd, rate is on last line, each field separated by ,s
$writetodisksync 2>&1|tail -n 1|awk 'BEGIN { FS = "," } ; { print $3 }'|sed -e 's/MB\/s//g'>>$syncdiskrate&
done
wait
#to file use both conv=fsync and oflag=direct
for p in $(seq $numthreads)
do
writetofile="dd if=/dev/zero of=/gpfs1/fileset6/file$p bs=256k count=4096 conv=fsync oflag=direct"
#parses output of dd, rate is on last line, each field separated by ,s
$writetofile 2>&1|tail -n 1|awk 'BEGIN { FS = "," } ; { print $3 }'|sed -e 's/MB\/s//g'>>$filerate&
done
wait
Kết quả: Tốc độ ghi của mỗi 30 quy trình như sau:
- Ghi vào đĩa bằng
conv=fsync
tùy chọn, mỗi quá trình có tốc độ ghi ~ 180MB / s - Ghi vào đĩa bằng cả hai
conv=fsync
vàoflag=direct
, mỗi quá trình có tốc độ ghi ~ 9MB / s - Ghi vào một tệp trong hệ thống tệp GPFS, sử dụng cả hai
conv=fsync
vàoflag=direct
, có tốc độ ghi ~ 80MB / s