Partage nfs déconnecté provoquant une charge d'attente élevée io

0

Je synchronise certains dossiers et effectue des sauvegardes via un grenier chaque nuit sur un partage nfs, c'est-à-dire sur un site différent. Pour cela, j'ai un script qui établit d'abord une connexion openvpn sur ce site, puis monte le partage nfs avant le démarrage de la sauvegarde.

Il arrive rarement que le partage nfs ne soit plus disponible pendant le processus de sauvegarde, ce qui oblige l'attente io à gravir plusieurs jours:

Graphique de charge moyenne en imgur

Dès que le partage redevient disponible, la charge tombe.

Avant cela, je ne peux pas tuer le processus qui provoque la charge. Ça ne partira pas.

C'est très énervant.

Comment puis-je empêcher cela? Puis-je en quelque sorte intégrer un délai d'attente ou quelque chose?

Voici le script qui tourne tous les soirs via 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 peut-être que nfs n'est pas le moyen d'aller ici?

Je suis reconnaissant pour toute suggestion sur la manière dont je peux améliorer cette procédure et la rendre plus stable.

Pedro
la source

Réponses:

0

C'est une "fonctionnalité" de NFS. Lorsqu'une connexion est perdue, elle essaiera indéfiniment de se reconnecter et, si elle le peut, réussit généralement assez bien à reprendre là où elle s'est arrêtée, comme si de rien n'était. Cela peut être incroyablement ennuyant, cependant. Le seul moyen d'éviter cela est de ne pas utiliser NFS. Si vous ne vous souciez pas des performances (ou des attributs de fichiers UNIX), vous pouvez utiliser CIFS / SMB. rsyncserait également une option bien que cela ne fonctionne pas très bien avec attic.

David King
la source
0

Une solution triviale serait de commencer le grenier en tant que sous-processus et de l'abandonner si cela prend trop de temps. Quelques suggestions pour faire ceci sont dans ce post

Si l'abandon ne fonctionne pas (comme vous l'avez mentionné dans votre question), vous pouvez toujours l'exécuter en tant que processus enfant et demander à votre application principale de surveiller NFS.
Si NFS cesse de fonctionner, vous pourrez peut-être le redémarrer ou le remonter. (Vous avez déjà le code pour surveiller et redémarrer dans votre script.)

Avec un peu de chance, votre processus se poursuivra au redémarrage de NFS.

NZD
la source