/var/log/messages를 사용하여 메모리 부족 디버깅

/var/log/messages를 사용하여 메모리 부족 디버깅

내 메시지 로그에 다음 보고서가 표시됩니다.

kernel: Out of memory: Kill process 9163 (mysqld) score 511 or sacrifice child
kernel: Killed process 9163, UID 27, (mysqld) total-vm:2457368kB, anon-rss:816780kB, file-rss:4kB

httpd이 질문이 대상인지는 중요하지 mysqld않지만 postfix문제를 계속 디버깅하는 방법이 궁금합니다.

PID 9163이 종료된 이유에 대한 추가 정보를 어떻게 얻을 수 있습니까? Linux가 종료된 PID 기록을 어딘가에 보관하고 있는지 확실하지 않습니다.

메시지 로그 파일에서 이 문제가 발생하면 이 문제를 단계별로 어떻게 해결하시겠습니까?

# free -m

             total       used       free     shared    buffers     cached
Mem:          1655        934        721          0         10         52
-/+ buffers/cache:        871        784
Swap:          109          6        103`

답변1

이런 일이 발생하기 전에 커널은 많은 내용을 기록하지만 구성 /var/log/messages방법에 따라 대부분은 로그인되지 않을 수 있습니다 (r)syslogd. 노력하다:

grep oom /var/log/*
grep total_vm /var/log/*

전자는 여러 번 나타나야 하고, 후자는 한두 군데에만 나타나야 합니다. 보려는 파일입니다.

total_vm해당 줄 앞에 30초에서 1분(아마도 더 많을 수도 있고 더 적을 수도 있음) 다음과 같은 내용이 표시됩니다 .

kernel: foobar invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

또한 이 행과 "메모리 부족" 행 사이에 다음 제목의 테이블이 있어야 합니다.

[ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name

이는 아마도 여러분이 이미 알고 있는 것 이상을 알려주지 않을 것입니다. 그러나 이러한 필드는 다음과 같습니다.

  • PID프로세스 ID.
  • UID사용자 ID.
  • tgid스레드 그룹 ID.
  • 총 가상 머신 수가상 메모리 사용량(4kB 페이지)
  • RSS상주 메모리 사용량(4kB 페이지 단위)
  • nr_ptes페이지 테이블 항목
  • 통화 교환교환 항목
  • oom_score_adj일반적으로 0이 낮을수록 OOM Killer가 호출될 때 프로세스가 종료될 가능성이 적다는 것을 의미합니다.

기본적으로 무시해도 되지만 nr_ptes, swapents나는 이것이 누가 죽는지를 결정하는 요소라고 믿습니다. 이는 반드시 가장 많은 메모리를 사용하는 프로세스는 아니지만 아마도 그럴 것입니다. 선정 과정에 대한 자세한 내용은이봐. 기본적으로 가장 높은 oom 점수로 끝나는 프로세스가 종료됩니다. 이는 "메모리 부족" 줄에 보고된 "점수"입니다. 불행하게도 다른 점수는 보고되지 않지만 표는 요인에 대한 몇 가지 단서를 제공합니다. .

그렇다면 다시 한 번, 이는 명백한 사실을 설명할 수 있습니다. 시스템에 메모리가 부족하여 mysqld종료를 선택했습니다.죽이면 대부분의 리소스가 확보되기 때문입니다.. 이것이 반드시 mysqld뭔가 잘못되었다는 의미는 아닙니다 . 테이블을 보면 당시에 다른 문제가 있는지 확인할 수 있지만 명확한 원인은 없을 수도 있습니다. 실행 중인 프로세스를 잘못 판단하거나 잘못 구성했기 때문에 시스템에 메모리가 부족할 수도 있습니다.

답변2

핵심은 메시지 자체에 있습니다.충분한 저장. Linux 커널에 가상 메모리(물리적 RAM + 스왑)가 부족하면 프로세스가 종료되기 시작하는데, 이것이 바로 여기서 일어나고 있는 일입니다. mysqld가상 메모리가 2GB 이상 사용되는 것 같습니다 .

시스템에 얼마나 많은 RAM과 스왑 공간이 있습니까? 추가 메모리를 추가하는 것을 고려해 보거나, 가능하지 않은 경우 추가 스왑 공간을 고려합니다. 적어도 프로세스가 종료되는 것을 방지하기 위한 빠른 수정으로 스왑 파일을 추가할 수 있습니다.

고쳐 쓰다:가지고 있는 RAM의 양을 살펴보면 즉시 문제를 확인할 수 있습니다. 약 1.6GB의 RAM과 100MB의 스왑 공간이 있지만 MySQL은 그보다 훨씬 더 많은 RAM을 사용합니다. 이는 프로세스가 종료되는 이유를 설명합니다.

관련 정보