断开 NFS 共享导致高 IO 等待负载

断开 NFS 共享导致高 IO 等待负载

我每晚都会同步一些文件夹并通过 attic 将文件备份到位于不同站点的 nfs 共享。为此,我编写了一个脚本,该脚本首先与该站点建立 openvpn 连接,然后在开始备份之前挂载 nfs 共享。

在备份过程中,很少会发生 nfs 共享不可用的情况,这会导致 io 等待时间持续数天:

Imgur 平均负载图

一旦共享再次可用,负载就会下降。

在此之前,我无法终止导致负载的进程。它就是不会消失。

这很烦人。

我该如何防止这种情况发生?我能以某种方式集成超时或其他功能吗?

以下是每晚通过 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"

或者也许 nfs 不是这里的正确选择?

我很感激任何关于如何改进此程序并使其更加稳定的提示。

答案1

这是 NFS 的一个“功能”。当连接丢失时,它会无限期地尝试重新连接,如果可以,通常会很好地从中断的地方继续,就像什么都没发生过一样。然而,这可能会非常烦人。避免这种情况的唯一方法是不使用 NFS。如果您不关心性能(或 UNIX 文件属性),您可以使用 CIFS/SMB。rsync也是一个选择,尽管它可能与 配合得不是很好attic

答案2

一个简单的解决方案是将 attic 作为子进程启动,如果耗时太长则中止它。一些建议可以在这里找到邮政

如果中止不起作用(正如您在问题中提到的那样),您仍然可以将其作为子进程运行,并让主应用程序监视 NFS。
如果 NFS 停止工作,您可能能够重新启动或重新安装它。(您的脚本中已经有用于监视和重新启动的代码。)

如果运气好的话,当 NFS 重新启动时,您的进程将继续。

相关内容