mmap文件映射更新文件与直接IO的性能对比


 使用文件映射,将文件的一部分内容映射到内存中,然后直接操作内存的数据。这种方式是肯定要优于直接写文件的IO操作。但具体的对比数值自己之前一直没有做过。现在来看看是怎么个对比结果。

对比结果

试验1:

    实验体:文件大小1G。文件内的值都是某个结构体的对象。

    对比结果: mmap平均处理耗时 2973 ms,而通过fstream写文件耗时 63577 ms。近乎是21倍.

试验2:

    实验体:文件大小512G。文件内的值都是某个结构体的对象。

    对比结果: mmap处理耗时 1554ms,而通过fstream写文件耗时 31236 ms 。近乎是20倍.

结果分析

从结果看,mmap的效率粗浅的看,效率远远高于直接文件读写。现在我们查看各自的cpu和io负载的值。其中system表示cpu使用率,rsec/s表示读入,wsec/s表示每秒写入,这两个参数某一个特别高的时候就表示磁盘IO有很大压力。util表示IO使用率

    先查看使用mmap时的cpu和io的一个状态值。状态的刷新时间间隔是1s

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           4.17    0.00   95.83    0.00    0.00    0.00

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 102013.89    0.00 3311.11     0.00 421300.00   254.48    91.34   27.60    0.00   27.60   0.27  89.86
dm-0              0.00     0.00    0.00 105325.00     0.00 421300.00     8.00  2887.36   27.41    0.00   27.41   0.01  93.19
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00


avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.33    0.00   97.67    0.00    0.00    0.00

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 112017.44    0.00 3576.74     0.00 456446.51   255.23    71.00   19.69    0.00   19.69   0.25  90.58
dm-0              0.00     0.00    0.00 115494.19     0.00 461976.74     8.00  2260.37   19.41    0.00   19.41   0.01  91.63
dm-1              0.00     0.00    0.00  148.84     0.00   595.35     8.00     0.49    3.28    0.00    3.28   0.05   0.70

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.95    0.00   93.42    2.63    0.00    0.00

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 108952.63    0.00 3394.74     0.00 433894.74   255.63    49.19   13.83    0.00   13.83   0.25  86.05
dm-0              0.00     0.00    0.00 112472.37     0.00 449889.47     8.00  1570.13   13.28    0.00   13.28   0.01  86.71
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    1.05    0.00    0.00   98.95

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  1591.58    0.00  197.89     0.00 24917.89   251.83     4.42   34.45    0.00   34.45   0.27   5.26
dm-0              0.00     0.00    0.00 1644.21     0.00  6576.84     8.00   136.67  131.07    0.00  131.07   0.03   5.16
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

可以看到使用mmap时,IO负载很高,这说明IO得到充分的使用。

    再来看直接IO时的cpu和io的一个状态值。状态的刷新时间间隔是2s

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 33282.35    0.00 1076.47     0.00 137435.29   255.34    11.59   10.77    0.00   10.77   0.24  26.18
dm-0              0.00     0.00    0.00 34358.82     0.00 137435.29     8.00   367.71   10.70    0.00   10.70   0.01  26.18
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          19.12    0.00   80.88    0.00    0.00    0.00

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 33932.35    0.00 1105.88     0.00 140147.06   253.46    27.92   25.26    0.00   25.26   0.27  29.85
dm-0              0.00     0.00    0.00 35036.76     0.00 140147.06     8.00   886.74   25.31    0.00   25.31   0.01  29.85
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          20.29    0.00   79.71    0.00    0.00    0.00

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 34226.09    0.00 1110.14     0.00 141344.93   254.64    12.00   10.83    0.00   10.83   0.26  28.41
dm-0              0.00     0.00    0.00 35336.23     0.00 141344.93     8.00   379.34   10.74    0.00   10.74   0.01  28.41
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          26.42    0.00   73.58    0.00    0.00    0.00

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    20.75    0.00    7.55     0.00   105.66    28.00     0.01    1.25    0.00    1.25   1.25   0.94
dm-0              0.00     0.00    0.00   26.42     0.00   105.66     8.00     0.09    3.50    0.00    3.50   0.36   0.94
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          23.08    0.00   76.92    0.00    0.00    0.00

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 34786.15    0.00 1124.62     0.00 143643.08   255.45    12.85   11.44    0.00   11.44   0.25  27.85
dm-0              0.00     0.00    0.00 35910.77     0.00 143643.08     8.00   407.64   11.35    0.00   11.35   0.01  28.46
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          22.39    0.00   77.61    0.00    0.00    0.00

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 34170.15    0.00 1111.94     0.00 141128.36   253.84     9.24    8.34    0.00    8.34   0.24  27.01
dm-0              0.00     0.00    0.00 35282.09     0.00 141128.36     8.00   291.25    8.25    0.00    8.25   0.01  27.46
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

    直接IO的时候,中间有部分时间IO负载是0.94,说明IO比较空闲,没有充分的运行起来。

    上面的统计数据,来自于iostat命令。


评论

发表评论