Computer >> 컴퓨터 >  >> 문제 해결 >> Linux

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 키를 누른 다음 종료를 입력해 보세요. 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 번호로 ####을 종료해 보세요. 시스템 프로세스는 이런 방식으로 종료되어서는 안 되며, 저장되지 않은 작업도 종료되어서는 안 됩니다. 동일한 프로세스에 사용할 수 있는 Ctrl+Alt+Del 작업 목록을 사용하여 무언가를 종료하는 것과 비슷하게 생각하세요.

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

단순히 애플리케이션 문제를 해결하는 것이 아니라 실제로 코드 작업도 수행한다면 몇 가지 다른 방법이 있습니다. Ubuntu와 그 파생 제품은 프로그래밍을 위한 membrier, memusage 및 memusagestat C 루틴을 제공합니다.

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

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

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

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

저자 소개

Ubuntu에서 메모리 누수 감지 및 수정:단계별 가이드

케빈 애로우

Kevin Arrows는 10년 이상의 업계 경험을 보유한 경험이 풍부하고 지식이 풍부한 기술 전문가입니다. 그는 MCTS(Microsoft Certified Technology Specialist) 인증을 보유하고 있으며 최신 기술 개발에 대한 최신 정보를 얻으려는 깊은 열정을 가지고 있습니다. Kevin은 소프트웨어 개발, 사이버 보안, 클라우드 컴퓨팅과 같은 분야에서 자신의 전문 지식과 지식을 보여주면서 광범위한 기술 관련 주제에 대해 광범위하게 글을 썼습니다. 기술 분야에 대한 그의 공헌은 동료들로부터 널리 인정받고 존경받고 있으며, 복잡한 기술 개념을 명확하고 간결하게 설명하는 능력으로 높은 평가를 받고 있습니다.