2009-12-08 2 views
26

시스템 시작시 메모리 소비량을 기록 할 수있는 즉시 사용할 수있는 솔루션이 있습니까? 나중에 분석 할 수 있도록 간단한 텍스트 파일이나 일부 데이터베이스에 데이터를 기록하고 싶습니다.Linux에서 메모리 소비량을 기록하는 방법은 무엇입니까?

저는 리눅스 2.4 기반 임베디드 시스템에서 일하고 있습니다. 메모리 소비와 관련된 문제를 디버깅해야합니다. 내 애플리케이션은 모든 시스템 시작시 자동으로 시작됩니다. 정기적으로 (가능한 한 자주) 타임 스탬프를 사용하여 데이터를 얻는 방법이 필요하므로 문제를 추적 할 수 있습니다.

내 증상 : 시스템이 시작될 때 시스템의 주요 매개 변수를 시각화하기 위해 내 응용 프로그램과 GUI를 시작했습니다. GUI는 GTK + (X 서버)를 기반으로합니다. GUI 및 X 서버를 사용하지 않으면 응용 프로그램이 정상적으로 작동합니다. GUI 및 X 서버를 활성화하면 마더 보드에 설치된 256 MiB 또는 512 MiB의 실제 메모리가있을 때 작동하지 않습니다. 1 GiB 메모리를 설치하면 모든 것이 정상입니다.

+0

이이 질문과 유사합니다 http://stackoverflow.com/questions/131303/linux-how-to-measure-actual-memory-usage-of-an-application-or-process – monksy

+0

합니까 귀하의 애플 리케이션은 적어도 충돌하기 전에 잠시 동안 실행합니까? –

+0

예, 이전 버전이 동일한 시스템에서 실행됩니다. 이제 우리는 새로운 버전을 개발하고이 문제에 착수하기 시작합니다. – bialix

답변

23

작은 스크립트

rm memory.log 
while true; do free >> memory.log; sleep 1; done 
+0

실제로, 이것은 내가 필요한 것에 매우 가깝습니다. 나는 타임 스탬프를 직접 추가 할 수있다. – bialix

+9

'free -s 1> memory.log'; 매 초마다 새로운 프로세스를 시작하는 비용이 발생하지 않습니다.하지만 타임 스탬프는 없습니다. (나는 이것이 오래된 게시물이지만, 나는 똑같은 것을 찾고 있었고, 다른 것들도 찾고 있었다). –

+1

일부 무료 버전에서는 버그로 인해 -c를 사용하여 인쇄 할 횟수를 지정해야합니다. 그렇지 않으면 오류가 발생했습니다. 초 인자'1 '이 실패했습니다. – Sputnik

2

당신은 시작 스크립트에

vmstat X >> mylogfile 

같은 것을 넣을 수 있습니다. 응용 프로그램이 이미 시작되었으므로 응용 프로그램이 이미 사용하고있는 초기화 스크립트의 끝에이 행을 추가하면됩니다.

+0

힌트를 보내 주셔서 감사합니다. 데이터를 더 자주 그리고 매 초마다 기록해야합니다. – bialix

3

같은 (X는 로그 메시지 사이의 시간 (초) # 임) 는 유닉스 계열의 시스템에서

sar 

라는 프로그램이있다. 이를 사용하여 메모리 사용을 모니터 할 수 있습니다. 규칙적인 간격으로 측정합니다. 더 자세한 내용은

man sar 

을 참조하십시오. 나는 메모리 측정을 위해 -r 옵션을, -i는 원하는 간격을 지정한다고 생각한다.

+1

다른 제안 된 솔루션보다 훨씬 강력하지만 설치하는 데 약간 번거로울 수 있습니다. – Ale

4

가 나는 crontab 항목이 될 것입니다 추가 생각만큼

*/5 * * * * free -m >> some_output_file 

거의 동일한 기능을 수행하지만, 설치 및 구성하기가 훨씬 쉽다 것 SeaLion, New Relic, Server Density 등 같은 다른 도구가 있습니다. 내가 좋아하는 것은 SeaLion이며 무료이기 때문에 일반 리눅스 명령의 원시 출력에 대한 멋진 타임 라인보기를 제공합니다.

+0

Sealion에 +1, 가장 빠른 가입/설정. 내가 생각하는 모든 것은 약 6 초 정도 나를 데려 갔다 - 나는 나의 이메일 (암호)을 타이프했다. 단일 명령을 ssh에 붙여 넣으면 내 통계가 나타납니다. – rgvcorley

17

다음 스크립트는 타임 스탬프와 헤더를 인쇄합니다.

#!/bin/bash -e 

echo "  date  time $(free -m | grep total | sed -E 's/^ (.*)/\1/g')" 
while true; do 
    echo "$(date '+%Y-%m-%d %H:%M:%S') $(free -m | grep Mem: | sed 's/Mem://g')" 
    sleep 1 
done 

결과는 다음과 같습니다 (우분투 15.04, 64 비트에서 테스트 됨).

 date  time   total  used  free  shared buffers  cached 
2015-08-01 13:57:27   24002  13283  10718  522  693  2308 
2015-08-01 13:57:28   24002  13321  10680  522  693  2308 
2015-08-01 13:57:29   24002  13355  10646  522  693  2308 
2015-08-01 13:57:30   24002  13353  10648  522  693  2308 
관련 문제