무언가가 모든 메모리를 소비합니다 (일부 앱에서 메모리 누수가 의심됩니다). 무엇을 감지하는 방법?


16

liquidsoap + icecast 번들과 간단한 웹 사이트 (httpd + mysqld)를 실행하는 서버가 있습니다. 특별한 것은 없습니다. 방문자는 하루에 약 2000 명 이상이며 평균 50 명 정도가 동시에 온라인 상태입니다.

서버에는 8GB RAM이 있습니다. 시간이 지남에 따라 서버에서 새로운 시작이없고 새로운 사용자가 없지만 사용 가능한 메모리 양이 지속적으로 줄어 듭니다. 어느 시점에서 스왑이 시작되고 서버의로드가 증가하여 응답하지 않습니다. 일반적으로 서버를 다시 시작하면됩니다.

정확히 메모리 누수를 감지하려면 어떻게해야합니까? top을 사용하여 리소스 사용을 모니터링하지만 도움이되는 것은 없습니다.

여기에 이미지 설명을 입력하십시오

많은 메모리를 사용하는 방법을 찾을 수있는 방법이 있습니까? 또는 무엇이 디스크로 심하게 교환되기 시작합니까? 서버를 재부팅하지 않고 메모리를 확보 할 수있는 방법이 있습니까?


서버 대신 일부 서비스 (apache, liquidsoap)를 다시 시작하지 않는 이유는 무엇입니까?
jamespo

원래 정상적인 메모리 사용량에 응답했습니다. 문제를 식별하는 데 도움이되는 일련의 도구로 업데이트했습니다.
BillThor

@ jamespo, 실제로 시도했지만 아무런 효과가 없었으므로 재시작이 내가 도울 수있는 유일한 것입니다.
jayarjo

캐시 된 4027092k는 메모리 사용량을 설명해야합니다. 나는 현재 다른 곳에서 비슷한 문제를 겪고 있으며 지금까지 다음 매개 변수를 사용하여 메모리 전송을 조정할 수 있음을 알아 냈습니다. 가장 환영합니다. 올바른 방향으로 가기를 바랍니다.

답변:


16

top배치 모드에서 실행 하여 메모리 크기를 주기적으로보고하면 남은 메모리를 누가 사용하는지 확인할 수 있습니다. 들이받은 sar배치 모드에서 것은 메모리 사용 및 관련 I / O에 좋은 진단을 제공해야합니다. munin시스템을 모니터링하기 위해 실행 하면 사용중인 메모리에 대한 세부 정보가있는 그래프가 제공됩니다. 이것은 많은 도움이 될 수 있습니다.

limits.conf를 사용하여 프로그램의 최대 코어 크기를 제한 할 수 있습니다. 올바르게 설정하면 메모리가 누출되는 모든 프로그램이 종료됩니다. 이것은 pam_limits 모듈과 함께 작동합니다. ulimits명령 으로 한계를 설정할 수도 있습니다 .

많은 양의 메모리를 사용할 수있는 몇 가지 프로그램을 실행하고 있습니다. 당신이 볼 수있는 것들은 다음과 같습니다.

  • 제대로 실행되지 않는 프로그래밍 된 응용 프로그램 apache2은 메모리를 누수 할 수 있습니다. 이 경우 메모리 크기가 증가하는 것을 볼 수 있습니다. MaxRequestsPerChild100 회 정도 설정 하면 apache2를 조정하여 특정 횟수만큼 사용한 후에 어린이를 재활용 할 수 있습니다 . 이렇게해도 문제가 해결되면 누출을 해결해야합니다. 나는 이것을 먼저 볼 것입니다.
  • MySQL은 데이터를 메모리에로드하려고 할 수 있습니다. 메모리에 많은 데이터가있는 경우 약간의 스 래싱이 발생할 수 있지만 현재처럼 극적이지 않아야합니다.
  • tmpfs파일 시스템이 마운트 된 경우 파일을 사용할 때 파일이 삭제되지 않으면 메모리가 누출 될 수 있습니다. 오래 지속되는 파일도 문제가 될 수 있습니다.
  • 대략 같은 시간에 문제가 발생하면 메모리가 누출되는 예정된 프로그램이있을 수 있습니다.
  • 공유 메모리를 할당하는 프로그램이 있지만 종료하기 전에 해제하지 않으면 비교적 보이지 않는 메모리 누수가 발생합니다. 공유 메모리가 메모리에 잠겨 있으면 강제로 스와핑 될 수 있습니다. 사용 가능한 공유 메모리의 양은 일반적으로 상대적으로 제한됩니다.
  • liquidsoap + icecast 번들은 메모리를 사용하는 버퍼링 문제를 일으킬 수 있습니다. 이 조합을 사용하지 않았으므로 이것이 어떻게 나타날지 잘 모르겠습니다.

일반적인 메모리 사용량 : 여유 메모리는 원하는 것이 아닙니다. 시스템이 오랫동안 켜져 있고 사용 가능한 메모리가 많은 경우 무언가 잘못되었습니다. 파일을 읽거나 쓸 때마다 블록은 버퍼 캐시로 이동합니다. 이렇게하면 사용 가능한 메모리가 줄어들고 좋은 것입니다. 시스템은 메모리를 다른 곳을 찾지 않고도 몇 개의 프로그램을 시작할 수있는 충분한 여유 공간을 유지합니다. 많은 프로그램이 빠르게 실행되면 실행이 중지되면 메모리가 사용 가능한 풀로 돌아갑니다.

