현재 여러 번 응답을 중지하고 완전히 잠긴 것처럼 보이는 프로세스가 있습니다. strace 시도나 gdb를 통한 보기에는 응답하지 않습니다(gdb는 wait4() 시스템 호출에서 중단됩니다). 프로세스는 실행 가능하며 시스템 호출(/proc/X/syscall:) running
또는 중단 없는 절전 모드(/proc/X/status:)를 기다리지 않습니다 State: R (running)
.
이 프로세스의 상태는 어떻습니까? 이것은 일종의 커널 버그일 수 있습니까?
프로세스는 redis이며 이런 일이 몇 번 발생했습니다. 프로세스를 종료할 수 있는 유일한 방법은 재부팅뿐입니다. 운영체제는 Cent7 입니다.
편집: 커널 버전은 3.10.0-123.13.2.el7.x86_64입니다. 3.10.0-229.11.1.el7로 업데이트해 보고 차이가 있는지 확인하세요.
답변1
wait4는 프로세스가 자식 중 하나가 종료되기를 기다리고 있음을 나타내는 시스템 호출입니다. 이는 신호 처리에 일부 문제가 있음을 나타낼 수 있습니다.
조금 잔인하지만 누군가를 죽이려고 할 수도 있어요계층애플리케이션: kill -15 -$YourRedisPID
.this-PID는 이전에 "PID 및 해당 하위 프로세스"를 의미했습니다. 하위 프로세스가 종료되기를 기다리는 것으로 나타나므로 잠금을 해제할 수도 있습니다.
작동하지 않으면 더 자세히 확인해 보겠습니다. 다음을 사용하여 신호 처리 상태를 찾으세요.grep ^Sig /proc/$YourRedisPID/status
다음과 같은 내용이 표시됩니다.
SigQ: 8/62777
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000180004023
커널 소스 코드 "fs/proc/array.c"에 정의된 대로 "SigQ"는 보류 중인 신호 수/보류 중인 신호의 제한입니다.
신호 수가 너무 많으면 "SIGKILL"이 전혀 처리되지 않고 있음을 나타낼 수 있습니다. 나는 이러한 특수 신호의 신호 관리를 이해하기 위해 여전히 "kernel/signal.c" 파일을 확인하고 있습니다.
출력을 직접 이해하려면 다음 줄을 시도해 보십시오.
awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc
이것은 나를 출력합니다 :
0
0
10000000
110000000000000000100000000100011
이 출력을 보내는 것부터 시작해 보겠습니다. 필요에 따라 게시물을 업데이트하겠습니다.