Ubuntu에서 메모리 누수를 감지하는 방법



문제를 제거하기 위해 도구를 사용해보십시오

Ubuntu에서 메모리 누수가 발생할 수있는 몇 가지 이유가 있지만 다행히도 언제 발생하는지 분명합니다. 프로그래머가 더 이상 필요하지 않은 메모리가 해제되었는지 확인할 기회가 없었기 때문에 버그 코드가 가장 큰 이유입니다. 불안정한 패키지를 설치하거나 소스에서 코드를 컴파일 한 경우 이러한 이유로 메모리 누수를 처리 할 수 ​​있습니다. 충분한 물리적 RAM이 설치되어있을 때 소프트웨어 응용 프로그램 패키지가 메모리 부족에 대해 불평하기 시작하기 때문에 아마 알아 차릴 것입니다.



메모리 누수가 걱정된다면 터미널에 free를 반복해서 입력 해보세요. 갑자기 RAM 사용이 빠르게 증가하기 시작하면 이미 메모리 누수를 감지 한 것입니다. bash :이 작업을 수행하는 동안 메모리가 부족하고 터미널 또는 가상 콘솔 만 열려있는 것과 같은 오류가 발생하면 거의 의심 할 여지없이 하나를 처리하는 것입니다. 일부 메모리 누수는 조금 더 미묘 할 수 있지만 Ubuntu와이를 감지하는 데 도움이되는 도구 및 패키지 기능이 있습니다.



Ubuntu에서 메모리 누수 감지

메모리 누수 감지에 사용되는 도구는 주로 CLI 프롬프트를 기반으로하므로이를 실행하는 Ubuntu 버전은 중요하지 않습니다. 이들은 일반 Ubuntu의 Unity 터미널 내부, Ubuntu Server의 가상 콘솔, Lubuntu의 lxterm, Kubuntu의 Konsole 또는 Xubuntu의 Xfce 내부에서 잘 작동합니다. sudo -s와 같은 간단한 작업을 수행하고 시작하려면 암호를 입력하십시오.



올바르게 수행하면 루트 셸을 얻을 수 있지만 이미 너무 멀리 떨어진 누수로 작업하는 경우 메모리 오류가 발생할 수 있습니다. 실제로 루트 셸에 액세스 할 수있는 경우 echo 3> / proc / sys / m / drop_caches를 입력하고 Enter 키를 누른 다음 exit를 입력합니다. free 또는 free -m을 다시 실행하여 메모리를 해제하는 데 도움이되었는지 확인하십시오.

일부 프로그래머는 커널이 캐시를 삭제하도록 강제 할 이유가 없다고 주장합니다. 캐시를 플러시하고 추가 물리적 메모리가 필요한 즉시 회수해야하기 때문입니다. 그러나 이러한 캐시를 강제로 플러시하면 시스템 성능이 저하되지만 이는 단지 테스트 일 뿐이라는 점을 명심하십시오. 시스템을 재부팅하면 Linux 커널이 처음에 있었던 방식으로 메모리 캐시를 다시 한 번 조립해야합니다.

몇몇 사람들은 회선 동기화를 추가 할 것을 제안했습니다. sudo echo 3> / proc / sys / vm / drop_caches를 cron이 일관되게 실행하는 스크립트에 추가하지만 이것은 처음에 메모리 캐싱의 목적을 무효화합니다. 여유 메모리 자체는 사용되지 않은 RAM 일 뿐이므로 데이터를 훨씬 느린 속도로로드해야합니다.전자 기계 또는 NAND 저장 장치. 이러한 기기가 아무리 빠르더라도 RAM만큼 빠르지는 않습니다. 즉, 메모리 누수를 수정해야하지만 최적 설정으로 설정 한 후에는 실제로 캐시 시스템을 조작해서는 안됩니다.



컴퓨터를 사용하는 동안 주기적으로 발생하는 일관된 메모리 누수가 실제로 발생하고 구체적으로 좁힐 수 없지만 여전히 CLI 액세스 권한이있는 경우 top 명령을 실행 해보십시오. 실행중인 프로세스 목록이 표시됩니다.

Ubuntu에서 top에 대한 비정상적인 오류가 발생하면이 프로그램의 더 간단한 버전에 액세스하기 위해 대신 busybox top을 발행 해보십시오. 목록이 있으면 % MEM 또는 유사한 열을보고 가장 많은 메모리가 할당 된 응용 프로그램을 확인합니다. PID를 확인하고 정확한 PID 수에 대해 kill 명령을 실행할 수 있지만 이는 응용 프로그램을 강제로 닫을뿐입니다. 이 작업을 수행 한 후에도 그들이 사용하는 메모리는 아직 해제되지 않을 수 있지만 당연히 한 번의 가치가 있습니다.

많은 양의 메모리를 사용하는 응용 프로그램을 찾으면 q를 눌러 종료 한 다음 이전 화면의 PID 번호로 kill ####을 시도합니다. 시스템 프로세스는 이런 식으로 죽여서는 안되며, 저장하지 않은 작업이 있어서도 안됩니다. Ctrl + Alt + Del 작업 목록을 사용하여 무언가를 죽이는 것과 비슷하게 생각하세요.이 같은 프로세스에도 사용할 수 있습니다.

이러한 문제가 지속적으로 발생하는 프로그램을 발견하면 향후 동작을 방지하도록 구성 할 수 있습니다. 물론 각 개별 프로그램에는 단순히 메모리 누수를 감지하는 작업을 넘어서는 다른 방법이 필요합니다.

단순히 응용 프로그램의 문제를 해결하는 것이 아니라 실제로 코드로 작업하는 경우 몇 가지 다른 방법이 있습니다. Ubuntu와 그 파생물은 프로그래밍을위한 membarrier, memusage 및 memusagestat C 루틴을 제공합니다.

man membarrier, man memusage 또는 man memusagestat를 사용하여 이러한 중요한 루틴에 대한 Linux 프로그래머 매뉴얼 페이지를보십시오. Ubuntu의 새 버전이 출시됨에 따라 향후 버전의 라이브러리에 업그레이드가있는 경우 변경 사항은 항상 여기에 설명되어 있습니다.

그래픽 콘텐츠가 필요한 경우 memusagestat는 메모리 사용에 대한 그래픽 표현을 PNG 파일에 저장하는 옵션도 제공합니다. 이것은 메모리 누수를 정기적으로 확인하는 응용 프로그램을 만드는 데 사용할 수 있기 때문에 유틸리티 작성자에게도 매력적인 기능입니다.

메모리 누수를 찾는 데 도움을주기 위해 메모리 사용량을 프로파일 링하는 도구 인 memprof를 설치할 수도 있습니다. 작성중인 프로그램의 각 함수가 할당하는 메모리 양에 대한 프로필을 생성합니다. 또한 기존 메모리를 스캔하여 할당되었지만 더 이상 정품 참조가없는 블록을 찾을 수 있습니다. 표준 C 라이브러리의 메모리 할당 기능을 재정의하기 위해 라이브러리를 미리로드하여이를 수행합니다.

이것을 사용하려는 경우 코드를 릴리스하기 전에 코드 시작 부분에서 include memprof 행을 제거했는지 확인하십시오. 이는 누출이 없는지 확인하는 데 사용되지만 코드를 패키징하고 저장소에서 릴리스하는 경우 종속성이되어서는 안됩니다.

4 분 읽기