메모리 문제: Raspberry Pi [닫기]

메모리 문제: Raspberry Pi [닫기]

저는 NUT 서버를 사용하여 UPS를 모니터링해야 하는 프로젝트를 진행하고 있습니다. 모니터링 및 데이터 로깅에는 minibian OS(JESSIE)를 사용합니다. ETON UPS를 모니터링하기 위해 1초마다 데이터를 쿼리하는 쉘 스크립트를 작성했습니다. 저는 8Gb SD 카드를 사용하여 OS와 데이터로그를 저장하고 있으므로 이를 루트(2Gb) 드라이브와 데이터로그(4Gb) 드라이브로 분할했습니다.

UPS 모니터링 스크립트는 Crontab에 의해 백그라운드 프로세스로 시작됩니다. UPS Monitor 스크립트에 포함된 기능은 다음과 같습니다.

  • 1초마다 UPS 데이터 가져오기
  • 매일 새 폴더 생성
  • 로그 파일 .csv의 타임스탬프
  • 1일이 지난 폴더를 검색하여 압축하고 폴더를 삭제하세요.

질문:

내 OS에는 약 800Mb만 필요하므로 2GB의 루트 공간이면 충분하다고 생각합니다. 그런데 3일간의 테스트를 실행했을 때 루트 파티션은 3일 만에 100Mb 이상을 소비했습니다. 이 경우 내 루트 파티션은 30일 안에 채워집니다.

쉘 스크립트를 실행하면 과도한 메모리 소비가 발생하는 이유를 모르겠습니다.

Raspberry Pi OS(셸 스크립트 없음)와 UPS Monitor(셸 스크립트 있음)의 메모리 사용량입니다.

테스트 실행 시간: 3일

UPS 모니터링 메모리 테스트: 시작

UPS 모니터링 메모리: 테스트 시작

UPS 모니터 메모리 테스트: 중지

UPS 모니터링 메모리: 테스트가 중지됨

Raspberry PI OS 메모리 테스트: 시작하기

여기에 이미지 설명을 입력하세요.

Raspberry PI OS 메모리 테스트: 중지됨

여기에 이미지 설명을 입력하세요.

스크립트 메모리 사용량

스크립트의 메모리 사용량을 찾기 위해 온라인에서 일부 링크를 찾았지만 전혀 의미가 없습니다.

메모리 사용량

데이터 로깅 스크립트

#!/bin/bash
gpio -g mode 16 out
gpio -g mode 21 out
gpio -g write 16 0
gpio -g mode 24 in

LOG_PATH='/media/ntfs/logs/'
LOG_HEADER=`date +%H:%M:%S`
LOG_DIR_NAME=`date +%d_%m_%Y`
LOG_FOLDER=`find /media/ntfs/logs -type d -mtime +0`

timeCounter=0
switchRead=0
#  Browse log directory
cd -- $LOG_PATH
LOG_NAME=$LOG_HEADER

