ASR项目实战-交付过程中遇到的内核崩溃问题
当前参与交付的语音识别产品服务,算法模块基于经典的Kaldi,算法中的一部分运行在GPU之上。
算法团队采用的是声学模型+语言模型的1-pass方案。这个方案的特点在于,语言模型数据文件(HCLG文件)的大小,和训练语料的丰富程度正相关,即语言文本的语料越多,经过训练、转换后得到的语言模型文件越大。
经过数据团队一段时间的努力,当前项目使用的语言模型,已经达到了 XX GB的规模。
这对我负责交付的算法服务组件带来了全方位的挑战:
- 版本构建,耗时接近30分钟。
- 安全扫描,耗时接近30分钟,运气不好的话,可能会上升至1小时+。
- 版本上传软件仓库,耗时至少10分钟。
- 版本部署,耗时约30分钟。
- 服务启动,耗时5分钟,其中主要时间都用来解析、加载语言模型文件。
平时在开发的部署环境上远程调试业务时,需要反复给服务打补丁、重启,由于启动时间耗时在5分钟,因此调试效率很低。受限于硬件规格,调试效率低的问题一直没有很好的解决方法,于是开发小伙伴们只好忍着。
但终于有一天的晨会上,开发小伙伴向我抱怨,现在调试算法服务时效率非常低,启动程序时,至少需要两次,等待10分钟,才能将程序运行起来。小伙伴们反复验证,发现打补丁之后,第一次启动算法服务时一定会启动失败。小伙伴反馈的这个信息,一开始我并没有放在心上,但事后证明这是一个大的疏忽。
后来,我交付的一个需求,代码在本地使用UT用例验证完毕,进入在环境上做功能验证的环节。这时由于需要反复的对环境打补丁、重启服务,修复远程调试过程中发现的问题,同样的,我也遇到了小伙伴反馈的现象。不过这个现象被我误判断为网络问题,因为那段时间网络特别差,经常断网,导致控制台程序随机断开,这也会导致服务启动不成功。
网络的问题很好修复,并且持续的时间比较短。而我自己UT做的相对比较充分,因而花在远程调试的时间比较短,因此业务需多次启动的问题,对我的困扰不大。于是,这个多次启动的问题被我轻易放过了。
版本转测试之后,测试同事反馈两个现象:
- 在配置中心修改配置后,无法自动生效。
- 测试同事部署新版本之后,需要至少需要启动两次,才能把服务正常运行起来。
这两个现象都很奇怪。
对于第一个现象,我们基于基础平台来交付业务,很多产品的服务都使用这套框架,而我们团队内部其它的服务也使用了这套框架,都没有遇到过在配置中心修改配置后不生效的现象。
对于第二个现象,正常情况下,使用部署工具完成算法服务的部署之后,算法服务本身是应该处于运行状态的。但测试同学发现使用最近的版本安装完成之后,算法服务经常处于启动失败的状态。而手工启动时,至少需要两次启动,才能启动成功。
测试同事是在做性能压力测试的准备工作时观察到的前述现象,虽然暂时不会阻塞性能测试,但本着怀疑一切、不能放过问题的精神,测试同事提交了问题单,要求尽快解决。于是,现在不能当成偶然事件放过了,需要认真对待,否则必然影响版本发布。
对于测试同事反馈的第一个问题,为便于后续的说明,这里先介绍一下配置管理的实现方案。
配置管理服务,包括配置中心和cnfg_agent。
- 配置中心集中部署,提供Web界面供用户管理、维护应用服务的配置项和值。
- cnfg_agent和业务服务组件同机部署,使用相同的运行账号,定时从配置中心服务读取配置项和值,并写入本地文件,由业务服务组件读取。
经过观察测试同事的环境,有如下发现:
- 环境上的cnfg_agent进程没有处于运行状态。手工启动cnfg_agent后,在配置中心修改的配置值,可以被cnfg_agent正常同步至本地。由此可以确认cnfg_agent自身的业务功能是正常的。
- 两次启动算法服务后,发现cnfg_agent进程消失了,因此需要确认cnfg_agent消失的原因。
联系配置管理服务的技术支持同学,了解到cnfg_agent的工作原理。
- cnfg_agent安装过程中,安装脚本会自动定义一个cron任务。
- 在cron任务的脚本代码中,会主动检查cnfg_agent进程是否存在,如不存在,则拉起cnfg_agent进程。
因此,即便是cnfg_agent由于自身的原因退出运行,理论上讲,应该很快被定时运行的cron任务检测到异常,并自动启动,不应该出现cnfg_agent长时间处于离线状态的现象。
进一步检查测试同事提供的环境,发现一个新的现象。如前所述,cnfg_agent和业务组件同机部署,使用了相同的操作系统的账号。检查测试环境的主机,发现业务账号恰好没有创建cron任务的权限,这意味着安装cron定时任务的操作一定失败。因此当cnfg_agent进程退出后,没有定时任务来检测、并重新拉起cnfg_agent进程。这可以解释为什么cnfg_agent消失后不能自动恢复运行。
于是,在测试环境上,手工给业务账号增加创建、执行cron任务的权限,并增加cnfg_agent的cron任务。之后尝试多次重启算法服务,发现cnfg_agent虽然会退出运行,但很快就会被cron任务拉起。
因此cnfg_agent进程退出后无法恢复运行的问题,可以使用本方法临时规避。
继续分析。
检查cnfg_agent的日志文件,在启动算法服务的时间点,找到了cnfg_agent退出运行的日志记录。
对于我们提供的信息,配置管理服务的技术支持同学给出的答案是,cnfg_agent退出运行,通常只在操作系统重启时才有可能会遇到。
按照这个答复,检查/var/log/messages,居然真的找到了操作系统重启的日志记录,同时观察到了内核crash的记录。检查时间点,发现启动算法服务、cnfg_agent退出运行,这三件事的时间点相同。
这时,基本可以把算法服务第一次启动失败、cnfg_agent退出运行、操作系统重启,这三件事情关联在一起分析。
联系操作系统专家,在其协助下,顺利的找到了操作系统重启的原因。原来是出现了内核crash现象,并且在出现问题的一台主机上提取到了内核crash的相关记录。
我们当前部署算法服务的主机,基于CentOS定制,安装了kdump工具。操作系统专家依据kdump生成的crash信息,找到两类原因:
- 主机的内存不足,触发内核crash。
- GPU驱动的代码中存在一处bug,申请内存后,没有对指针判空,当申请内存失败时,C库返回的是空指针,这时GPU驱动的代码直接操作这个指针,触发了空指针异常,进而导致内核crash。
这两个原因都和内存相关。
和操作系统专家、基础设施专家交流后,依据他们的建议,选择一台存在问题的主机,提交扩充规格的申请,将内存放大一倍。再复现操作,发现算法服务只需一次即可正常启动。
经反复重试后,确认:
- 内核不再crash。
- cnfg_agent不会出现重启现象。
- 算法服务只需一次即可启动。由于扩充规格后,CPU数量蛮多,现在启动算法服务的时间也缩短了。
因而有理由推断:
- cnfg_agent的意外重启现象,和cnfg_agent自身的质量无关,和操作系统重启强相关。
- 操作系统的重启现象,主要由内核crash导致。
- 而内核crash现象,目前看和算法服务所在主机的硬件规格过低相关。
- 扩充规格后,一切问题现象全部消失。
将前述定位的信息同步给测试同事,经过讨论之后,测试同事基本认可分析结论。
大家达成一致结论:
- 对于硬件规格不足的问题,同意调整测试环境中主机的规格,继续执行其余的验证。
- 对于GPU驱动中存在的问题,需要算法同事介入,验证高版本的GPU驱动是否解决了相关的问题。
- 假如高版本的GPU驱动解决了问题,涉及到的版本升级、版本部署包、安装指导等的更新,暂时先放在任务清单。
后记:
升级硬件规格之后,操作系统内核crash的现象不再出现。但前述描述的原因和现象之间的关系,个人感觉还是有点牵强。比如在重启应用时,这时系统其实处于空载状态,内存占用率、显卡的内存占用率,实际上比较低,但内核仍然会出现crash事件,比较怪异。由于不具备分析内核、驱动类故障的技能和经验,并且无法获得操作系统专家进一步的协助,因此本事件暂时放一放。
如下是kdump相关的帖子:
ASR项目实战-交付过程中遇到的内核崩溃问题的更多相关文章
- 21全志r58m平台的framework在使用过程中会莫名的崩溃掉
21全志r58m平台的framework在使用过程中会莫名的崩溃掉 2018/10/25 16:20 版本:V1.0 开发板:SC5806 1.系统编译: rootroot@cm88:/home/ww ...
- 如何让使用create-react-app构建的项目在build过程中如何不生成.map文件
避免create-react-app的项目在build的过程中生成 .map 文件的方法:主要是更改 package.json 里面的 build 命令!正式进入修改步骤前,推荐安装 cross-en ...
- Python全栈工程师之从网页搭建入门到Flask全栈项目实战(5) - Flask中的ORM使用
1.理解ORM ORM是MTV模型里面的Model模型 ORM(Object Relational Mapping),对象关系映射 举例:学生选课 学生和课程这两个实体,一个学生可以选择多门课程,一个 ...
- Python工业互联网监控项目实战3—websocket to UI
本小节继续演示如何在Django项目中采用早期websocket技术原型来实现把OPC服务端数据实时推送到UI端,让监控页面在另一种技术方式下,实时显示现场设备的工艺数据变化情况.本例我们仍然采用比较 ...
- AngularJS进阶(三十九)基于项目实战解析ng启动加载过程
基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...
- C# 项目提交过程中感受
C# 项目提交过程中感受 新到一家互联网公司,昨天第一次提交代码,遇到了不少问题,而且大多数是代码格式问题,特此将范的错误记录下来,自我警示. 1. 代码对齐,这个虽然一直也都在注意,不过还是有一行代 ...
- Android项目实战(二十四):项目包成jar文件,并且将工程中引用的jar一起打入新的jar文件中
前言: 关于.jar文件: 平时我们Android项目开发中经常会用到第三方的.jar文件. 其实.jar文件就是一个类似.zip文件的压缩包,里面包含了一些源代码,注意的是.jar不包含资源文件(r ...
- log4j 日志信息的引入(通用版)——解决项目运行过程中的日志信息
定义 log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程 ...
- Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题
日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚 ...
- 跟我extjs5(03--在项目过程中加载文件)
跟我extjs5(03--在项目过程中加载文件) 上一节中用sencha工具自己主动创建了一个项目.而且能够在浏览器中查看. 如今我们来看看js类载入过程. 例如以下图所看到的: watermark/ ...
随机推荐
- 6. 用Rust手把手编写一个wmproxy(代理,内网穿透等), 通讯协议源码解读篇
用Rust手把手编写一个wmproxy(代理,内网穿透等), 通讯协议源码解读篇 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy githu ...
- Jupyter_Notebook_添加代码自动补全功能
Jupyter Notebook 添加代码自动补全功能 安装 如果之前安装过显示目录功能的话,这一步骤可以跳过. pip install jupyter_contrib_nbextensions 配置 ...
- 《美英报刊阅读教程(中级精选本)(第五版)》 ISBN: 9787301306864
作者: 端木义万 著 出版社: 北京大学出版社 出版时间: 2019-09 版次: 7 ISBN: 9787301306864 定价: 69.00 装帧: 平装 开本: 16开 纸张: ...
- MySQL数据库操作 Lab1
实验一 MySQL数据库操作 实验目的: 掌握MySQL安装.配置与登录方法,使用MySQL客户创建数据库及对数据库表完成各种操作 实验内容: 1. 安装MySQL数据库管理系统, ...
- Centos7下创建centos-home逻辑分区
1备份要挂载的文件夹 查看home文件夹有无文件,如有文件一定要记得备份 2创建逻辑分区 2.1查看已有逻辑分区 2.2查看磁盘分区情况 2.3查看磁盘PV 2.4创建逻辑分区 lvcreate -n ...
- 征集 meme
当你每次兴致勃勃地和好友分享自己喜欢的歌但 Ta 不屑一顾 / 不喜欢时:
- JS个人总结(2)
1.null被认为是一个空的对象引用..如果定义的变量准备将来用保存对象,最好将该变量初始化null.即 var x=null;这样只有检查null值就可以知道这个变量是否已经保存了一个对象.. 2. ...
- Unity进阶提升-2D游戏跳跃手感优化(跳起下落)
在进行2D游戏开发时,跳跃是不可缺少的一个重要功能.但是我们在Unity开发时Unity本身的物理引擎并不能提供很好的的手感,下落的时候轻飘飘的,这操作起来显然非常不舒服.所以,我们需要自己对跳跃进行 ...
- Java 中 field 和 variable 区别及相关术语解释(转)
https://www.jianshu.com/p/08e2d85d3ce9 这是一个以前从没仔细想过的问题--最近在阅读Java Puzzlers,发现其大量使用了"域"这个词, ...
- gitlab : You won`t be able to pull or push project code via SSH until you add an SSH key to your profile(导致的问题:合并不了代码)
gitlab : You won`t be able to pull or push project code via SSH until you add an SSH key to your pro ...