对于大多数运维程序员来说,时时刻刻都需要关注服务器和系统程序可能出现的问题并提前解决。
今天我们就通过案例分析来了解一下,运维程序员如何快速处理线上问题。
任何一旦掉进坑里,明智的做法一定是:跳坑_>填坑_>避坑,线上故障处理的过程也一样,优先级从高到低,线上故障处理的目标如下:跳坑‘跳坑’——快速恢复线上服务,或者将对线上服务的影响降到低。
线上服务的可用性决定着服务者的客户利益,影响着公司的收益。
一旦线上环境不可用,无法服务用户,给公司/团队带来经济利益损失的同时,更为严重的会给公司/团队带来恶劣的名声。
所以一般公司都会对线上环境提出稳定性和可靠性的要求,这也是团队乃至部门的kpi。
为此,遇到生产故障后的一要务是:恢复生产服务,即使不能完全恢复线上服务,也要想尽办法将对线上服务的影响降到低。
填坑‘填坑’——找到问题原因,根本上解决问题。
在恢复线上服务,尽大限度减掉对用户/公司/团队带来的影响后,我们需要彻查问题,搞清楚故障发生的根本原因,从根本上解决问题。
通常情况下,‘填坑’和‘跳坑’是同步在做的,完成‘填坑’也就意味中‘跳坑’成功,但是也有一些紧急情况下的特别‘跳坑’方法,比如重启服务,或者服务降级/熔断等等,实际并未在当时完成‘填坑’,而是先采取非常规手段‘跳坑’,之后再慢慢‘填坑’。
避坑‘避坑’——举一反三,消灭隐患。
找到了根本原因,解决了问题之后,我们需要举一反三,以此及彼,想想在这个故障排查和处理过程中,那些环节存在弱点?那些流程/规范/制度需要优化?这类问题是否在其他系统或者团队中也存在?通过这样的反思和自我批评,形成一份线上事故报告,不断完善流程,避免再次踩坑,也在团队中交流经验,共同提高。
线上故障处理的思路依据线上故障处理的目标及目标的优先级,线上排障的一目标是恢复线上服务或者降低对线上服务的影响,关键点在于快速二字,在‘跳坑’-‘填坑’之后,再行回溯总结,以便‘避坑’。
因此,可以将线上故障处理的步骤分为:故障发现故障定位故障排除故障回溯其中前三步是‘跳坑’行为,后面一步包含了‘填坑’和‘避坑’。
上述步骤并不是说要从上到下顺序进行,建议在不乱阵脚的情况下,并行去做,因为通常线上故障后会紧急启动故障处理程序,运维、开发、测试、产品各个角色都会参与进来,这时候分工下去,并行去做,不断汇总消息,做出判断,以求快速排障,恢复服务。
这个思路类似于操作系统的fork/join设计思想,目的在于提高效率。
在无法快速找到故障原因的时候,需要果断跳过故障定位环节,直接进行故障排除,比如采用服务降级、服务器扩容等手段,确保对线上服务降到低且可控。
湖北北大青鸟http://www.kmbdqn.cn/建议可以等到线上服务’撑’过去之后,我们再慢慢定位故障原因,根本上解决问题。
坑:奥山40人战场,开场之后全场只有不到20个人,这种情况就可以叫坑。坑的意思就是指开了局的战场,也就是新场的反义词。挖坑:国家队排到一个场,但是这个场已经有20人左右(非国家队队员,也就是所谓的野人),这个时候国家队的队员最多进去20人,这个时候国家队一般都选择不进,这个时候国家队20多人一起丢掉队列就会造成这个战场一下子多出了20多个位置,一般来说玩家单排是没有这么快就可以进满这个战场,所以造成了这个战场开局认输还是不满,这就是国家队所说的挖坑。
填坑:国家队无论喊排还是团排,都一样是40+人一起排战场,这样根据服务器分配原则就很有可能多数人分在一个场里,而一个战场要同时容纳这么多人一般只有新场,所以国家队这种排法一般都能排到新场,但是也不排除有可能排到旧场(开了局的场或者队员很少人排到这个场),这个时候你进去就算是填坑,因为这是一个没满人的场或者说开了局没满人的场。
坑是指地下的一个凹下去的地方,也就是没有填满的地方,所以用坑比喻没有满的战场。而用土(填坑的东西)比喻玩家,你进这个战场也就是你去填这个坑。
这个够明白了吧?呵呵,给我分吧
modbus是一种比较通用的协议,用来做数据采集很方便,也很便宜,至少比NI的板卡便宜两个量级,但是配置较为复杂,同时采集速率并不高。对于1s左右采样间隔的数据来说,modbus是一种非常合适的方式。
labview使用modbus有很多种方法,其中最方便地第一种就是用共享变量引擎(Shared Variable Engine, SVE)来读写modbus的寄存器(类似模拟IO)和线圈(数字IO)。其他方法比较繁琐,因此这里只研究了这种labview使用I/O Server访问modbus的方式,其它的比如采用VISA的modbus串口/TCP VI进行读写的方式以及采用OPC服务器进行读写的方式在这里就不研究了。
这里采用的win10 64bit中文版系统,Labview 2018(和谐版),同时安装了分布式控制系统(Distributed Control System, DSC),这样就可以使用modbus I/O Server了,根据官网资料,除了labview,必须还要安装DSC或者RT模块,才能使用modbus,其中最好是安装DSC模块。
这里的系统架构如下图所示,Labview负责逻辑和前端展示,与PLC的modbus协议进行交互是通过I/O Server完成的。I/O Server其实是NI 的共享变量引擎SVE的一种插件。所以在运行的时候需要安装和启动SVE。
这个SVE一般在windows里面是以服务形式安装的,安装的服务名为NITaggerService,安装位置是在C:\Program Files (x86)\National Instruments\Shared\Tagger。如果是SVE的一些问题,可以查看这个服务是否启动。但是坑爹的NI没有说log文件在哪儿,有时候查错很麻烦。
安装了DSC之后,就可以启用modbus I/O Server了,对于中文Win10系统装labview 2018而言,坑的地方在于你按照官网教程走完是不行的,会出现modbus变量无法读取的问题,并且显示链接已经断开。如果你手动启动SVE服务(即:NITaggerService),当时是可以启动的,然后你用NI分布式系统管理器(NI distributed system manager)查看变量会不成功,再看服务已经停止了,但是由于没有log文件,所以我们也不知道它什么时候停止的。
后来发现一个方法可以修正这个问题:在NI分布式系统管理器中重新编辑一次I/O Server(参考下土),再在“操作”菜单下点击“启动本地共享变量引擎”,所有的值就正常了。
modbus在I/O Server中的的地址设置比较诡异,是按照[数据解释类型][功能码地址头][PLC格式的起始地址].[位]来区分的。
比如SD400002,其中数据解释类型是SD,表示有符号的双字整数(Signed DWord Integer),双字意味着这是个32位的整数,需要两个寄存器,功能码地址头是4,表示功能码是3,即modbus的保持寄存器(Holding Register)字段,后面的PLC格式的起始地址是5位的00002,也就是从第2个寄存器开始,连续取2个寄存器(即00002和00003),组合成有符号的双字整数。
至于组合的过程涉及到大小端(Endianness)的问题,大小端涉及到byte order和word order的问题,一个word就是一个寄存器(16位),一个byte是8位,当一个寄存器中的两个byte组合并解释为变量的具体取值的时候,可以选择把哪个byte放到前面,哪个byte放到后面,这就是byte order,大部分情况下,byte order是大端在前(big endianness),而word order则是在两个寄存器储存的两个16位的字(word),如何组成32位的数据,不同的厂商会有不同的约定,这个就差异比较大了,需要查看手册。
NI的modbus I/O Server中,word order可以在高级选项中设置,但是byte order是没有地方可以设置的。
此外,NI还有一个比较坑爹的地方是它的modbus tcp连接不支持502以外的端口。也就是一个IP地址最多只能对应一个modbus,虽然可以靠Unit ID来进行区分,但是实际使用中也可能存在用不同端口区分设备的情况。
1.[How LabVIEW Uses I/O Servers]( https://www.ni.com/zh-cn/innovations/white-papers/12/how-labview-uses-i-o-servers.html )
2. [Connect LabVIEW to Any PLC Using OPC](https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000x0MPCAY&l=zh-CN)
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)