又跪了。发现 S 有个任务访问 M 服务报错,登录机器,发现 M 服务跪了。重启 M 。 过了一段时间,S 又跪了,M 服务也跪了。会不会受了这个服务的影响呢 ? 将 M 服务所涉及的任务暂时禁用了。将 M 禁用后,S 似乎就没有跪过了。
HBase
发现有一些 HBase 写入失败。咨询 HBase 同学,是因为 QA 集群运行了一些离线任务,有时资源比较紧张。 虽然有疑点,但不太可能导致 S 跪。
脏数据
在排查过程中,也发现有些脏数据,导致 NSQ 消息处理失败。脏数据可能把一个任务搞跪,不过 S 里有很多任务,要把 S 跪掉,还需要一些“道行” 吧。
隐藏的坑
只是猜测,但确实是比较大的嫌疑。 因为前三者都是局部的影响,不太可能将 S 整个搞跪掉,但这个可能是全局的影响。比如说,某个 jar 版本的组件,与另一个组件交互,可能产生 bug , 吃内存,导致内存 OOM 。只是猜测。
ZJ 有了新的发现。从 dmsg 日志里看到,S 独占内存过多,Linux 内核将 S 的 java 进程 kill 掉了。调整了堆内存从 6.5G 到 4G,然后运行了一整天都没有跪。
java invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0 java cpuset=http://www.likecs.com/ mems_allowed=0 Pid: 4288, comm: java Not tainted 2.6.32-754.9.1.el6.x86_64 #1 [ 4286] 602 4286 3321904 1898888 2 0 0 java Out of memory: Kill process 4286 (java) score 929 or sacrifice child Killed process 4286, UID 602, (java) total-vm:13287616kB, anon-rss:7595528kB, file-rss:24kBQA 环境终于可以暂时安静一会了。 可是,生产环境如何解决呢?
S 承载着公司亿级订单的同步,显然不能容忍用打补丁的方式来解决(何况这个补丁很恶心,会埋很大的坑),而且也无法接入 aladdin ,自动升级 jar 版本。 因此, QA 的做法,只能暂时维稳,不能用作生产环境的解决方案。
咨询 ZJ ,是否有办法可以以最小成本来改造 S 应用 ? 回答:使用 youzan-boot 标准化工程。可是要改造成 youzan-boot 工程,势必改动很大,整个工程结构都变了,部署方式也变了,上线风险是很大的。对于 S 这样的应用,稍有不慎,就是 P1 或 P0 故障。
进退两难。
因为自己不太熟悉应用打包和部署的方式,有点畏难。但想了想,本质上就是把应用里的任务想办法启动起来。绝大部分代码都是可以复用的,只需要在新的工程结构中,将原来的启动代码嵌入进去。想到这里,有了一些信心,决定采用新工程的方式来解决这个问题。
根据 ZJ 提供的文档及界面,很快建立了新的标准化脚手架工程。接着,将原工程的代码拷贝到新的工程里,并在启动的入口,将原来启动任务的类的方法添加进去。
我是一个不解决主要问题寝食难安的人。深夜,继续。部署后,初始化任务出错。只好加日志,看看哪里抛异常了。不加不要紧,一加he一跳。
`Task task = new Task(); logger.info("task:{}", task) , 竟然打出了个 null !
new 出了个 null ? 百思不得其解。想着,恐怕又没进展了, 打算睡觉了。正准备睡觉的时候,突然灵光一闪,去查看了下 toString 方法,是打印 task 实例中的 taskConfig 的,而此时 taskConfig 作为入参还没有设置到 task 中,因此打印为 null 。真是脑经急转弯啊。 遇到的每个问题,都是一道面试题。):
看来,在程序的世界里,一切奇怪的事情,总有一个合理的缘由。 联想到前不久的 “奇怪之事总有缘由:订单状态对比不一致问题排查” ,有所领会。
继续排查为什么 task 没有正确初始化。对比原工程,发现 task 是一个声明为 prototype 的类,所引用的组件,也是 prototype 的。
折腾到凌晨一点,终于能够看到,任务在消费消息了。奇怪的是,日志没有打出来 。先睡觉吧。
第二天一大早,就去找 DS 排查日志为什么没找到。DS 在一个 undefined.home 的目录下找到了日志文件。 日志路径的配置有问题。 按照 DS 的指点,导入了标准的 XML 日志配置,在期望的目录打印了任务处理日志。略开怀。
可错误日志没打出来。这也是要命的事情。在发布线上的过程中,若没有错误日志的提醒,那是冒着枪林弹雨的冲锋,是容易中弹身亡的。
DS 指点:可以直接把原来的文件拷贝过来亦可。错误日志终于打出来了! 开心 !~~ 又前进了一步,more closed to success。
打印日志到本地磁盘之后,还要上报到公司内部的日志平台上,方便查看多台服务器的日志。照葫芦画瓢,折腾了下,搞定了。喜。