5 个版本
0.7.2 | 2024 年 1 月 8 日 |
---|---|
0.6.3 | 2024 年 1 月 2 日 |
0.6.0 | 2023 年 12 月 30 日 |
0.5.4 |
|
0.1.0 |
|
#159 in WebAssembly
117 每月下载量
345KB
1.5K SLoC
包含 (Mach-o exe, 385KB) examples/echo.cgi
Tortuga
Tortuga 是一个用 Rust 编写的 HTTP CGI 专用服务器。
徽章
书籍
有关设计目标、非目标等内容,请参阅 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 version
或 tortuga -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