This commit supports a third-party network stack as a plugin stack for
gVisor.
The overall plugin package structure is the following:
- pkg/sentry/socket/plugin:
Interfaces for initializing plugin network stack. It will be used
in network setting up during sandbox creating.
- pkg/sentry/socket/plugin/stack:
Glue layer for plugin stack's socket and stack ops with sentry. It
will also register plugin stack operations if imported.
- pkg/sentry/socket/plugin/cgo:
Interfaces defined in C for plugin network stack to support.
To build target runsc-plugin-stack, which imports
pkg/sentry/socket/plugin/stack package and enables CGO:
bazel build --config=plugin-tldk runsc:runsc-plugin-stack
(i.e. --config=plugin-tldk indicates that using TLDK as plugin stack)
By using runsc-plugin-stack binary and setting "--network=plugin" in
runtimeArgs, user can use third-party network stack instead of
netstack embedded in gVisor to get better network performance.
Redis benchmark with following setups:
1. KVM platform
2. 4 physical cores for target pod
3. target pod as redis server
Runc:
$redis-benchmark -h [target ip] -n 100000 -t get,set -q
SET: 115207.38 requests per second, p50=0.215 msec
GET: 92336.11 requests per second, p50=0.279 msec
$redis-benchmark -h [target ip] -n 100000 -t get,set -q
SET: 113895.21 requests per second, p50=0.247 msec
GET: 96899.23 requests per second, p50=0.271 msec
$redis-benchmark -h [target ip] -n 100000 -t get,set -q
SET: 126582.27 requests per second, p50=0.199 msec
GET: 95969.28 requests per second, p50=0.271 msec
Runsc with plugin stack:
$redis-benchmark -h [target ip] -n 100000 -t get,set -q
SET: 123915.74 requests per second, p50=0.343 msec
GET: 115473.45 requests per second, p50=0.335 msec
$redis-benchmark -h [target ip] -n 100000 -t get,set -q
SET: 120918.98 requests per second, p50=0.351 msec
GET: 117647.05 requests per second, p50=0.351 msec
$redis-benchmark -h [target ip] -n 100000 -t get,set -q
SET: 119904.08 requests per second, p50=0.367 msec
GET: 112739.57 requests per second, p50=0.375 msec
Runsc with netstack:
$redis-benchmark -h [target ip] -n 100000 -t get,set -q
SET: 59952.04 requests per second, p50=0.759 msec
GET: 61162.08 requests per second, p50=0.631 msec
$redis-benchmark -h [target ip] -n 100000 -t get,set -q
SET: 52219.32 requests per second, p50=0.719 msec
GET: 58719.91 requests per second, p50=0.663 msec
$redis-benchmark -h [target ip] -n 100000 -t get,set -q
SET: 59952.04 requests per second, p50=0.751 msec
GET: 60827.25 requests per second, p50=0.751 msec
Updates google#9266
Co-developed-by: Tianyu Zhou <wentong.zty@antgroup.com>
Signed-off-by: Anqi Shen <amy.saq@antgroup.com>