Docker Kill의 주요 프로세스
1. Docker 엔진은 SIGKILL을 사용하여 일정 시간 동안 기다린 후 컨테이너 종료 메시지를 받으면 컨테이너를 종료합니다. 성공했습니다.
2. 이전 단계에서 대기 시간이 초과되면 Docker 엔진은 Containerd를 건너뛰고 kill 시스템 호출을 통해 컨테이너 기본 프로세스에 SIGKILL 신호를 보냅니다. kill 시스템 호출이 현재 기본 프로세스가 존재하지 않는다고 반환하면 Docker kill이 성공한 것입니다. 그렇지 않으면, 컨테이너가 엔진을 통과하고 컨테이너가 종료될 때까지 엔진은 정지된 상태로 유지됩니다.
문제가 발생하면 호스트 머신에서 다수의 스트레스 프로세스(실제로는 컨테이너 프로세스)가 D 상태인 것으로 확인되어 시스템 응답이 느려집니다. 문제는 다음과 같이 설명할 수 있습니다.
1. 시스템 응답 속도가 느리고 컨테이너의 내부 하위 프로세스(스트레스)가 D에 있기 때문에 Docker kill이 컨테이너 메인 프로세스에 간접적으로 SIGKill 신호를 보냅니다. 상태에서는 컨테이너가 제한 시간 내에 컨테이너 종료를 보고하지 않습니다. Docker kill이 Sigkill
2을 직접 보내는 단계에 이르렀습니다. 이 단계 이전에는 컨테이너 내부의 주요 프로세스가 종료되었기 때문에 시스템 호출 kill 및 send SIGKILL은 곧 프로세스가 존재하지 않는다는 것을 반환합니다. 엔진은 컨테이너를 종료했다고 생각하고 Docker kill이 성공적으로 반환됩니다.
3. 일정 시간이 지나면 컨테이너 하위 프로세스가 종료되고, Containerd는 컨테이너 종료를 보고하며, 이때 Docker ps는 컨테이너가 삭제되었음을 확인합니다. 종료 상태에요.
컨테이너 마스터/하위 프로세스가 D 상태입니다.
프로세스 D 상태는 프로세스가 중단할 수 없는 절전 상태에 있으며 일반적으로 IO 리소스를 기다리고 있음을 의미합니다. 물론 때로는 시스템 IO에 문제가 있는 경우 D 상태의 프로세스가 많이 있을 수 있습니다. 이 상태에서는 신호가 프로세스를 깨울 수 없으며 프로세스가 D 상태에서 돌아올 때까지만 기다릴 수 있습니다. 그리고 기존 커널에서는 프로세스가 D 상태에 있었다면 이론적으로 시스템을 다시 시작하는 것 외에는 이를 D에서 되돌릴 수 있는 방법이나 수단이 없습니다.
더 많은 관련 튜토리얼을 보려면 PHP 중국어 웹사이트의 docker tutorial 칼럼을 주목하세요.
위 내용은 docker kill이 때때로 실행 중인 컨테이너를 종료하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!