google / google/gvisor

Optimize the syscall handling

Open
#2,354 0 comments 0 reactions 0 assignees View on GitHub
area: performance priority: p2 type: enhancement
Dominant language
Go
Stars
19.3k
Forks
2k
Avg merge
3d 5h
Merged PRs (30d)
264

Description

We did a breakdown of syscall costs in gVisor. Below is the data:

```
# https://github.com/btw616/gvisor/tree/syscall/breakdown/ring0_sysenter
# gvisor.dev/gvisor/pkg/sentry/platform/ring0.sysenter
ring0 sysenter: ~39ns
```

```
# https://github.com/btw616/gvisor/tree/syscall/breakdown/ring0_CPU_SwitchToUser
# gvisor.dev/gvisor/pkg/sentry/platform/ring0.(*CPU).SwitchToUser
# -> gvisor.dev/gvisor/pkg/sentry/platform/ring0.sysenter
# -> gvisor.dev/gvisor/pkg/sentry/platform/ring0.writeCR3
# -> ...
# -> gvisor.dev/gvisor/pkg/sentry/platform/ring0.sysret
ring0 CPU SwitchToUser: ~294ns
```

```
# https://github.com/btw616/gvisor/tree/syscall/breakdown/ring0_CPU_SwitchToUser
# + WriteFS(uintptr(c.registers.Fs_base))
# + WriteFS(uintptr(regs.Fs_base))
# + WriteGS(uintptr(regs.Gs_base))
ring0 CPU SwitchToUser (+fsgs): ~312ns
```

```
# https://github.com/btw616/gvisor/tree/syscall/breakdown/ring0_CPU_SwitchToUser
# + ...
# + SaveFloatingPoint(switchOpts.FloatingPointState)
# + LoadFloatingPoint(switchOpts.FloatingPointState)
ring0 CPU SwitchToUser (+fsgs +floatpoint): ~365ns
```

```
# https://github.com/btw616/gvisor/tree/syscall/breakdown/kvm_vCPU_SwitchToUser
# gvisor.dev/gvisor/pkg/sentry/platform/kvm.(*vCPU).SwitchToUser
# -> gvisor.dev/gvisor/pkg/sentry/platform/ring0.(*CPU).SwitchToUser
kvm vCPU SwitchToUser: ~373ns
```

```
# https://github.com/btw616/gvisor/tree/syscall/breakdown/kvm_context_Switch
# gvisor.dev/gvisor/pkg/sentry/platform/kvm.(*context).Switch
# -> gvisor.dev/gvisor/pkg/sentry/platform/kvm.(*vCPU).SwitchToUser
# -> gvisor.dev/gvisor/pkg/sentry/platform/ring0.(*CPU).SwitchToUser
kvm context Switch: ~505ns
```

```
# https://github.com/btw616/gvisor/tree/syscall/breakdown/kernel_runApp_execute
# gvisor.dev/gvisor/pkg/sentry/kernel.(*runApp).execute
# -> gvisor.dev/gvisor/pkg/sentry/platform/kvm.(*context).Switch
# -> gvisor.dev/gvisor/pkg/sentry/platform/kvm.(*vCPU).SwitchToUser
# -> gvisor.dev/gvisor/pkg/sentry/platform/ring0.(*CPU).SwitchToUser
kernel runApp execute: ~682ns
```

And getpid takes ~849ns which is slower than Linux (even with PTI on).
It looks possible for us to make the syscall faster in gVisor.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.