|
问题现象
由于网络的问题,FAHClient程序在下载或上传任务包时,可能出现程序僵死的现象。 出现这种情况后,通过FAH控制面板退出程序实际上是不生效的。在windows下必须通过windows任务管理器直接结束FAHClient.exe进程,在Linux下则通过kill -9 FAHClient-PID 结束进程。
后果
FAHClient程序僵死的直接后果是停止了folding@home计算,造成PPD下滑。 这就需要用户时常关注fah的运行状态,总有不便。
原因分析
这实际上是FAHClient程序的一个重大bug,在网络发生异常状态时,程序不能识别并处理这个异常,进而进入某种死锁状态。
已有的解决努力
这为应对这个bug,队友提出了各种解决方案。 以Lynt朋友的方法最为出色。Lynt在过去开发了基于Autoit脚本的卡包检测与处理程序——FAH_Daemon (http://www.equn.com/forum/thread-40464-1-1.html),支持windows和Linux。该程序在3213团队中发挥了显著的作用,为不少网络不稳定的队友解决了问题。 最近Lynt兄弟又写了一个ubuntu专用的守护脚本(http://www.equn.com/forum/forum. ... id=42978&pid=572649), 当发生卡包时,重启fah系统服务。该守护程序判断FAHClient某个SLOT超过这个阀值时间没有运算,将认定此SLOT发生卡包,继而运行重启FAHClient等动作。
新的检测办法
根据我的观察,FAHClient进程在运行时会侦听 36330 TCP端口和7396 TCP端口,其中36330端口还以telnet的方式提供交互式查询与控制命令。 所以登录进入看看:- [root@E5-1660v3 ~]# telnet 127.0.0.1 36330
- Trying 127.0.0.1...
- Connected to 127.0.0.1.
- Escape character is '^]'.
- Welcome to the Folding@home Client command server.
- >
复制代码 可以发现,FAHClient程序会打出“Welcome to the Folding@home Client command server.”的欢迎词。 根据Linux命令行的一般规则,让我们尝试输入help,看看有什么结果:
可以发现,这里提供了不少查询与控制命令。
于是,我就立即产生了个思路: 当FAHCient僵死时,telnet端口还有响应吗? 如果没有响应,那么这不正好是一个我们寻求已久的FAHCient僵死的最佳判据吗!
多年来的直观感觉告诉我,FAHCient僵死时还响应telnet交互命令的可能性很小。 然后,开始等待FAHClient出现僵死。。。
先测试了FAHClient正常状态下,36330 telnet端口都有响应。 恰好今晚就遇到一台fah主机出现僵死,立即开始验证:- [root@E5-1660v3 ~]# curl -m 5 telnet://172.16.16.11:36330
- curl: (7) Failed connect to 172.16.16.11:36330; 拒绝连接
- [root@E5-1660v3 ~]#
复制代码 果然,FAHClient程序不理我们了。
而正常的FAHClient,则是这样:- [root@E5-1660v3 ~]# echo -e "info\nquit\n\n" | curl -m 5 telnet://172.16.16.16:36330
- Welcome to the Folding@home Client command server.
- > PyON 1 info
- [
- [
- "Folding@home Client",
- ["Website", "http://folding.stanford.edu/"],
- ["Copyright", "(c) 2009-2014 Stanford University"],
- ["Author", "Joseph Coffland <[email protected]>"],
- ["Args", ""],
- ["Config", "/home/wpf/fahclient_7.4.4-64bit-release/config.xml"]
- ],
- [
- "Build",
- ["Version", "7.4.4"],
- ["Date", "Mar 4 2014"],
- ["Time", "12:01:17"],
- ["SVN Rev", "4130"],
- ["Branch", "fah/trunk/client"],
- ["Compiler", "GNU 4.1.2 20080704 (Red Hat 4.1.2-46)"],
- ["Options", "-std=gnu++98 -O3 -funroll-loops -mfpmath=sse -ffast-math -fno-unsafe-math-optimizations -msse2"],
- ["Platform", "linux2 2.6.18-164.11.1.el5"],
- ["Bits", "64"],
- ["Mode", "Release"]
- ],
- [
- "System",
- ["CPU", "Genuine Intel(R) CPU @ 3.00GHz"],
- ["CPU ID", "GenuineIntel Family 6 Model 63 Stepping 1"],
- ["CPUs", "16"],
- ["Memory", "31.19GiB"],
- ["Free Memory", "30.54GiB"],
- ["Threads", "POSIX_THREADS"],
- ["OS Version", "3.10"],
- ["Has Battery", "false"],
- ["On Battery", "false"],
- ["UTC Offset", "8"],
- ["PID", "3329"],
- ["CWD", "/home/wpf/fahclient_7.4.4-64bit-release"],
- ["OS", "Linux 3.10.0-327.el7.x86_64 x86_64"],
- ["OS Arch", "AMD64"],
- ["GPUs", "4"],
- ["GPU 0", "NVIDIA:5 GP104 [GeForce GTX 1080]"],
- ["GPU 1", "UNSUPPORTED: NV3 [PCI]"],
- ["GPU 2", "NVIDIA:5 GP104 [GeForce GTX 1080]"],
- ["GPU 3", "UNSUPPORTED: NV3 [PCI]"],
- ["CUDA", "6.1"],
- ["CUDA Driver", "8000"]
- ]
- ]
- ---
- > [root@E5-1660v3 ~]#
复制代码 我们可以把输出加个重定向- echo -e "info\nquit\n\n" | curl -m 5 telnet://172.16.16.11:36330 > stdout.txt 2> stderr.txt
复制代码 若文件stdout.txt为空,则说明FAHClient程序发生了僵死, 在文件stderr.txt里还有curl执行出错的更多信息。
下一步的工作
至此,最为难搞的FAHClient僵死判据已经得到了较为圆满的解决。下一步就是集成一个完整的FAH守护脚本。基本流程伪代码如下:
while 1
sleep 10 mins
if 检测结果==僵死 then
restart FAHClient
end if
end while
可以搞成定时任务,Linux下以crond方式实现,比如每10分钟执行一次。
每次先检测FAHClient程序是否发生了僵死,若僵死,则restart FAHClient,否则什么不干,退出。 Linux下FAH客户端分为service版本和免安装版, 对于service版本,直接调用service / systemctl重启,对于 免安装版, 则建议适当包装,成为service形式,以便restart。 Windows下定时任务和重启FAHCl也可通过一些相应的机制来完成,这里就不详说了。
(完)
由于近期工作任务繁忙,本人暂时就不去做实现了。对本文方案感兴趣的朋友,欢迎自行实现,推荐在校生练习一下。
|
评分
-
查看全部评分
|