缓冲IO性能
2007年2月11日
除了对大量静态文件传输很重要的原始IO性能外,缓冲IO性能对于拥有少量可保存在文件系统缓存中的静态文件的网站来说更受关注。
由于我们在此基准测试中使用热缓存,服务器的“轻量性”变得很重要。它执行的系统调用越少,性能就越好。
该测试用例由100MB文件组成,文件大小分别为10MB和100KB。
基准测试
100KB
从热缓存提供100MB的100KB文件
| lighttpd | |||
|---|---|---|---|
| 后端 | MB/s | 请求/秒 | 用户 + 系统 |
| writev | 82.20 | 802.71 | 90% |
| linux-sendfile | 70.27 | 686.32 | 56% |
| gthread-aio | 75.39 | 736.23 | 98% |
| posix-aio | 73.10 | 713.88 | 98% |
| linux-aio-sendfile | 31.32 | 305.90 | 35% |
| 其他 | |||
| Apache 2.2.4 (event) | 70.28 | 686.38 | 60% |
| LiteSpeed 3.0rc2 | 70.20 | 685.65 | 50% |
linux-aio-sendfile丢失了大部分性能,因为它必须使用O_DIRECT进行操作,而这总是一个非缓冲读取。- Apache、LiteSpeed 和
linux-sendfile都使用相同的系统调用:sendfile(),并最终得到相同的性能值。 - gthread-aio 和 posix-aio 的性能优于
sendfile() write()的性能优于threaded AIO和sendfile()。我目前无法解释这一点 :)
10MB
从热缓存提供100MB的10MB文件。基准测试命令已像其他基准测试一样更改。
$ http_load -verbose -timeout 40 -parallel 100 -fetches 500 http-load.10M.urls-100M
当我们使用 -seconds 选项时,http_load 会进行硬性截断,我们可能会因为不完整的传输而损失一些 MB/秒。
| lighttpd | |||
|---|---|---|---|
| 后端 | MB/s | 请求/秒 | 用户 + 系统 |
| writev | 82.20 | 8.76 | 80% |
| linux-sendfile | 53.95 | 5.65 | 40% |
| gthread-aio | 83.02 | 8.66 | 90% |
| posix-aio | 82.31 | 8.60 | 93% |
| linux-aio-sendfile | 70.17 | 7.35 | 60% |
| 其他 | |||
| Apache 2.2.4 (event) | 50.92 | 5.33 | 40% |
| LiteSpeed 3.0rc2 | 55.58 | 5.80 | 40% |
- 所有
sendfile()实现似乎都有相同的性能问题。 writve()和threaded AIO后端按预期利用了网络。linux-aio-sendfile比缓冲的sendfile()更快,即使它必须从磁盘读取所有内容……奇怪