conky RAM 使用情况 - 不显示 RAM 磁盘(tmpfs)中的大文件

conky RAM 使用情况 - 不显示 RAM 磁盘(tmpfs)中的大文件

我的 conkyrc 文件包含以下内容:

${color grey}RAM Usage:$color $mem/ $memmax - $memperc% ${membar 4}

这显示 RAM 使用情况的数值和一个条形图,例如“ 1.01GiB/ 7.79GiB - 13% xx___________”。

我设置了一个 ramdisk 并将一个大文件复制到其中。 df -h返回以下内容:

tmpfs              3,0G    1,1G  2,0G  36% /mnt/ramdisk

为什么 RAM 中有一个 1.1G 的文件,而 conky 仍报告 RAM 使用量为 1.02Gib?如果不在 RAM 中,那么大文件存储在哪里?

答案1

最可能的解释是 conky 没有将该内存算作“已使用”内存。

在 Linux 或任何现代操作系统中,什么是“已使用”内存,什么是“可用”内存,并不是简单的黑白分明。例如,系统缓存(包括硬盘缓存)是“已使用”的,因为它已分配内存,但它是“空闲”的,因为它只占用了其他可用的 RAM,并且随着可用 RAM 的减少,其内存自然会缩小。

临时文件是一个虚拟文件系统,其行为在很多方面与系统缓存有点相似,因为它将文件映射到 RAM 中,占用了原本“空闲”的内存,但它们不是永久磁盘存储中也存在的文件的副本。使用 tmpfs,如果不再有足够的空闲 RAM 来将它们保存在内存中,它会将这些文件交换到交换分区。

因此,出于同样的原因,有时将缓存内存视为空闲是有意义的,在某些方面,将 tmpfs 内存视为空闲也是有意义的,因为该内存仍然可供其他应用程序使用。

答案2

以下提供了有关 RAM 磁盘使用情况的快速概览信息,即为特定 ramdisk 分配了多少内存。它可以轻松集成到 conkyrc 中:

mkdir -pv /mnt/ramdisk/.ramdisk

DF_RESULTS_FILE=/mnt/ramdisk/.ramdisk/df_ramdisk_results.txt
df -h | grep -e /mnt/ramdisk > $DF_RESULTS_FILE 

DF_RESULTS_STRING=$(cat $DF_RESULTS_FILE)
DF_RESULTS_details=($DF_RESULTS_STRING)

printf "RAM Disk Usage: %s /%s\n" ${DF_RESULTS_details[2]} ${DF_RESULTS_details[1]}

以下内容满足了我的所有需求,因为它实际上报告了安装的所有实例tmpfs

#!/bin/bash
# rdu2.sh  -  ramdisk usage statusline statistics (version 2.2)

mkdir -pv /mnt/ramdisk/.ramdisk

# Change to /mnt/ramdisk for a specific drive
# or change it to something else or any other information
DF_MONITORED=tmpfs
DF_RESULTS_DIR=/mnt/ramdisk/.ramdisk
DF_RESULTS_FILE=$DF_RESULTS_DIR/rdu2.2_generic_results.txt

#the following lines are for people who haven't thought about doing "ps -A | grep rdu2"
#SCRIPT_PID=$(echo $$)
#printf "%d" $SCRIPT_PID > $DF_RESULTS_DIR/temp_script_pid.txt

printf "rdu2 executing to... [%s]\n" $DF_RESULTS_FILE 

printf "[%s]" $DF_RESULTS_FILE > $DF_RESULTS_FILE

while [ 1 ]
do
# Adding raw numbers and  translating to human-readable
# Display to screen and write to a file
    df | grep -e $DF_MONITORED > $DF_RESULTS_DIR/temp_df_tmpfs.tsv

    TOTAL_MEM_STRING=$(awk '{s+=$2} END {printf "%.0f", s}' $DF_RESULTS_DIR/temp_df_tmpfs.tsv  | awk 'function human(x) { s=" KiB MiB GiB TiB EiB PiB YiB ZiB"; while (x>=1024 && length(s)>1) { x/=1024; s=substr(s,5) }; s=substr(s,1,4); return sprintf( "%.2f%s", x, s) } { gsub(/^[0-9]+/, human($1)); print }')
    TOTAL_MEM_STRING_details=($TOTAL_MEM_STRING)
    USED_MEM_STRING=$(awk '{s+=$3} END {printf "%.0f", s}' $DF_RESULTS_DIR/temp_df_tmpfs.tsv  | awk 'function human(x) { s=" KiB MiB GiB TiB EiB PiB YiB ZiB"; while (x>=1024 && length(s)>1) { x/=1024; s=substr(s,5) }; s=substr(s,1,4); return sprintf( "%.2f%s", x, s) } { gsub(/^[0-9]+/, human($1)); print }')
    USED_MEM_STRING_details=($USED_MEM_STRING)

    printf "%8s%s%8s\r" "$USED_MEM_STRING" " /" "$TOTAL_MEM_STRING"
    printf "%8s%s%8s" "$USED_MEM_STRING" " /" "$TOTAL_MEM_STRING" > $DF_RESULTS_FILE

# Typical format for a conkyrc: 
# # ramdisk usage
# # NOTE: the ${tail logfile lines} is internal to conky; do not confuse with bash's tail command line program
# ${color grey}tpmfs Usage rdu2:$color ${tail /mnt/ramdisk/.ramdisk/rdu2.2_generic_results.txt 1}

    sleep 1.32s
done

后一个脚本在启动时被调用并在 conky 中引用,有助于生成以下文本:

tmpfs Usage (rdu2): 96.14 MiB /3,42 GiB

当将大文件复制到 ramdisk 时,这些值会实时更新。

相关内容