缓冲IO性能

2007年2月11日

除了对大量静态文件传输很重要的原始IO性能外,缓冲IO性能对于拥有少量可保存在文件系统缓存中的静态文件的网站来说更受关注。

由于我们在此基准测试中使用热缓存,服务器的“轻量性”变得很重要。它执行的系统调用越少,性能就越好。

该测试用例由100MB文件组成,文件大小分别为10MB和100KB。

基准测试

100KB

从热缓存提供100MB的100KB文件

lighttpd
后端MB/s请求/秒用户 + 系统
writev82.20802.7190%
linux-sendfile70.27686.3256%
gthread-aio75.39736.2398%
posix-aio73.10713.8898%
linux-aio-sendfile31.32305.9035%
其他
Apache 2.2.4 (event)70.28686.3860%
LiteSpeed 3.0rc270.20685.6550%
  • linux-aio-sendfile 丢失了大部分性能,因为它必须使用 O_DIRECT 进行操作,而这总是一个非缓冲读取。
  • Apache、LiteSpeed 和 linux-sendfile 都使用相同的系统调用:sendfile(),并最终得到相同的性能值。
  • gthread-aio 和 posix-aio 的性能优于 sendfile()
  • write() 的性能优于 threaded AIOsendfile()。我目前无法解释这一点 :)

10MB

从热缓存提供100MB的10MB文件。基准测试命令已像其他基准测试一样更改。

$ http_load -verbose -timeout 40 -parallel 100 -fetches 500 http-load.10M.urls-100M

当我们使用 -seconds 选项时,http_load 会进行硬性截断,我们可能会因为不完整的传输而损失一些 MB/秒。

lighttpd
后端MB/s请求/秒用户 + 系统
writev82.208.7680%
linux-sendfile53.955.6540%
gthread-aio83.028.6690%
posix-aio82.318.6093%
linux-aio-sendfile70.177.3560%
其他
Apache 2.2.4 (event)50.925.3340%
LiteSpeed 3.0rc255.585.8040%
  • 所有 sendfile() 实现似乎都有相同的性能问题。
  • writve()threaded AIO 后端按预期利用了网络。
  • linux-aio-sendfile 比缓冲的 sendfile() 更快,即使它必须从磁盘读取所有内容……奇怪