确定缺少的 DIMM

确定缺少的 DIMM

当我的一台服务器中的内存模块出现故障时,事件日志通常会报告错误的 DIMM 插槽或完全不存在的 DIMM 插槽。我们提出的确定故障 DIMM 的最佳方法是检查缺少哪一个 DIMM。

我有一个命令可以产生以下输出:

  Location Tag: P1-DIMMA1   Size: 34359738368 bytes
  Location Tag: P1-DIMMA2
  Location Tag: P1-DIMMB1   
  Location Tag: P1-DIMMC1
  Location Tag: P1-DIMMD1   Size: 34359738368 bytes
  Location Tag: P1-DIMMD2
  Location Tag: P1-DIMME1   Size: 34359738368 bytes
  Location Tag: P1-DIMMF1
  Location Tag: P2-DIMMA1   Size: 34359738368 bytes
  Location Tag: P2-DIMMA2
  Location Tag: P2-DIMMB1   Size: 34359738368 bytes
  Location Tag: P2-DIMMC1
  Location Tag: P2-DIMMD1   Size: 34359738368 bytes
  Location Tag: P2-DIMMD2
  Location Tag: P2-DIMME1   Size: 34359738368 bytes
  Location Tag: P2-DIMMF1

在此示例中,P1-DIMMB1 出现故障(该 DIMM 插槽填充在 P2 中,但未填充在 P1 中)

我正在寻找一种编程方法来确定一个 cpu 中的哪个 DIMM 插槽是空的,而不是另一个 cpu 中的。我想出了以下 bash 怪物来完成此任务,但我确信有一种更简单的方法可以使用awk.


cpu1_dimms=()
cpu2_dimms=()
missing=()

while read -r line; do
    dimm=$(awk '{print $3}' <<<"$line")
    cpu=${dimm:1:1}
    size=$(awk '{print $5}' <<<"$line")
    if [[ -n "$size" ]]; then
        case $cpu in
            1)  cpu1_dimms+=( "${dimm:3}" );;
            2)  cpu2_dimms+=( "${dimm:3}" );;
        esac
    fi
done < <(echo "$var")

for dimm in "${cpu1_dimms[@]}"; do
    if ! [[ "${cpu2_dimms[@]}" =~ "$dimm" ]]; then
        missing+=( "P2-$dimm" )
    fi
done
for dimm in "${cpu2_dimms[@]}"; do
    if ! [[ "${cpu1_dimms[@]}" =~ "$dimm" ]]; then
        missing+=( "P1-$dimm" )
    fi
done

假设上述命令的输出存储在变量中var

答案1

此 AWK 脚本使用标准输入上给出的内容或作为要处理的文件来查找丢失的 DIMM:

!/Size:/ {
    cpu = substr($3, 1, 2)
    dimm = substr($3, 4)
    missing[cpu] = missing[cpu] " " dimm
}

END {
    for (cpu in missing) {
        split(missing[cpu], dimms, " ")
        for (key in dimms) {
            for (cmpcpu in missing) {
                if (cpu != cmpcpu && missing[cmpcpu] !~ dimms[key]) {
                    print cpu "-" dimms[key]
                }
            }
        }
    }
}

它将缺失的 DIMM 输出到其标准输出。

该脚本的工作原理是列出没有“大小”的行,为每个 CPU 构建一串缺失的 DIMM。然后,它处理每个 CPU,将丢失的 DIMM 字符串分开,并在其他 CPU 的丢失 DIMM 列表中查找每个单独的 DIMM;如果无法匹配(至少与另一个 CPU 匹配),则会将 DIMM 输出为缺失。

相关内容