前 言
在当今数字化蓬勃发展的时代背景之下,Web系统已广泛应用于诸多不同的领域,其安全可靠运行无疑具有举足轻重的地位。事实上,Web系统安全可靠运行并非单一维度的考量,而是一套涵盖多方面要素的综合性整体方案,其涉及的层面广泛且复杂,包括但不限于Web系统的可用性、可靠性以及安全性。本文聚焦于Web系统MTTR削减这一核心要点,从多个维度挖掘其实践经验,并予以详细的阐释与介绍,助力其在Web系统软件的构建、维护以及优化过程中,能够更为有效地保障系统软件运行的可用性。
MTTR 与系统可用性的关系
在当前复杂的软件系统和网络架构中,系统故障难以完全避免。衡量系统从故障发生到恢复正常运行的时间,即平均修复时间(MTTR,Mean Time To Repair),是评估系统可用性的关键指标之一。
1
相关概念
专业名词 | 释 义 |
故障率(Failure Rate)λ | 故障率是指工程系统或组件发生故障的频率,例如以每小时故障数表示。系统的故障率通常取决于时间,故障率在系统的生命周期内变化。在实践中,报告的是平均无故障时间(MTBF,1/λ),而不是故障率。如果故障率可以假设为常数,那么这是有效和有用的。 |
平均故障间隔时间(MTBF) | 英文全称:Mean Time Between Failure,顾名思义,是指相邻两次故障之间的平均工作时间,是衡量一个产品的可靠性指标。即平均无故障工作时间。就是从新的产品在规定的工作环境条件下开始工作到出现第一个故障的时间的平均值。MTBF越长表示可靠性越高正确工作能力越强。MTBF = 1/λ |
平均修复时间(MTTR) | MTTR 是指系统发生故障后,恢复到正常运行状态所需的平均时间。它包括故障检测时间、故障诊断时间、故障修复时间和系统验证时间等。计算公式通常为:MTTR = 总故障修复时间 / 故障次数。 |
2
系统可用性公式
系统可用性(Availability)可以用公式表示为:
其中 MTBF(Mean Time Between Failures)是平均故障间隔时间。从公式可以看出,在 MTBF 固定的情况下,降低系统 MTTR 能够显著提高系统可用性。
3
评估软件MTTR参考
MTTR(Mean Time To Repair)是描述产品由故障状态转为工作状态时修理时间的平均值。在工程学,MTTR是衡量产品可维修性的值,在维护合约里很常见,并以之作为服务收费的准则。
评估软件MTTR:
软件故障 检测机制 | 故障检测后 软件重启机制 | 估计的 MTTR |
通过Watchdog和(或)系统健康检测发现软件故障 | 处理器自动从ROM驻留镜像重新启动应用 | 30秒 |
通过Watchdog和(或)系统健康检测发现软件故障 | 处理器自动重启有问题的应用,无需重新启动操作系统 | 30秒 |
通过Watchdog和(或)系统健康检测发现软件故障 | 处理器自动重新启动,操作系统从磁盘映像重新启动并重新启动应用程序 | 3分钟 |
通过Watchdog和(或)系统健康检测发现软件故障 | 处理器自动重启,操作系统和应用程序镜像必须从另一台机器下载 | 10分钟 |
不支持软件故障检测 | 需要操作员手工重启 | 30分钟到2周不等 |
从上面评估软件MTTR参考估算可以看到,Watchdog技术在降低系统MTTR提高系统可用性设计中起到了保障系统稳定运行、快速恢复故障和降低运维成本的作用。
Watchdog 工作原理与工作流程
Watchdog是计算机可靠性领域中一个使用简单同时非常有效的检测工具。其基本思想是针对被监视的目标设置一个计数器和一个阈值,Watchdog会自己增加计数值,并等待被监视的目标周期性地重置计数值。一旦目标发生错误,没来得及重置计数值,Watchdog会检测到计数值溢出,并采取恢复措施。
其工作原理及工作流程如下:
1
工作原理
Watchdog 本质上是一种自动化的监控机制,其核心原理是通过定时轮询或事件驱动的方式,对Web系统的关键组件和运行状态进行持续监测。Watchdog 一般由定时器和一系列的检查模块组成。定时器按照预先设定的时间间隔(例如每 5 秒、10 秒等)触发检查操作,检查模块则针对系统的 CPU 使用率、内存占用、网络连接状态、关键进程的活跃度、数据库连接情况等关键指标进行检测,并将检测结果与预设的阈值进行比较。
2
工作流程
图1 Watchdog工作流程图
初始化阶段
在系统启动时,Watchdog 进行初始化配置,包括设置定时器的时间间隔、加载需要监控的系统组件和指标列表、读取预设的阈值参数等,同时建立与系统各组件的通信连接,为后续的监控工作做好准备。
监控循环阶段
定时器按照设定的间隔触发监控事件,Watchdog 依次调用各个检查模块对系统状态进行检查。例如,检查模块通过系统命令获取 CPU 使用率,如果当前 CPU 使用率超过了预设的阈值(如 80%),则将该异常情况记录下来,并进入故障处理流程。
故障处理阶段
当 Watchdog 检测到系统状态异常时,首先会根据预定义的故障处理策略进行初步的故障诊断。例如,通过查看相关进程的日志文件、系统事件日志等,尝试确定故障的类型和可能的原因。然后,根据诊断结果执行相应的修复操作,如尝试重启出现故障的进程、自动切换到备用服务器或服务实例、调整系统资源分配等。在故障修复后,Watchdog 会继续对系统进行监测,以确保系统已经恢复正常运行,并记录故障发生和修复的详细信息,以便后续的分析和统计。
Watchdog 关键技术实现
Watchdog 关键技术主要有以下几种:
算法类型 | 算法名称 | 检测规则 |
监控指标 获取 | 系统资源 监控 | 对于系统资源的监测,可以利用操作系统提供的性能计数器或命令行工具,通过解析这些工具输出的信息来获取当前系统的CPU 、内存、磁盘的使用情况。 |
网络连接 监控 | 使用网络套接字编程接口(如“socket” 库)来建立与目标服务器或服务的网络连接,并发送特定的探测数据包,通过检测数据包的响应时间、丢包率等指标来评估网络连接的质量和状态。 | |
应用程序和 服务监控 | 对于关键进程的监控,可以通过操作系统的进程管理 API来获取进程的状态信息,包括进程是否在运行、进程的 PID(进程标识符)、进程的资源占用情况等。 | |
故障检测 与诊断 | 阈值 比较法 | 为每个监控指标设定合理的阈值范围,当监控数据超出阈值时,即判定系统出现异常情况。例如,对于数据库连接池的使用情况,如果当前连接数超过了连接池最大连接数的 80%,且持续时间超过一定时长(如 5 分钟),则认为可能存在数据库连接资源紧张的问题,触发故障检测流程。 |
趋势分析 | Watchdog 可以对监控指标进行趋势分析。通过记录和分析监控数据的历史变化趋势,预测系统是否可能出现故障。例如,如果发现系统的响应时间在一段时间内呈逐渐上升的趋势,且上升速率超过一定阈值,可以发出预警信号,提示系统可能存在性能问题,以便运维人员及时进行排查和优化。 | |
故障修复 与恢复 | 自动重启 与切换 | 当 Watchdog 检测到某个关键进程出现故障(如进程意外终止、陷入死锁等情况)时,首先尝试自动重启该进程。可以通过调用操作系统的进程启动命令来实现进程的重启操作。 |
资源调整 与优化 | 在某些情况下,系统故障可能是由于资源不足或资源分配不合理导致的。对于数据库系统,如果发现查询性能下降,Watchdog 可以自动执行一些数据库优化操作,如查询缓存清理、索引重建等,以提高数据库的查询效率和整体性能。 |
Watchdog 真实案例分享
我们在项目开发过程中,通过Watchdog检测技术来实现对系统运行的关键进程及核心线程进行监控,通过以下案例分析展示了其显著效果,为保障Web系统的可用性提供了全面的技术引导。
进程监控
进程监控是保障Web系统可用性的关键环节,通过进程监测,可以及时发现进程异常,如进程崩溃、资源过度占用、响应时间过长等问题,从而采取相应措施避免系统故障、性能下降和数据丢失等情况。
1 背景与需求
威努特统一安全管理平台采用微服务架构实现,其服务器上运行着多个关键业务进程,如Web交付微服务、数据采集微服务、数据处理微服务、资产微服务、数据库微服务等,这些进程一旦出现故障将导致业务中断或系统无法使用,因此需要对其进行实时监控并在故障发生时快速恢复。
2 技术实现
通过配置 Watchdog监控脚本,设置对系统运行的Elasticsearch、Kafka、MySQL、Redis、platform、sasoc、teg-log、策略子系统这些关键进程的监控规则来对其进行监控。
例如,针对策略子系统进程, Watchdog每隔30秒检查一次该进程的状态,如果发现进程未响应或意外终止, Watchdog会立即尝试重启该进程;同时,针对该微服务, Watchdog还配置了端口探活的监控规则, Watchdog每隔60秒通过telnet命令连接该进程提供的8440端口,如果发现端口连接超时超过5次将重启该进程。
同理,如果 Watchdog采用对应的监控规则检测到某个进程出现了异常或意外终止,通过 Watchdog监控也能够自动启动、停止或重启某个进程以尽快恢复其功能,同时 Watchdog也可以收集该进程的运行日志以提供问题定位及修复验证。
3 实现过程举例
以下是一个使用 Watchdog监控策略子系统进程的配置示例,进程名为“policy_tomcatp”:
图2 监控脚本示例
这个配置指定了watchdog要监控的进程名称、监控规则以及用于启动和停止该进程的脚本。
以下是项目中使用watchdog进行进程监控的界面示例:
图3 组件监控界面图
这个系统组件监控界面展示的内容包括对Elasticsearch、Kafka、MySQL、Redis、platform、sasoc、teg-log、策略子系统等进程的监控。其中异常的进程有“teg-log微服务”和“策略子系统”,根据监测规则teg-log微服务出现了“服务进程异常”的情况,点击原因分析可以查看具体的异常日志。同理,策略子系统的异常情况是该进程占用的CPU持续比较高,也可以通过原因分析跟踪CPU持续飚高的具体原因。Watchdog 可以对异常进程进行监控及应急处理,一旦监测到异常,它会即刻自动重启进程,并记录详细的异常告警信息,以便后续追溯排查。而有些异常状况,即便 Watchdog 自动重启也无法彻底解决问题,此时,运维人员在分析出根本原因后,可借助监控界面预留的手动操作入口,便捷地执行 “重启” 或 “停止” 进程的操作。
4 效果与收益
通过对统一安全管理平台各微服务的进程状态监控,有效地减少了因进程故障导致的业务停机时间,提高了系统的可用性和稳定性,保障了企业业务的连续性;同时,通过进程监控可以主动运维,确保系统在出现潜在风险时提前做到及时的排查和优化。
线程监控
在Web系统中,线程的监控和管理是设计及开发人员的重要任务之一,通过有效的线程监控,可以确保系统的稳定运行,及时发现并解决系统运行的性能瓶颈和故障,尤其在多线程环境下,监控核心线程的运行状态可以帮助开发者及运维人员快速定位并修复问题,从而确保系统运行的健壮性。
1 需求与背景
威努特安全态势感知平台负责处理海量的日志数据,包括数据采集、数据分析、数据挖掘、数据查询等操作,该系统采用了多线程架构来提高并发处理能力,其中几个核心线程负责处理关键业务逻辑,如日志范化处理线程、数据外发线程、数据统计线程等。一旦这些核心线程出现故障,如死锁、内存溢出或长时间阻塞,将导致日志接收处理延迟、系统数据不一致、数据统计错误等严重问题,直接影响到系统的可用性,导致用户体验差甚至出现系统完全停摆的情况。因此,需要一个可靠的监控机制来实时监测这些核心线程的运行状态,并在出现异常时迅速采取措施进行恢复。
2 技术实现
我们在安全态势感知平台的优化设计中使用了 Watchdog 技术对系统运行的核心线程进行监控。
Watchdog 配置与启动
在Watchdog 配置脚本中,配置了需要监控的核心线程列表,包括线程名称、线程 ID 以及预期的运行状态和性能指标阈值。例如,针对日志范化处理线程,设置了最大允许的线程空闲时间为 90 秒。Watchdog 脚本在系统启动时自动启动,并以每30秒对核心线程进行轮询检查。
线程状态监测
在每次轮询时,Watchdog 通过线程状态文件获取核心线程的状态信息。这包括线程是否处于运行状态、是否被阻塞、已经运行的时间等。例如,对于日志范化处理线程,Watchdog 检查其是否在规定时间内完成了对缓存队列的消费,如果发现该线程超时(如 90 秒)未正常更新线程状态文件,则认为可能存在死锁或其他异常情况。
异常检测与处理
当 Watchdog 检测到某个核心线程的状态超出了预设的阈值范围时,立即触发异常处理机制。首先,它会详细记录线程的异常状态信息,包括异常发生的时间、线程名称、线程堆栈信息、内存占用、当前状态值以及与阈值的对比情况等,以便后续的故障排查和分析。
然后,根据异常的类型采取相应的恢复措施。如果是线程死锁,Watchdog 尝试通过发送中断信号或使用线程调试工具来解除死锁状态;如果是线程内存溢出,它会自动触发内存清理操作或通知系统管理员进行进一步的内存优化;对于长时间阻塞的线程,Watchdog 可以尝试重启相关线程(或服务),以恢复线程的正常运行。
告警与通知
在检测到核心线程异常并采取初步处理措施后,Watchdog 会及时向系统管理员发送告警通知。通知方式包括电子邮件、短信以及在系统管理控制台中显示醒目的告警信息,确保管理员能够第一时间得知系统出现的问题,并采取进一步的措施进行深入调查和修复。
3 实现过程举例
我们在项目中采用了Watchdog技术来监控各个服务运行的核心线程工作状态,工作异常时能够自愈并产生告警,具体实现过程如下:
图4 线程监控业务处理流程图
每个服务新增独立的线程定时执行监控任务,监控当前服务的所有核心线程状态,每个被监测服务的核心线程全部正常,更新当前系统时间戳到线程状态文件,有一个核心线程存在异常不更新当前系统时间戳到线程状态文件。
监控线程定时将当前时间戳和核心线程状态记录保存至线程文件中(root/logs/{服务名}_thread_status.log)。
Watchdog守护进程定期执行,发现线程状态文件时间戳有3次没有更新则重启对应的线程(或服务)。
线程状态文件每个服务每天一个,最多保留30天的文件,超过时删除最早一天的文件,硬盘空间超过阈值时优先删除线程状态文件。
重启线程(或服务)时导出线程(或服务)的jmap、jstack信息放到服务器目录/root/logs/各个服务名称,只存每个服务最新10个文件,之前的删除。
每个服务启动脚本中增加jvm配置,当出现内存溢出时执行脚本,使用脚本来重启当前服务。
具体判断一个线程死锁或死循环的实现方式:
图5 线程死锁&死循环处理流程图
上图通过时间轴展示了核心线程在运行过程中如何检测和处理可能出现的死锁和死循环问题,确保系统的稳定性和可靠性。具体判断过程如下:
核心线程启动一个 Runloop Start。在 Runloop 运行过程中,设置了一个卡死阈值 T。这个阈值用于判断 Runloop 是否卡死。
当 Runloop 运行到一定程度,达到卡死后阈值 T 时,系统会抓取线程栈信息,并初步判定为一次疑似的卡死情况。
进一步检查发现,Runloop 进入了死锁或死循环状态,这是图中用橙色矩形框标注的部分,表示出现了问题。
处理卡死情况,在发现死锁或死循环后,系统会尝试进行处理:
如果 Runloop 能够成功恢复,那么这次卡死情况被排除,系统继续正常运行。
如果 Runloop 无法恢复,系统自动重启核心线程(如果无法单独重启核心线程则重启核心线程的所属进程)恢复,这种情况被判定为一次线程卡死事件并产生告警。
Watchdog代码实现片段:
图6 线程监控实现代码片段
4 效果与收益
通过Watchdog 对安全态势感知平台运行的核心线程实时监控与异常处理,有效地提升了系统的可用性。实施后,系统意外停机时间从每周 2 小时降至每月不足 1 小时。同时优化了用户体验,核心线程稳定使数据操作相关问题减少,用户投诉率降低 60%。此外,它还提升了运维效率,告警通知便于快速解决问题,异常记录助力系统优化和故障预防。
结 语
通过合理地设计和部署监控脚本(Watchdog),可以在故障检测、诊断和修复等多个环节发挥重要作用,有效降低系统的 MTTR,从而显著提高系统的可用性。在实际应用中,需要根据系统的具体特点和业务需求,对 Watchdog 进行精心配置和优化,确保其能够准确、及时地发现和处理系统故障,保障系统的稳定运行。
渠道合作咨询 田先生 15611262709
稿件合作 微信:shushu12121
?发表于:中国 北京