我的 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 时,这些值会实时更新。