===========系统详情===========
操作系统:Solaris 10,更新 11
CPU_ARCH:SPARC (sparcv9)
硬件:Sun Fire V490(是的,宝贝老学校)
KERNEL_REV:150400-40
程序:bpbkar32(Symantec 的 Netbackup) TL;DR:即使由于暂停,
也无法终止进程kill -9
zpool 由于可能没有两条好的路径。
问题:
我们的系统上有一堆(16)个不可杀死的进程;备份团队通知我们,他们无法从 NB 主服务器终止这些作业,也无法生成新的备份,因此我们跳上尝试./bp.kill_all
并收到:
bash-3.2#./bp.kill_all
查找需要终止的 NetBackup 进程。
杀死 bpbkar 进程...以下进程仍然处于活动状态
root 20346 1 0 02:02:33 ? 0:00 bpbkar32 -r 2678400 -ru root -dt 1047868 -to 0 -bpstart_time 1481767648 -clnt n
root 18689 1 0 12 月 9 日? 0:00 bpbkar32 -r 8035200 -ru root -dt 0 -to 0 -bpstart_time 1481325879 -clnt nerp323
root 12618 1 0 12 月 7 日? 0:00 bpbkar32 -r 2678400 -ru root -dt 357484 -to 0 -bpstart_time 1481077264 -clnt ne
root 29693 1 0 12 月 9 日? 0:00 bpbkar32 -r 2678400 -ru root -dt 529430 -to 0 -bpstart_time 1481249210 -clnt ne
root 10168 1 0 12 月 9 日? 0:00 bpbkar32 -r 2678400 -ru root -dt 530349 -to 0 -bpstart_time 1481250129 -clnt ne
root 1950 1 0 12 月 14 日? 0:00 bpbkar32 -r 2678400 -ru root -dt 962300 -to 0 -bpstart_time 1481682080 -clnt ne
您希望此脚本尝试杀死它们吗? [y,n] (y) y
终止剩余进程...
正在等待进程终止...
正在等待进程终止...
正在等待进程终止...
正在等待进程终止...
正在等待进程终止...
还有进程仍在运行。
...为了可读性而截断输出。
导致我们继续尝试以极端的偏见杀死这些进程,通过kill -9
,也无济于事。我看过如何杀死一个无法被杀死的任务(不可中断?)和如果“kill -9”不起作用怎么办?以及搜索“Solaris uninterruptable process”并获得部分结果。重新启动似乎是常见主题,也是我们的“头撞桌子”解决方案。
话虽这么说,我想:
- 验证我的逻辑和根本原因的推理
- 看看是否有更好的方法来确定进程停止的位置/它尝试执行的系统调用
- 解决 I/O如果可能的话,无需重新启动,以及随后无法终止的进程。
几乎只是根本原因分析和某种“将来在备份运行时或如果没有两条工作路径时不要进行切换工作”的缓解措施。
这是我得到的/我在想的:
1)进入 /proc/1950/ 目录并查看状态。没有骰子可以理解该输出,即使使用strings
.喷出随机字符。值得注意的是,“cwd”显示了一个没有任何内容的链接,并且尝试通过以下方式解决它ls -alL /proc/1950/cwd
将会挂起终端并创建击鼓另一个不间断的过程。
2)运行 apstack 1950
将生成一些有用的信息,但没有什么是我从 a 中看不到ps -eaf
或我能理解的。不过,全部为零,看起来很糟糕,因为我们看不到地址或系统调用,就像我对工作 pid 所做的那样。
bash-3.2#pstack 1950
1950:bpbkar32 -r 2678400 -ru root -dt 962300 -to 0 -bpstart_time 1481682080 0000000000000000 ????????? (0, 0, 0, 0, 0, 0)
3)truss
如果尝试在正在运行的进程上运行 a 将挂起,同样会pfiles
生成“pfiles:无法控制进程 1950”的错误。有趣,但令人期待。
4)运行 astrace
只是告诉我“跟踪器已经存在”
5) 运行 apwdx
打印 cwd 返回:
bash-3.2#pwdx 1950
1950: /桶
这很有趣,因为我们的 df 确实包含它......
df -h /bucket
已用文件系统大小 可用容量 安装在
存储桶上 1.9T 31K 1.9T 1% /bucket
...但是尝试 cd 到 /bucket 并执行操作ls
会产生相同的悬挂效果。
bash-3.2#zpool list
名称大小分配免费上限健康 ALTROOT
存储桶 1.94T 308K 1.94T 0% 暂停 -
rpool 136G 58.0G 78.0G 42% 在线 -
bash-3.2#umount /bucket
无法打开“存储桶”:池 I/O 当前已暂停
bash-3.2#zpool export bucket
无法卸载“/bucket”:设备繁忙
bash-3.2#zpool status -x
池:存储桶
状态:暂停
状态:一个或多个设备因 IO 故障而出现故障。
操作:确保受影响的设备已连接,然后运行“zpoolclear”。
看:http://www.sun.com/msg/ZFS-8000-HC
扫描:没有请求
配置:
名称状态读写 CKSUM
存储桶暂停 0 0 0 遇到 I/O 故障 c3t50060E80102B1F5Ad78 故障 2 0 0 错误太多
Sooo...我感觉我们已经死在水里了,实际上,当“切换工作”发生时,没有两条通往 SAN 的活跃/健康路径,所以我们最终从下面拉了地毯vdev 碰巧备份在死机时在那里工作,但任何进程(例如我的ls
)都会有相同的行为。
任何人都有任何最后的保存想法“运行这个未知的命令,这将帮助您重新启动”???
答案1
正如 Jeff 所建议的,如果路径已返回,zpool clear 应该有助于解决问题。因为听起来好像不是,所以服务器可能看不到 LUN。
Azpool clear -F -n bucket
还会告诉您是否可以通过丢弃最后一组事务(-F 选项)来导入池。
您提到了切换工作,因此您可能需要检查完成了哪些工作,以及其中一项更改是否删除了该路径或任何路径。您是否查看过“luxadm display /dev/rdsk/c<____>s2 输出”?或者尝试使用 cfgadm 重新配置路径?或者沿着路径发送一个forcelip事件?
a 的完整输出zpool status bucket
也可能有助于确定池的类型(mirror、cat、stripe,...)。根据这个问题,我假设不是镜子。
我意识到这对我来说很容易说,因为我不参与其中,但不要惊慌,因为数据应该仍然全部存在于数组中,假设这不是问题。但您最终可能不得不重新导入并回滚一些事务。
祝你好运!
答案2
您可以通过以下内容查看 SAN 状态(假设是 FC SAN):
for port in `fcinfo hba-port | grep Port | awk '{ print $4 }'`; do
> fcinfo remote-port -ls -p $port
> done
另外,请阅读手册页mpathadm
。您可以用来mpathadm show lu LUN
显示 LUN 的状态。