SIGKILL 및 전원 끄기

SIGKILL 및 전원 끄기

갑작스런 정전과 SIGKILL 실행 프로그램의 차이점은 무엇입니까?

데이터베이스를 사용하는 마이크로서비스가 있습니다. 나는 갑작스러운 정전(정상 종료는 아니지만 UPS 없이 전원 플러그를 뽑는 것)을 시뮬레이션하는 자동화된 테스트를 만드는 임무를 맡았습니다. 그 목적은 정전 후에도 데이터베이스가 여전히 일관성을 유지하는지 확인하려는 것입니다. 을(를) 사용할 계획입니다 killall -9 microservice_name. 이 시뮬레이션은 얼마나 좋은가요? 둘 중 하나를 수행하는 것이 더 해로운가요? 특히 파일 버퍼를 플러시(또는 플러시하지 않음)하는 것에 대해 우려하고 있지만 다른 차이점이 있을까요?

보너스 질문: 실제 전력이 아닌 가상 머신의 갑작스러운 종료를 비교하면 어떻게 되나요?

답변1

프로세스 관점에서는 큰 차이가 없습니다. A는 SIGKILL(가능한 경우) 요청하지 않고 즉시 프로세스를 종료합니다.

하지만 주변의 이야기는 달랐다. 디스크 쓰기를 고려하십시오. 프로세스 호출이 write()성공하면 운영 체제에 책임이 전달됩니다. 지금 프로세스를 종료해도 작성된 데이터가 손실되지는 않습니다. 이를 보장하는 것은 OS의 임무입니다. 그러나 운영 체제가 아직 데이터를 디스크에 보내지 않았거나 디스크가 아직 영구 저장소에 쓰지 않았을 수 있기 때문에 데이터는 여전히 영구 저장소에 안전하지 않게 저장됩니다.

전체 시스템의 플러그를 뽑으면 운영 체제의 모든 메모리 캐시(일반적으로 완전한 종료를 보장하기 위해 UPS를 사용해야 하는 이유)와 저장 장치의 휘발성 캐시(고가의 제품에 자체 배터리가 있는 이유)가 모두 지워집니다. .

가상 머신을 강제로 종료하는 것은 그 사이 어딘가에 있습니다. 가상 머신 관리자가 종료되면 그 안에 있는 모든 내용이 손실됩니다. 하지만 호스트 시스템으로 전송된 모든 항목은 안전해야 합니다.

얼마나 큰 차이가 나는지는 시나리오(및 위험 평가)에 따라 다릅니다. 하드웨어 오류에 대한 복원력이 있는 하위 수준 데이터베이스를 테스트하는 경우 실제로 플러그를 뽑아 테스트하는 것이 중요할 수 있습니다. 그러나 이러한 종류의 작업을 처리하는 데이터베이스를 사용하는 고급 애플리케이션을 테스트하는 경우 모든 것을 직접 테스트할 필요는 없을 것입니다.

나는 모든 심각한 데이터베이스 애플리케이션이 최소한노력하다특히 SQLite를 사용하여 정전을 현명하게 처리하기 이를 위해 수행하는 작업을 설명하는 많은 기사가 있습니다.https://www.sqlite.org/atomiccommit.html그리고https://www.sqlite.org/howtocorrupt.html.

참고: 저는 SIGKILL에게 "할 수 있다면"이라고 말했습니다. 운영 체제에 따라 SIGKILL이 프로세스를 종료하지 못하는 경우도 있습니다. 예를 들어 Linux에서 "논스톱 절전" 상태(D)의 프로세스는 해결될 때까지 종료되지 않습니다. 예를 들면 다음을 참조하세요.SIGKILL 신호를 보낼 때 프로그램은 무엇을 합니까?그리고종료할 수 없는 작업을 종료하는 방법(무중단?)

관련 정보