5 个版本

0.7.2 2024 年 1 月 8 日
0.6.3 2024 年 1 月 2 日
0.6.0 2023 年 12 月 30 日
0.5.4 2022 年 1 月 8 日
0.1.0 2020 年 5 月 3 日

#159 in WebAssembly

Download history 1/week @ 2024-03-27 6/week @ 2024-04-03 127/week @ 2024-04-10

117 每月下载量

Apache-2.0

345KB
1.5K SLoC

包含 (Mach-o exe, 385KB) examples/echo.cgi

Tortuga

Tortuga 是一个用 Rust 编写的 HTTP CGI 专用服务器。

徽章

Build License Crates.io Version Docs.rs Version

书籍

有关设计目标、非目标等内容,请参阅 Tortuga Web 服务器书籍

RFC

本项目试图实现 CGI RFC

测试

本地安装

要测试命令行界面,请从存储库的根目录安装 crate:

cargo install --path ./

Cargo 测试

要运行单元和文档测试,请使用

cargo test

字节序

虽然系统以网络字节序(即大端序)发送所有数字,但 WebAssembly 使用小端序表示其数字。因此,系统将处理在字节序类型之间映射整数。请参阅 https://tools.ietf.org/html/draft-newman-network-byte-order-01

示例

一些基本的 CGI 程序可以在 /examples 目录中找到。

版本

Tortuga 遵循 语义版本控制。您可以使用 tortuga versiontortuga -V 来确定 Tortuga 安装的版本。

基准

所有基准测试代码都在一个 16 核的 Codespace 上以默认映像运行。使用 apt 软件包安装了 Apache,并从源代码构建了 wrk

Apache

将 Apache 配置为使用默认配置提供 debug.cgi 脚本,以在没有大量负载的情况下获取我们想要追求的性能基准。

脚本

sudo cp examples/*.cgi /usr/lib/cgi-bin
wrk -t5 -c5 -d30s -R20 --latency 'https://127.0.0.1/cgi-bin/debug.cgi/extra/path?foo+bar+--me%202'
wrk -t5 -c5 -d30s -R340 --latency 'https://127.0.0.1/cgi-bin/empty.cgi/extra/path?foo+bar+--me%202'

输出

Running 30s test @ https://127.0.0.1/cgi-bin/debug.cgi/extra/path?foo+bar+--me%202
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    78.12ms    2.29ms  97.98ms   81.50%
    Req/Sec     3.83      2.88     6.00    100.00%
  Latency Distribution (HdrHistogram - Recorded Latency)
 50.000%   77.63ms
 75.000%   78.97ms
 90.000%   80.51ms
 99.000%   86.14ms
 99.900%   98.05ms
 99.990%   98.05ms
 99.999%   98.05ms
100.000%   98.05ms

#[Mean    =       78.119, StdDeviation   =        2.294]
#[Max     =       97.984, Total count    =          400]
#[Buckets =           27, SubBuckets     =         2048]
----------------------------------------------------------
  600 requests in 30.01s, 682.72KB read
Requests/sec:     20.00
Transfer/sec:     22.75KB

Running 30s test @ https://127.0.0.1/cgi-bin/empty.cgi/extra/path?foo+bar+--me%202
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.89ms  632.16us   5.86ms   60.74%
    Req/Sec    71.72     48.95   111.00     68.41%
  Latency Distribution (HdrHistogram - Recorded Latency)
 50.000%    2.87ms
 75.000%    3.40ms
 90.000%    3.70ms
 99.000%    4.22ms
 99.900%    5.22ms
 99.990%    5.81ms
 99.999%    5.86ms
100.000%    5.86ms
#[Mean    =        2.886, StdDeviation   =        0.632]
#[Max     =        5.856, Total count    =         6795]
#[Buckets =           27, SubBuckets     =         2048]
----------------------------------------------------------
  10205 requests in 30.00s, 1.18MB read
Requests/sec:    340.13
Transfer/sec:     40.20KB

无服务器测试

在没有HTTP服务器的情况下运行empty.cgi脚本大约需要5毫秒。因此,我们可能无法将时间缩短到一半以下(因为测试命令启动了2个进程)。Apache在空CGI脚本上大约需要3毫秒,因此开销很小。

cargo build --release
time target/release/tortuga test -s examples/debug.cgi

CGI与WCGI

在4核心Intel CPU上,我运行了以下快速基准测试

未启用编译缓存的WCGI

初始编译会减慢第一个请求。

$ wrk -c 1 -t 1 -d 1s 'https://127.0.0.1:3000/cgi-bin/echo.wcgi/extra/path?--foo+bar'
Running 1s test @ https://127.0.0.1:3000/cgi-bin/echo.wcgi/extra/path?--foo+bar
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.19ms    4.79ms  44.02ms   96.79%
    Req/Sec     2.55k   462.45     3.01k    90.91%
  2791 requests in 1.10s, 272.56KB read
Requests/sec:   2535.83
Transfer/sec:    247.64KB

启用编译缓存的WCGI

通过将服务器指向由wasmtime config new创建的文件来启用缓存。

$ wrk -c 1 -t 1 -d 1s 'https://127.0.0.1:3000/cgi-bin/echo.wcgi/extra/path?--foo+bar'      
Running 1s test @ https://127.0.0.1:3000/cgi-bin/echo.wcgi/extra/path?--foo+bar
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   408.90us  266.19us   3.76ms   92.34%
    Req/Sec     2.59k   260.40     2.84k    81.82%
  2828 requests in 1.10s, 276.17KB read
Requests/sec:   2570.45
Transfer/sec:    251.02KB

CGI

$ wrk -c 1 -t 1 -d 1s 'https://127.0.0.1:3000/cgi-bin/echo.cgi/extra/path?--foo+bar'
Running 1s test @ https://127.0.0.1:3000/cgi-bin/echo.cgi/extra/path?--foo+bar
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     6.68ms    1.08ms   9.74ms   69.33%
    Req/Sec   150.10     13.25   170.00     80.00%
  150 requests in 1.00s, 14.65KB read
Requests/sec:    149.35
Transfer/sec:     14.58KB

静态文件

$ wrk -c 1 -t 1 -d 1s 'https://127.0.0.1:3000/index.html'
Running 1s test @ https://127.0.0.1:3000/index.html
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   221.81us  118.00us   1.45ms   90.75%
    Req/Sec     4.62k   497.28     5.10k    81.82%
  5058 requests in 1.10s, 503.82KB read
Requests/sec:   4598.99
Transfer/sec:    458.10KB

依赖项

~24–39MB
~618K SLoC