使用 dd 命令模拟数据库磁盘读写

# df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda2      ext4    96G   17G   75G  19% /
tmpfs          tmpfs  7.8G  300K  7.8G   1% /dev/shm
/dev/sda1      ext4   190M   40M  141M  22% /boot
/dev/sda5      ext4   365G  174G  174G  50% /u01


模拟数据库插入操作(少量数据频繁写入测试,/dev/sda5是数据库数据目录)

dd if=/dev/sda5 of=test bs=64k count=4k oflag=dsync  

大数据连续写入测试

dd if=/dev/sda5 of=test bs=8k count=256k conv=fdatasync  

 

先介绍下 conv 参数 CONVS 的含义: 
‘fdatasync’ 
  Synchronize output data just before finishing.  This forces a 
  physical write of output data. 

‘fsync’ 
  Synchronize output data and metadata just before finishing. 
  This forces a physical write of output data and metadata. 

这两个参数的区别就在于是否写入元数据。 

再介绍下 oflag 参数 FLAGS 的含义: 
‘dsync’ 
  Use synchronized I/O for data.  For the output file, this 
  forces a physical write of output data on each write.  For the 
  input file, this flag can matter when reading from a remote 
  file that has been written to synchronously by some other 
  process.  Metadata (e.g., last-access and last-modified time) 
  is not necessarily synchronized. 

‘sync’ 
  Use synchronized I/O for both data and metadata. 

这两个参数的区别也在于是否写入元数据。 

看完了参数说明,我们再来说说上面的两行命令,这两行命令,都是测试磁盘写入性能的,只不过执行第一个命令时,需要很长的时间(以下测试数据来源于我在 AWS 上的免费 EC2 服务器。OS: RHEL7.3 64位):

$ dd dd if=/dev/sda5 of=test bs=64k count=4k oflag=dsync  

记录了4096+0 的读入  

记录了4096+0 的写出  

268435456字节(268 MB)已复制,48.6814 秒,5.5 MB/秒  

 

$ dd if=dd if=/dev/sda5 of=test bs=8k count=256k conv=fdatasync  

记录了262144+0 的读入  

记录了262144+0 的写出  

2147483648字节(2.1 GB)已复制,41.277 秒,52.0 MB/秒  

 

我们会发现第一行命令执行完,仅生成了 268 MB 的数据,用时却长达 48+ 秒。 
而第二行命令执行完,虽然生成了 2.1GB 的数据,比第一行命令生成的数据大的多,但是用时却只有 41+ 秒,反而用时少。 
为什么呢? 

请注意下 oflag=dsync 参数,这个参数表明每当需要写数据时都会真正到写到磁盘上,等写到磁盘上之后,才会继续开始下一次数据写入。第一行命令要求反复写 4k 次数据,也就是说,会真正写磁盘 4k 次,用时长是理所当然的。 

而第二行命令,虽然总共要写 2.1 GB 的数据,但是由于使用的是 conv=fdatasync 参数,也就是说,当 dd 命令结束前,一次性把所有的数据写到磁盘上,因此写入速度非常快。 

我们再做一个测试,还是使用上面两个命令,参数相同,不同的仅是 count 参数设置为 1,bs 设置为 256 MB。那么根据之前的说明,我们可以推测,两次测试的结果应该是相近的。 

$ dd if=/dev/sda5 of=test bs=256MB count=1 oflag=dsync  

记录了1+0 的读入  

记录了1+0 的写出  

256000000字节(256 MB)已复制,3.85186 秒,66.5 MB/秒  

 

$ dd if=/dev/sda5 of=test bs=256MB count=1 conv=fdatasync  

记录了1+0 的读入  

记录了1+0 的写出  

256000000字节(256 MB)已复制,4.23802 秒,60.4 MB/秒  

你可能感兴趣的:(数据库)