Optimize the syscall handling
- 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
Assessment
This issue has not been assessed yet.