欠落しているDIMMの識別

欠落しているDIMMの識別

私のサーバーの1つでメモリモジュールに障害が発生すると、イベントログに誤った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では空で、もう一方のCPUでは空ではないDIMMスロットをチェックするプログラムを探しています。私はこれを行うために次のような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を欠落として出力します。

関連情報