while :
do
    switchRead=`gpio -g read 24`
    LOG_DIR_NAME=`date +%d_%m_%Y`
    LOG_DIR=$LOG_PATH$LOG_DIR_NAME
    echo "$LOG_DIR"

    if [ -d "$LOG_DIR" ]
    then
            cd -- $LOG_DIR
            echo "DIRECTORY FOUND"
    else
        mkdir -p $LOG_DIR
        LOG_NAME=`date +%H:%M:%S`
        echo "NEW DIRECTORY CREATED!!!!!"
        cd -- $LOG_DIR
        HEADER='UPS MODEL, UPS STATUS, BATTERY CHARGE, BATTERY RUNTIME,$
        echo $HEADER > $LOG_NAME.csv
        # Calling old folder compression script
        /root/day.sh
    fi

    # executing ups status command and saving result in array
    declare -A status="($(upsc myups | sed 's/\(.*\):\(.*\)/[\1]="\2"/'))"

    if [[ ${status[device.model]} != "" ]] ; then
        echo "WRITIN FILE"
        echo  ${status[device.model]}","${status[ups.status]}"," ${stat$
    fi

    if [[ ${status[ups.status]} = *OB* ]] ; then
        timeCounter=$(( $timeCounter+1))
        #echo $timeCounter  ":("

        if [[ "$timeCounter" -gt 20 ]] ; then
            #echo ":D"
            timeCounter=0
            LOG_NAME=`date +%H:%M:%S`
            echo $HEADER > $LOG_NAME.csv
       fi
    fi

    if [[ "$switchRead" = 1 ]] ; then
        echo "Read Kar liya bhiya"
        gpio -g write  16 1
        `sudo shutdown -h now`
    else
        gpio -g write 16 0
    fi

    gpio -g write 21 0
    sleep 0.5
    gpio -g write 21 1
    sleep 0.5
done
exit 0

감사해요

답변1

메모리 사용량보다는 디스크 사용량/저장 공간을 말씀하시는 것 같습니다. 메모리(RAM)는 일반적으로 프로그램에서 데이터를 처리하는 데 사용되는 일종의 고속 휘발성 메모리(전원이 꺼지면 데이터도 손실됨)입니다. SD 카드에 물리적으로 저장되어 전원이 꺼지더라도 손실되지 않는 디스크 사용량에 대해 이야기하고 있습니다. 나머지 부분에서는 디스크 사용량을 언급하고 있다고 가정합니다.

데이터 파일 외에도 프로그램은 실행되는 동안 여러 위치에서 디스크를 사용할 수 있습니다. 프로그램이 무엇을 하고 있는지 정확히 알지 못하면 추가 공간을 사용하기 위해 무엇을 하는지 정확히 알기가 어렵습니다. 그러나 찾아야 할 몇 가지 일반적인 항목은 로그, 캐시 및 임시 파일입니다.

일반적으로 로그 파일은 에 기록되고 /var/log, 캐시 파일은 에 기록되며 , 임시 파일은 또는 /var/cache에 기록됩니다 . 이러한 위치는 계속해서 규모가 커질 수 있으므로 세심한 주의를 기울여야 합니다./tmp/var/tmp

실제로 두 가지 옵션이 있습니다.

  • 스크립트가 작성 중인 다른 위치를 확인하려면 스크립트를 살펴보세요. 이는 수행 중인 작업에 따라 크게 달라지며 추가 정보 없이 이를 수행하는 방법을 제안하기는 어렵습니다.
  • 파일 시스템을 분석하여 여유 공간이 어떻게 사용되고 있는지 확인하세요.

두 번째로, 이 도구는 du매우 편리합니다. 이를 통해 어떤 파일/디렉터리가 공간을 차지하고 있는지 확인할 수 있습니다. 다음은 일반적으로 많은 공간을 차지하는 파일을 찾는 방법입니다.

파일 시스템의 루트(또는 공간이 사용되는 대략적인 위치를 알고 있는 경우 하위 디렉터리)에서 시작합니다. 달리기 sudo du -sxh * | sort -h. 분석하는 디렉터리의 크기에 따라 시간이 좀 걸립니다(그러나 1G의 경우 너무 오래 걸리지 않습니다). 옵션의 의미 -s: 나열된 각 파일/디렉토리의 요약입니다. -x: 다른 디스크를 사용하지 않도록 파일 시스템 경계를 넘지 마십시오. -h사람이 읽을 수 있는 크기로 인쇄합니다 . | sort -h크기순으로 정렬해 드립니다 .

대부분의 공간을 사용하는 디렉토리를 찾거나 사용된 공간의 양이 증가하면 해당 디렉토리로 이동하여 du 명령을 다시 실행할 수 있습니다. 공간이 어디로 가는지 찾을 때까지 이것을 반복하십시오.

귀하의 경우 크기 증가를 원하지만 이는 절대적인 크기가 아닌 작은 증가일 것입니다.

관련 정보