lighty 的生活

lighty 开发者博客

加速小文件传输

感谢我们 #lighttpd IRC 频道的一些帮助,我们解决了另一个长期存在的问题

由于 lighttpd 是一个基于事件的 Web 服务器,我们在处理阻塞操作时会遇到问题。在 1.5.0 版本中,我们添加了异步 sendfile() 操作,这对于大文件传输帮助很大。对于小文件,大部分时间都花在了没有异步接口的初始 stat() 调用上。

Fobax 提交了一个很好的解决方案:将 stat() 调用移至一个 FastCGI 应用程序,该应用程序返回 X-LIGHTTPD-send-file: 并将请求交还给 lighttpd。FastCGI 应用程序可以阻塞并花费一些时间,而 lighttpd 则可以继续处理其他请求。当 FastCGI 返回时,stat() 调用的信息已在文件系统缓冲区中,lighttpd 不再阻塞在 stat() 调用上。

所有这些都由 darix 在 wiki 上记录,链接是 如何使用FastCGI加速Stat

这适用于 1.4.0 版本中的 mod_fastcgi 或 1.5.0 版本中的 mod-proxy-core + aio。

对于 1.5.0 版本,我已将 fcgi-stat-accel 添加到 SVN 和 CMake 构建中。

我想在端口 1029 上进行首次测试。`-C 1` 是为了在后端只启动一个线程,以便稍后查看其影响。

$ ./build/spawn-fcgi -f ./build/fcgi-stat-accel -p 1029 -C 1

在 lighttpd 配置方面,我们需要启用 X-Sendfile 并保持连接池中打开一些连接。

$SERVER["socket"] == ":1025" {
  $HTTP["url"] =~ "^/seek-bound/" {
    proxy-core.protocol = "fastcgi"
    proxy-core.backends = ( "127.0.0.1:1029" )
    proxy-core.allow-x-sendfile = "enable"
    proxy-core.max-pool-size = 20
  }
}

作为测试环境,我使用了 10 万个文件,与之前的测试一样(总计 10GB 数据)。

$ http_load -parallel 200 -seconds 60 urls.100k

iostat 输出显示

$ iostat -xm 5
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           9.20    0.00   45.80   45.00    0.00    0.00

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          0.00   0.00 73.00  0.00 13278.40    0.00     6.48     0.00   181.90     7.09   98.30  13.71 100.08
sdb          0.00   0.00 69.20  0.00 12625.60    0.00     6.16     0.00   182.45    13.63  194.71  14.46 100.08

我们现在受到磁盘性能的限制,或许我们可以通过使用 UNIX 域套接字而非 TCP 来进一步降低 CPU 使用率

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.19    0.00   38.56   53.25    0.00    0.00

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          0.00   1.00 67.63  4.30 12533.07   47.95     6.12     0.02   174.91    10.28  144.44  13.89  99.90
sdb          0.00   1.00 66.13  4.30 12442.76   47.95     6.08     0.02   177.35    11.92  168.46  14.18  99.90

系统时间减少了 6,足够了。

总结

多亏了 Fobax 的好主意,我终于可以充分利用我的两块磁盘了。如果您有更多磁盘,影响会更大。不妨一试。

name             Throughput    util%
----------------- ------------- ---------
no stat-accel     12.07MByte/s 81%
stat-accel (tcp)  13.64MByte/s 99%
stat-accel (unix) 13.86MByte/s 99%