use*_*949 7 linux performance filesystems coreutils hard-disk
我试图比较写入 GPFS 文件系统中的文件时的总写入速率,与直接写入具有 Red Hat Enterprise Linux Server 6.4 (Santiago) 的系统上的磁盘相比。对于我的应用程序,我需要测量原始速率,即不利用缓存。我不明白用于dd绕过缓存的直接选项的影响。oflag=direct与写入 GPFS 文件系统中的文件相比,直接写入块设备时,使用 时我获得的速率要低得多。为什么会发生这种情况?
为了测量聚合速率,我创建了并发写入块设备或文件的p进程dd。然后我将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
Run Code Online (Sandbox Code Playgroud)
结果: 30个进程各自的写入率如下:
conv=fsync选项写入磁盘,每个进程的写入速率约为 180MB/sconv=fsync和写入磁盘oflag=direct,每个进程的写入速率约为 9MB/sconv=fsync和oflag=direct写入GPFS 文件系统中的文件,写入速率约为 80MB/s这种差异无疑归结为一件事:缓存。
很难确定在哪里,尤其是从用户空间,但是所有 Linux 内核都会缓冲(缓存)文件系统写入,除非您执行获得同步写入的技巧。也就是说,内核会将dd发送的数据保存到内核内存中某处的文件中。内核可能使用文件系统代码来做到这一点。在未来的某个时候,内核会调度一个磁盘块到磁盘上。这将“异步”发生,在内核告诉dd写入完成之后的某个时间。
这样做的原因是通过总线将字节移动到磁盘驱动器,然后移动到磁盘盘片比从用户内存复制到内核内存要慢得多。通常,程序不太关心他们刚刚“写入”的数据在一段时间内不会进入磁盘。硬件可靠性足够高,以至于数据几乎总是可以拼盘。
这是一个简单的答案,但是一旦您在内核中缓冲了所有读取/写入/删除操作,文件系统代码就可以利用较短的文件生存期,永远不会写出在它们被删除之前被删除的文件的数据。盘。文件系统代码可以对写入进行分组以利用大于一组写入的磁盘块并将它们合并为一个写入。大多数文件系统都可以进行大量优化。