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](/content/images/size/w2000/2022/05/memory-chips-on-motherboard-1511895.jpg)
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.