Desconectado nfs share causando alta carga de espera io

0

Eu sincronizo algumas pastas e faço backups via sótão todas as noites para um compartilhamento nfs, que é em um site diferente. Para isso, eu tenho um script que primeiro estabelece uma conexão openvpn para esse site e monta o compartilhamento nfs antes que o backup seja iniciado.

Raramente acontece que o compartilhamento nfs fique indisponível durante o processo de backup, o que faz com que a io espere para passar dias:

Gráfico de carga média do Imgur

Assim que o compartilhamento estiver disponível novamente, a carga cai.

Antes disso, não consigo matar o processo que causa a carga. Apenas não vai embora.

Isso é muito chato.

Como posso evitar que isso aconteça? Posso de alguma forma integrar um tempo limite ou algo assim?

Aqui está o script que roda todas as noites pelo cron:

#!/bin/sh
REPOSITORY=/media/offsiteserver_netbackup/system.attic  #no backslash at the end of this
NFSMOUNT=/media/offsiteserver_netbackup  #no backslash at the end of this
NFSDIR="192.168.178.2:disk2/netbackup"

export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games

###############start of script#################   
#exec >> $LOGFILE 2>&1

#simple function that just prints the time and the info you pass to it
echotime () {
  echo "'date +%Y-%m-%d--%H:%M:%S' ----$1---"
}

# simple function to check if openvpn is connected (1 means NOT CONNECTED)
checkvpn () {
  if ping 192.168.178.2 -c 1 &> /dev/null; then
      echotime "VPN connected"
      return 1
  else
      echotime "VPN not connected"
      return 0
  fi
}  

# simple function to check if nfs is mounted (1 means NOT MOUNTED)
checkmount () {
  #http://stackoverflow.com/a/14698865
  #http://stackoverflow.com/a/9422947
  if mount | grep $NFSMOUNT > /dev/null; then
      echotime "NFS mounted"
      return 1
  else
      echotime "NFS not mounted"
      return 0
  fi
}

echotime "Script Start"

# restart vpn if not connected
if checkvpn; then
  echotime "VPN not connected, attepting to connect"
  /etc/init.d/openvpn restart
  sleep 5
  #check again if its connected
  if checkvpn; then
     echotime "ERROR: VPN still not connected, exiting \n"
     exit 1
  fi
fi

# mount nfs if not mounted
# if your not using NFS, you can delete this section all together
if checkmount; then
  echotime "NFS not mounted, attepting to mount"
  mount -v $NFSDIR $NFSMOUNT -o nolock
  #check again if its mounted
  if checkmount; then
     echotime "ERROR: NFS still not mounted, exiting \n"
     exit 1
  fi
fi

# Backup all of / except a few excluded directories
# if your running into issues, add -v after create for verbose mode
# the below / means backup all of root.
echotime "ATTIC CREATE"
attic create --stats                            \
    $REPOSITORY::host.stscode-'date +%Y-%m-%d--%H:%M:%S'  \
    /                                           \
    --exclude /sys                              \
    --exclude /mnt                              \
    --exclude /dev                              \
    --exclude /media                            \
    --exclude /lost+found                       \
    --exclude /proc                             \
    --exclude /run

# Use the 'prune' subcommand to maintain 7 daily, 4 weekly
# and 6 monthly archives.
echotime "ATTIC PRUNE"
attic prune -v $REPOSITORY --keep-hourly=23 --keep-daily=7 --keep-weekly=2 --keep-monthly=2

#unmount the NFS folder, I do this b/c
#   if it stays mounted, sometimes servers freak
#   out when rebooting.
# Uncomment the below 2 lines if you need to unmount every time.
echotime "UNMOUNT"
umount -v $NFSMOUNT

# end of script
echotime "End of Script"

Ou talvez o nfs não seja o caminho a seguir aqui?

Agradeço qualquer sugestão de como posso melhorar este procedimento e torná-lo mais estável.

    
por Pedro 09.11.2015 / 20:30

2 respostas

0

Este é um "recurso" do NFS. Quando uma conexão é perdida, ela tentará se reconectar indefinidamente e, se puder, é geralmente muito boa em continuar de onde parou, como se nada tivesse acontecido. Pode ser incrivelmente irritante, no entanto. A única maneira de evitar isso é não usar o NFS. Se você não se importa com o desempenho (ou com o arquivo attrs do UNIX), você pode usar o CIFS / SMB. rsync também seria uma opção, embora possa não funcionar muito bem com attic .

    
por 09.11.2015 / 21:11
0

Uma solução trivial seria iniciar o sótão como um subprocesso e abortá-lo se demorar muito. Algumas sugestões para fazer isso estão nesta postagem

Se o abortar não funcionar (como você mencionou na sua pergunta), você ainda pode executá-lo como um processo filho e ter seu NFS monitor principal de aplicativos.
Se o NFS parar de funcionar, você poderá reiniciá-lo ou remontá-lo. (Você tem o código para monitorar e reiniciar já no seu script.)

Com um pouco de sorte, seu processo continuará quando o NFS for reiniciado.

    
por 09.11.2015 / 23:44