runtime: only check killall for init process

When containerd-shim does reaper, the most processes are not init
process. Since json.Decode consumes more CPU resource, we should check
killall option for init process only.

Signed-off-by: Wei Fu <fuweid89@gmail.com>
This commit is contained in:
Wei Fu 2019-08-20 19:18:34 +08:00
parent c6da899e2f
commit 1073868e5e
2 changed files with 51 additions and 44 deletions

View File

@ -514,23 +514,26 @@ func (s *Service) allProcesses() []process.Process {
} }
func (s *Service) checkProcesses(e runc.Exit) { func (s *Service) checkProcesses(e runc.Exit) {
for _, p := range s.allProcesses() {
if p.Pid() != e.Pid {
continue
}
if ip, ok := p.(*process.Init); ok {
shouldKillAll, err := shouldKillAllOnExit(s.bundle) shouldKillAll, err := shouldKillAllOnExit(s.bundle)
if err != nil { if err != nil {
log.G(s.context).WithError(err).Error("failed to check shouldKillAll") log.G(s.context).WithError(err).Error("failed to check shouldKillAll")
} }
for _, p := range s.allProcesses() {
if p.Pid() == e.Pid {
if shouldKillAll {
if ip, ok := p.(*process.Init); ok {
// Ensure all children are killed // Ensure all children are killed
if shouldKillAll {
if err := ip.KillAll(s.context); err != nil { if err := ip.KillAll(s.context); err != nil {
log.G(s.context).WithError(err).WithField("id", ip.ID()). log.G(s.context).WithError(err).WithField("id", ip.ID()).
Error("failed to kill init's children") Error("failed to kill init's children")
} }
} }
} }
p.SetExited(e.Status) p.SetExited(e.Status)
s.events <- &eventstypes.TaskExit{ s.events <- &eventstypes.TaskExit{
ContainerID: s.id, ContainerID: s.id,
@ -541,7 +544,6 @@ func (s *Service) checkProcesses(e runc.Exit) {
} }
return return
} }
}
} }
func shouldKillAllOnExit(bundlePath string) (bool, error) { func shouldKillAllOnExit(bundlePath string) (bool, error) {

View File

@ -645,23 +645,30 @@ func (s *service) checkProcesses(e runcC.Exit) {
defer s.mu.Unlock() defer s.mu.Unlock()
for _, container := range s.containers { for _, container := range s.containers {
if container.HasPid(e.Pid) { if !container.HasPid(e.Pid) {
continue
}
for _, p := range container.All() {
if p.Pid() != e.Pid {
continue
}
if ip, ok := p.(*process.Init); ok {
shouldKillAll, err := shouldKillAllOnExit(container.Bundle) shouldKillAll, err := shouldKillAllOnExit(container.Bundle)
if err != nil { if err != nil {
log.G(s.context).WithError(err).Error("failed to check shouldKillAll") log.G(s.context).WithError(err).Error("failed to check shouldKillAll")
} }
for _, p := range container.All() {
if p.Pid() == e.Pid {
if shouldKillAll {
if ip, ok := p.(*process.Init); ok {
// Ensure all children are killed // Ensure all children are killed
if shouldKillAll {
if err := ip.KillAll(s.context); err != nil { if err := ip.KillAll(s.context); err != nil {
logrus.WithError(err).WithField("id", ip.ID()). logrus.WithError(err).WithField("id", ip.ID()).
Error("failed to kill init's children") Error("failed to kill init's children")
} }
} }
} }
p.SetExited(e.Status) p.SetExited(e.Status)
s.sendL(&eventstypes.TaskExit{ s.sendL(&eventstypes.TaskExit{
ContainerID: container.ID, ContainerID: container.ID,
@ -672,10 +679,8 @@ func (s *service) checkProcesses(e runcC.Exit) {
}) })
return return
} }
}
return return
} }
}
} }
func shouldKillAllOnExit(bundlePath string) (bool, error) { func shouldKillAllOnExit(bundlePath string) (bool, error) {