버퍼 캐시에있는 파일을 읽을 때 디스크 액세스가 필요하지 않으며 버퍼 캐시에서 읽기가 해결됩니다. 쓰기도 비슷한 메커니즘을 사용합니다. 시스템에 메모리가 필요한 경우 버퍼 캐시는 가장 먼저 사용되는 장소 중 하나입니다. 대부분의 버퍼는 즉시 해제 될 수 있습니다.

메모리 누수가있는 경우 사용 가능한 메모리와 버퍼가 모두 축소되기 시작합니다. 누출 된 메모리를 결국 스왑 공간으로 이동해야하므로 여전히 심각한 문제는 아닙니다. 스왑 공간을 채우고 남은 여유 공간을 프로그램을 시작할 수 없을 때까지 시스템은 여전히 ​​정상적으로 실행됩니다. 소량의 스왑 공간이 사용되는 것이 일반적입니다.


내 경우의 문제는 좀 이상합니다. 로드가 엄청나고 서버 스왑이 심할 때에도 버퍼와 캐시에 대해 읽은 후 이해할 수있는 충분한 여유 메모리가 있습니다. top은 메모리를 많이 차지하는 프로세스를 보여주지 않습니다. 그러나로드가 올라가고 어느 시점에서 서버를 사용할 수 없게됩니다 : | 자세한 답변 감사합니다.
jayarjo

2
@ jayarjo : Munin과 sar은 무슨 일이 일어나고 있는지 감지하는 데 도움이됩니다. 사용 가능한 메모리가 많으면 스왑하지 않아야합니다. 다른 I / O 문제가있을 수 있습니다. sar어떤 파티션에 I / O가 있는지 파악하고 문제를 발견하는 데 도움이됩니다.
BillThor

MaxRequestsPerChild의 조언에 +1
jamespo

11

이 명령을 사용하여 RAM 사용과 관련된 상위 10 개 응용 프로그램을 볼 수 있습니다.

ps -A --sort -rss -o comm,pmem | head -n 11

많은 하위 프로세스가 생성 된 경우이 명령이 도움이되는 경우가 있습니다.

ps auxf

이렇게하면 어떤 프로세스가 함께 속하는지 알 수 있습니다.


이것들은 편리한 명령입니다. 앞으로 참고 할 것입니다. 그러나 문제는 항상 동일한 프로세스가 맨 위에 있다는 것입니다 (아파치, mysql, liquidsoap, icecast와 같은 스크린 샷에서 볼 수 있음). 그리고 서버가 부하를 죽일 때에도 동일한 양의 메모리를 사용하거나 (실제로는 무시할 수 있음) 표시합니다. |
jayarjo

@ jayarjo : 프로세스 수가 변경됩니까? 더 많은 프로세스가 있습니까? 물리적 서버입니까 아니면 가상 서버입니까?
라파엘 루티 거

프로세스 수의 변화를 눈치 채지 못했습니다. 기본적으로 내가 할 때 서버가로드가 죽어 가고있는 동안 나는 큰로드를 제외하고 원래 질문에 첨부 한 것과 매우 유사한 그림을 봅니다. | 서버가 물리적입니다.
jayarjo

2
"vmstat"(예 : vmstat -s)로 자세한 정보를 얻으십시오. 또는 이미 언급 된 "sar"도구를 사용합니다. RAM 기반 파일 시스템이 있습니까? 그러면 "iostat"가 더 많은 정보를 제공 할 수 있습니다.
라파엘 루티 거

1
메모리 누수를 감지하려고 할 때 "pmem"(% MEM) 필드 ps또는 top출력이 올바른지 아닌지 확실 하지 않습니다. 현재 프로세스에서 사용중인 실제 메모리의 백분율이 아닌가? 그러나 프로세스의 사용 된 (누설 포함) 메모리의 다른 부분이 교체 될 수 있습니다. 프로세스 크기 측정에 "크기"또는 "vsize"가 더 적합할까요? 예, ps -A --sort -size -o comm,size | head -n 11또는ps -A --sort -vsize -o comm,vsize | head -n 11
IMZ - 이반 Zakharyaschev

8

실제로 응용 프로그램 측면에서 해당 메모리를 사용하는 것은 없습니다.

실제 메모리 사용량이 프로그램 사용량과 관련하여 더 나은 아이디어를 얻으려면 페이지 캐시를 나타내는 '캐시 된'값을 공제해야합니다.

기본적으로 이것은 좋은 메모리 관리이며 이상적으로는 원하는 것입니다.

자세한 정보는 여기 링크를 참조하십시오 : http://www.linuxatemyram.com/


그렇습니다. 버퍼와 캐시에 대한 링크와 읽기를 찾았지만 내가 읽은 것에서 얻을 수있는 한 스왑을 일으킬 수 없습니까?
jayarjo

@jayarjo 나는 무슨 일이 일어나고 있는지 이해하려고 생각합니다. 그때 문제를 보여주는 통계가 필요합니다. 당신이 준 숫자는 스와핑이나 많은 실제 메모리 사용량을 보여주지 않습니다.
Matthew Ife

1

나는 이것에 대한 전문가는 아니지만 액체 비누 + 아이스 캐스트는 멀티미디어와 관련이 있습니다. 시스템이 사용 가능 해지면 나중에 사용하기 위해 메모리를 캐시 및 / 또는 점유합니다. 하루 중 특정 시간에 또는 일정 기간 동안 트래픽이 증가하면 스왑이 시작됩니다. 이 시점에서 요청 (콘텐츠를 보는 사용자)이 증가하면 필요한 리소스는 8GB 이상의 램이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.