| package userns |
| |
| import ( |
| "os" |
| "testing" |
| |
| "github.com/opencontainers/runc/libcontainer/configs" |
| ) |
| |
| func BenchmarkSpawnProc(b *testing.B) { |
| if os.Geteuid() != 0 { |
| b.Skip("spawning user namespaced processes requires root") |
| } |
| |
| // We can reuse the mapping as we call spawnProc() directly. |
| mapping := Mapping{ |
| UIDMappings: []configs.IDMap{ |
| {ContainerID: 0, HostID: 1337, Size: 142}, |
| {ContainerID: 150, HostID: 0, Size: 1}, |
| {ContainerID: 442, HostID: 1111, Size: 12}, |
| {ContainerID: 1000, HostID: 9999, Size: 92}, |
| {ContainerID: 9999, HostID: 1000000, Size: 4}, |
| // Newer kernels support more than 5 entries, but stick to 5 here. |
| }, |
| GIDMappings: []configs.IDMap{ |
| {ContainerID: 1, HostID: 2337, Size: 142}, |
| {ContainerID: 145, HostID: 6, Size: 1}, |
| {ContainerID: 200, HostID: 1000, Size: 12}, |
| {ContainerID: 1000, HostID: 9888, Size: 92}, |
| {ContainerID: 8999, HostID: 1000000, Size: 4}, |
| // Newer kernels support more than 5 entries, but stick to 5 here. |
| }, |
| } |
| |
| procs := make([]*os.Process, 0, b.N) |
| b.Cleanup(func() { |
| for _, proc := range procs { |
| if proc != nil { |
| _ = proc.Kill() |
| _, _ = proc.Wait() |
| } |
| } |
| }) |
| |
| for i := 0; i < b.N; i++ { |
| proc, err := spawnProc(mapping) |
| if err != nil { |
| b.Error(err) |
| } |
| procs = append(procs, proc) |
| } |
| } |