今天突然想比较一下 write() 和 writev() 的性能, 网上google了半天, 竟然没有发现一点有关的数据信息, 自己就测试了一下。
平台如下:
CentOS 5.2 Linux kernel 2.6.18-92.e15
CPU: Intel(R) Pentium(R) 4 CPU 2.40GHz
Disk: 7200 rpm
测试的想法是: 对于writev(), 如果有10 个buffer, 并且buffer的大小是1kb, 那么我就先依次调用write() 10 次, 每次写1KB 到同一个文件, 记录下时间, 然后记录下用writev()的时间。 最后, 以write()为baseline, 计算writev()所占的%, 如果%越小, 证明writev() 的性能就越好。
做了两组测试,
第一组, 固定buffer 的个数(10, 100, 1000), 依次增加buffer的大小, 从1KB -- 1024KB, 数据如下, (基准线为相应write()的数据)
例如, 10 个buffer, 每个buffer size 是1KB。 write() 耗时0.092 ms, writev() 耗时0.098 ms, 图中的数据即为 1.067 (write_v10, 1KB)
图一
第二组, 固定buffer大小(1KB, 2KB, 8KB), 依次增加buffer的数目, 从 200 -- 8000, 数据如下 (基准线为相应write()的数据)
图二
第一组数据显示:1. 随着buffer的增大 ( > 64KB), writev()的性能开始跟write()持平; 2. 如果buffer的个数过小 , writev()的性能是低于write()的。 从图一可以看到, 在buffer size 小于1024KB 时, writev() 使用10 个buffer的性能要低于100 和1000。
第二组数据显示: 1. 当保持buffer size一定情况下, 增加buffer的个数 (< 2000), writev() 的性能稳定在70%左右; 2. 增加buffer size, 将会降低writev()的性能。 当buffer为8KB 时, writev() 所用时间基本上都为相应write()时间的80%, 性能的提高明显不如1KB 和 2KB。3. 当buffer的个数超过2000, 并且buffer size 大于2KB, writev()性能将远不如write()。
结论:
writev() 应使用在small write intensive 的workload中, buffer size 应控制在 2KB 以下, 同时buffer的数目不要超过IOV_MAX, 否则 writev() 并不会带来性能的提高。
现在, 所要研究的问题是对于不同的workload, 如何快速的确定writev()中buffer的个数和大小, 从而达到较好performance。
Saturday, May 09, 2009 8:50:48 PM