内存问题:Raspberry Pi

内存问题:Raspberry Pi

我正在开发一个需要使用 NUT 服务器监控 UPS 的项目。对于监控和数据记录,我使用 minibian OS (JESSIE)。为了监控 ETON UPS,我编写了一个 shell 脚本,每秒查询数据。由于我使用一张 8Gb SD 卡来存储操作系统和数据日志,因此我将其分区为根(2Gb)和数据日志(4Gb)驱动器。

UPS 监控脚本由 Crontab 作为后台进程启动。 UPS Monitor 脚本中包含的功能如下:

  • 每 1 秒获取一次 UPS 数据
  • 每天生成新文件夹
  • 日志文件 .csv 的时间戳
  • 搜索超过 1 天的文件夹,将其压缩并删除文件夹

问题:

我认为 2 GB 的 root 空间就足够了,因为我的操作系统只需要大约 800 Mb。但当我运行三天测试时,根分区在三天内消耗了超过 100 Mb。这样的话,我的根分区将在30天内被填满

我不知道为什么运行 shell 脚本会导致内存消耗过多。

这是 Raspberry Pi OS(不带 shell 脚本)和 UPS Monitor(带 shell 脚本)的内存使用情况

测试运行时间: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将按大小顺序对它们进行排序。

一旦找到使用大部分空间的目录,或者使用的空间量增加,您可以 cd 到它们并重新运行 du 命令。重复此操作,直到找到空间的去向。

请注意,在您的情况下,您正在寻找尺寸的增长,但这将是小幅增长而不是绝对尺寸。

相关内容