Quando um módulo de memória em um dos meus servidores falha, o log de eventos geralmente informa o slot DIMM errado ou um slot DIMM inexistente. A melhor maneira que encontramos para determinar o DIMM com falha é verificando qual está faltando.
Eu tenho um comando que produz a seguinte saída:
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
Neste exemplo, P1-DIMMB1 falhou (esse slot DIMM é preenchido em P2, mas não em P1)
Estou procurando um método programático para determinar quais slots DIMM estão vazios em uma CPU, mas não na outra. Eu criei a seguinte monstruosidade bash para fazer isso, mas tenho certeza de que há uma maneira mais simples de fazer isso com arquivos 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
Isso pressupõe que a saída do comando acima mencionado seja armazenada na variávelvar
Este script AWK encontra DIMMs ausentes usando o conteúdo fornecido na entrada padrão ou como um arquivo a ser processado:
Ele envia os DIMMs ausentes para sua saída padrão.
O script funciona listando linhas sem “Tamanho”, criando uma sequência de DIMMs ausentes, por CPU. Em seguida, ele processa cada CPU, dividindo a sequência de DIMMs ausentes e procurando por cada DIMM individual na lista de DIMMs ausentes das outras CPUs; se não corresponder (para pelo menos uma outra CPU), ele emitirá o DIMM como ausente.