Observium Raspberry Ramdisk

Passaram-se alguns dias desde que tenho o Observium a correr juntamente com o Pi-hole e mesmo depois dos tweaks, ainda estava a ter alguns momentos em que o Raspberry ficava extremamente lento.

Observium Raspberry Ramdisk

Passaram-se alguns dias desde que tenho o Observium a correr juntamente com o Pi-hole e mesmo depois dos tweaks, ainda estava a ter alguns momentos em que o Raspberry ficava extremamente lento.

Depois de investigar, reparei que o IO do meu cartão de memória estava com picos de acesso, e isto acontecia sempre o que o Observium estava a fazer tratamento de dados dos dispositivos da rede, o que tornava o Pi-hole muito lento nessas alturas.

Não há nenhuma maneira de melhorar o IO de um dispositivo de armazenamento, e por isso mesmo existem poucas alternativas:

  • Comprar um cartão de memória novo que seja mais rápido
  • Passar os ficheiros para um disco externo como foi feito com o MySQL
  • Ou usar a RAM para guardar os ficheiros temporariamente

Encontrei uma página na documentação do Observium sobre armazenamento persistente em RAM que foi ideal para resolver o meu problema, de acordo com a página o método está deprecated por eles, no entanto, eu estou a correr o serviço num raspberry e portanto isto faz todo o sentido.

Integração

O processo é bastante simple, cria-se uma nova pasta, monta-se um sistema de ficheiros temporário (tmpfs) na pasta e depois adiciona-se um temporizador para fazer backup dos ficheiros para que não se percam durante um restart.

É preciso também ter em atenção a configuração da maquina em questão, os passos aqui apresentados têm em consideração uma instalação do Observium utilizando o script de instalação automática do mesmo.

1º passo – criar e montar o tmpfs

Em primeiro lugar é preciso um mount point para o sistema de ficheiros:

mkdir /mnt/ramdisk

De seguida, adiciona-se uma nova entrada no ficheiro /etc/fstab para montar o sistema de ficheiros durante o boot:

tmpfs    /mnt/ramdisk    tmpfs    defaults,size=512M 0 0

Como estou a usar um Raspbery Pi 3 e de acordo com o tamanho actual da pasta RRD, defini que o tamanho necessário para o meu Ramdisk será de 512MB.

Este valor funciona como um teto máximo que o Ramdisk pode ocupar e é utilizado apenas se for necessário, o que mantém a RAM disponível para outros processos, portanto convém ser maior que o tamanho da pasta RRD mas não tão grande quanto a RAM total disponível.

O próximo passo será então montar o sistema de ficheiros na nova pasta que foi criada:

mount /mnt/ramdisk

Para se verificar que foi tudo criado correctamente, ao correr o comando df -h deverá aparecer o seguinte:

tmpfs     512M  0M  512M  0% /mnt/ramdisk

2º passo – mover e efectuar backup da pasta RRD

Como se vai utilizar um sistema de ficheiros temporário, é necessário criar-se um backup para os ficheiros RRD:

mkdir /var/ramdisk-backup

A melhor maneira para se manter um backup dos ficheiros é criando-se um script que o faça sozinho.

Para isso, cria-se um novo script em /etc/init.d/ramdisk com o seguinte conteúdo:

#! /bin/sh 
# /etc/init.d/ramdisk
#
case "$1" in
  start)
    echo "Copying files to ramdisk"
    rsync -av /var/ramdisk-backup/ /mnt/ramdisk/
    echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched from HD >> /var/log/ramdisk_sync.log
    ;;
  sync)
    echo "Synching files from ramdisk to Harddisk"
    rsync -av --delete --recursive --force /mnt/ramdisk/ /var/ramdisk-backup/
    echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched to HD >> /var/log/ramdisk_sync.log
    ;;
  stop)
    echo "Synching logfiles from ramdisk to Harddisk"
    rsync -av --delete --recursive --force /mnt/ramdisk/ /var/ramdisk-backup/
    echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched to HD >> /var/log/ramdisk_sync.log
    ;;
  *)
    echo "Usage: /etc/init.d/ramdisk {start|stop|sync}"
    exit 1
    ;;
esac
exit 0

E agora adiciona-se o novo script ao startup do Raspberry:

update-rc.d ramdisk defaults 00 99

Falta ainda mover a pasta RRD actual para a nova pasta de backup e correr o script para enviar tudo para o nosso Ramdisk

mv /opt/observium/rrd /var/ramdisk-backup/observium_rrd
/etc/init.d/ramdisk start

Seguidamente é necessário actualizar a configuração do Observium para apontar para a nova pasta, para isso, edita-se o ficheiro /opt/observium/config e adiciona-se a seguinte configuração:

$config['rrd_dir'] = "/mnt/ramdisk/observium_rrd";

E para finalizar abre-se o crontab edit do utilizador root:

sudo crontab -e root

E adiciona-se a seguinte linha:

*/30 * * * * root   /etc/init.d/ramdisk sync >> /dev/null 2>&1

Isto vai executar o script de 30 em 30 minutos, mantendo sempre um backup dos ficheiros.