mirror of https://github.com/rapiz1/rathole.git
docs: update benchmark and add about memory usage
This commit is contained in:
parent
1180c7e538
commit
4a1da9be7f
|
@ -1,7 +1,7 @@
|
||||||
# rathole
|
# rathole
|
||||||

|

|
||||||
|
|
||||||
A fast, secure and stable reverse proxy for NAT traversal, written in Rust
|
A secure, stable and high-performance reverse proxy for NAT traversal, written in Rust
|
||||||
|
|
||||||
rathole, like [frp](https://github.com/fatedier/frp) and [ngrok](https://github.com/inconshreveable/ngrok), can help to expose the service on the device behind the NAT to the Internet, via a server with a public IP.
|
rathole, like [frp](https://github.com/fatedier/frp) and [ngrok](https://github.com/inconshreveable/ngrok), can help to expose the service on the device behind the NAT to the Internet, via a server with a public IP.
|
||||||
|
|
||||||
|
@ -131,13 +131,14 @@ If `RUST_LOG` is not present, the default logging level is `info`.
|
||||||
|
|
||||||
## Benchmark
|
## Benchmark
|
||||||
|
|
||||||
rathole has similiar latency to [frp](https://github.com/fatedier/frp), but can handle more connections. Also it can provide much better bandwidth than frp.
|
rathole has similiar latency to [frp](https://github.com/fatedier/frp), but can handle a more connections, provide larger bandwidth, with less memory usage.
|
||||||
|
|
||||||
See also [Benchmark](./docs/benchmark.md).
|
See also [Benchmark](./docs/benchmark.md).
|
||||||
|
|
||||||
|

|
||||||

|

|
||||||
|

|
||||||

|

|
||||||
|
|
||||||
## Development Status
|
## Development Status
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
#!/bin/sh
|
||||||
|
RATE="1 1000 2000 3000 4000"
|
||||||
|
DURATION="60s"
|
||||||
|
|
||||||
|
RATHOLE="http://127.0.0.1:5202"
|
||||||
|
FRP="http://127.0.0.1:5203"
|
||||||
|
|
||||||
|
echo warming up frp
|
||||||
|
echo GET $FRP | vegeta attack -duration 10s > /dev/null
|
||||||
|
for rate in $RATE; do
|
||||||
|
name="frp-${rate}qps-$DURATION.bin"
|
||||||
|
echo $name
|
||||||
|
echo GET $FRP | vegeta attack -rate $rate -duration $DURATION > $name
|
||||||
|
vegeta report $name
|
||||||
|
done
|
||||||
|
|
||||||
|
echo warming up rathole
|
||||||
|
echo GET $RATHOLE | vegeta attack -duration 10s > /dev/null
|
||||||
|
for rate in $RATE; do
|
||||||
|
name="rathole-${rate}qps-$DURATION.bin"
|
||||||
|
echo $name
|
||||||
|
echo GET $RATHOLE | vegeta attack -rate $rate -duration $DURATION > $name
|
||||||
|
vegeta report $name
|
||||||
|
done
|
|
@ -0,0 +1,46 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
rm -v *-mem.log
|
||||||
|
|
||||||
|
echo frp
|
||||||
|
while true; do
|
||||||
|
ps -C frpc -o rsz= >> frpc-mem.log
|
||||||
|
sleep 1
|
||||||
|
done &
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
ps -C frps -o rsz= >> frps-mem.log
|
||||||
|
sleep 1
|
||||||
|
done &
|
||||||
|
|
||||||
|
echo GET http://127.0.0.1:5203 | vegeta attack -duration 30s -rate 1000 > /dev/null
|
||||||
|
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
kill $(jobs -p)
|
||||||
|
|
||||||
|
|
||||||
|
echo rathole
|
||||||
|
|
||||||
|
pid_s=$(ps aux | grep "rathole -s" | head -n 1 | awk '{print $2}')
|
||||||
|
while true; do
|
||||||
|
ps --pid $pid_s -o rsz= >> ratholec-mem.log
|
||||||
|
sleep 1
|
||||||
|
done &
|
||||||
|
|
||||||
|
pid_c=$(ps aux | grep "rathole -c" | head -n 1 | awk '{print $2}')
|
||||||
|
while true; do
|
||||||
|
ps --pid $pid_c -o rsz= >> ratholes-mem.log
|
||||||
|
sleep 1
|
||||||
|
done &
|
||||||
|
|
||||||
|
echo GET http://127.0.0.1:5202 | vegeta attack -duration 30s -rate 1000 > /dev/null
|
||||||
|
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
kill $(jobs -p)
|
||||||
|
|
||||||
|
gawk -i inplace '{print $1 "000"}' frpc-mem.log
|
||||||
|
gawk -i inplace '{print $1 "000"}' frps-mem.log
|
||||||
|
gawk -i inplace '{print $1 "000"}' ratholec-mem.log
|
||||||
|
gawk -i inplace '{print $1 "000"}' ratholes-mem.log
|
|
@ -0,0 +1,18 @@
|
||||||
|
set title "Memory Usage" font ",20"
|
||||||
|
|
||||||
|
set term png small size 800,600
|
||||||
|
set key box outside
|
||||||
|
|
||||||
|
set output "mem-graph.png"
|
||||||
|
|
||||||
|
set ylabel "RSZ"
|
||||||
|
set format y '%.0s%cB'
|
||||||
|
|
||||||
|
set ytics nomirror
|
||||||
|
|
||||||
|
set yrange [0:*]
|
||||||
|
|
||||||
|
plot "frps-mem.log" using 1 with lines axes x1y1 title "frps RSZ", \
|
||||||
|
"frpc-mem.log" using 1 with lines axes x1y1 title "frpc RSZ", \
|
||||||
|
"ratholes-mem.log" using 1 with lines axes x1y1 title "ratholes RSZ", \
|
||||||
|
"ratholec-mem.log" using 1 with lines axes x1y1 title "ratholec RSZ"
|
|
@ -1,17 +1,19 @@
|
||||||
# Benchmark
|
# Benchmark
|
||||||
|
|
||||||
> Date: 2021/12/14
|
> Date: 2021/12/28
|
||||||
>
|
>
|
||||||
> Arch Linux with 5.15.7-arch1-1 kernel
|
> Version: commit 1180c7e538564efd69742f22e77453a1b74a5ed2
|
||||||
>
|
>
|
||||||
> Intel i7-6600U CPU @ 2.60GHz
|
> Arch Linux with 5.15.11-arch2-1 kernel
|
||||||
>
|
>
|
||||||
> 20GB RAM
|
> Intel Xeon CPU E5-2620 @ 2.00GHz *2
|
||||||
|
>
|
||||||
|
> 16GB RAM
|
||||||
|
|
||||||
|
## Bandwidth
|
||||||
## Bitrate
|
|
||||||
|
|
||||||

|

|
||||||
|

|
||||||
|
|
||||||
rathole with the following configuration:
|
rathole with the following configuration:
|
||||||
```toml
|
```toml
|
||||||
|
@ -19,14 +21,20 @@ rathole with the following configuration:
|
||||||
remote_addr = "localhost:2333"
|
remote_addr = "localhost:2333"
|
||||||
default_token = "123"
|
default_token = "123"
|
||||||
|
|
||||||
[client.services.foo1]
|
[client.services.bench-tcp]
|
||||||
|
local_addr = "127.0.0.1:80"
|
||||||
|
[client.services.bench-udp]
|
||||||
|
type = "udp"
|
||||||
local_addr = "127.0.0.1:80"
|
local_addr = "127.0.0.1:80"
|
||||||
|
|
||||||
[server]
|
[server]
|
||||||
bind_addr = "0.0.0.0:2333"
|
bind_addr = "0.0.0.0:2333"
|
||||||
default_token = "123"
|
default_token = "123"
|
||||||
|
|
||||||
[server.services.foo1]
|
[server.services.bench-tcp]
|
||||||
|
bind_addr = "0.0.0.0:5202"
|
||||||
|
[server.services.bench-udp]
|
||||||
|
type = "udp"
|
||||||
bind_addr = "0.0.0.0:5202"
|
bind_addr = "0.0.0.0:5202"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -41,16 +49,20 @@ token = 1233
|
||||||
# frpc.ini
|
# frpc.ini
|
||||||
[common]
|
[common]
|
||||||
server_addr = 127.0.0.1
|
server_addr = 127.0.0.1
|
||||||
#server_addr = 47.100.208.60
|
|
||||||
server_port = 7000
|
server_port = 7000
|
||||||
authentication_method = token
|
authentication_method = token
|
||||||
token = 1233
|
token = 1233
|
||||||
|
|
||||||
[ssh]
|
[bench-tcp]
|
||||||
type = tcp
|
type = tcp
|
||||||
local_ip = 127.0.0.1
|
local_ip = 127.0.0.1
|
||||||
local_port = 80
|
local_port = 80
|
||||||
remote_port = 5203
|
remote_port = 5203
|
||||||
|
[bench-udp]
|
||||||
|
type = udp
|
||||||
|
local_ip = 127.0.0.1
|
||||||
|
local_port = 80
|
||||||
|
remote_port = 5203
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -71,17 +83,50 @@ For frp benchmark:
|
||||||
$ iperf3 -c 127.0.0.1 -p 5203
|
$ iperf3 -c 127.0.0.1 -p 5203
|
||||||
```
|
```
|
||||||
|
|
||||||
## Latency
|
## HTTP
|
||||||
|
|
||||||
nginx/1.20.2 listens on port 80, with the default test page.
|
nginx/1.20.2 listens on port 80, with the default test page.
|
||||||
|
|
||||||
frp and rathole configuration is same with the previous section.
|
frp and rathole configuration is same with the previous section.
|
||||||
|
|
||||||
Using [ali](https://github.com/nakabonne/ali) with different rate.
|
[vegeta](https://github.com/tsenart/vegeta) is used to generate HTTP load.
|
||||||
|
|
||||||
|
### HTTP Throughput
|
||||||
|
|
||||||
|
The following commands are used to benchmark rathole and frp. Note that if you want to do a benchmark yourself, `-max-workers` should be adjusted to get the accurate results for your machine.
|
||||||
|
|
||||||
e.g. for rathole 10 QPS benchmark:
|
|
||||||
```
|
```
|
||||||
ali -r 10 http://127.0.0.1:5202
|
echo 'GET http://127.0.0.1:5203' | vegeta attack -rate 0 -duration 30s -max-workers 48
|
||||||
|
echo 'GET http://127.0.0.1:5202' | vegeta attack -rate 0 -duration 30s -max-workers 48
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
### HTTP Latency
|
||||||
|
|
||||||
|
`rathole` has very similar latency to `frp`, but can handle more connections
|
||||||
|
|
||||||
|
Here's a table, latency is in ms
|
||||||
|
|
||||||
|
|QPS|latency(rathole)|latency(frp)|
|
||||||
|
|--|--|---|
|
||||||
|
|1|2.113|2.55|
|
||||||
|
|1000|1.723|1.742|
|
||||||
|
|2000|1.845|1.749|
|
||||||
|
|3000|2.064|2.011|
|
||||||
|
|4000|2.569|7907|
|
||||||
|
|
||||||
|
As you can see, for QPS from 1 to 3000, rathole and frp have nearly identical latency.
|
||||||
|
But with QPS of 4000, frp starts reporting lots of errors and the latency grows to even seconds. This kind of reflects the throughput in the previous section.
|
||||||
|
|
||||||
|
Thus, in terms of latency, rathole and frp are nearly the same. But rathole can handle more connections.
|
||||||
|
|
||||||
|
[Script to benchmark latency](../benches/scripts/http/latency.sh)
|
||||||
|
|
||||||
|
## Memory Usage
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
rathole uses much less memory than frp.
|
||||||
|
|
||||||
|
[Script to benchmark memory](../benches/scripts/mem/mem.sh)
|
||||||
|
|
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 56 KiB |
Binary file not shown.
After Width: | Height: | Size: 4.6 KiB |
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 62 KiB |
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 139 KiB |
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 54 KiB |
Loading…
Reference in New Issue