得,今天这事儿得好好说道说道,服务器又给我撂挑子。那叫一个措手不及。
事情是这样的,下午正喝着茶,突然监控系统就跟疯一样报警,红彤彤一片,全是连接超时的错误。心里咯噔一下,坏,八成是那台核心业务服务器出事儿。
第一反应,赶紧连上去看看。 打开终端,噼里啪敲上ssh命令,回车。没反应,光标在那儿傻等着。心里更凉,ssh都连不上,这问题小不。
第二步,试试能不能ping通。 切到另一个窗口,`ping *.xxx`,请求超时。得,网络层面可能就断,或者机器直接死那儿。
这时候不能慌,得想辙。还好我们有机房的远程控制台权限,虽然那玩意儿卡得要死,但关键时刻能救命。登录过程就不细说,反正就是慢,点一下等半天。进控制台界面,看到登录界面倒是出来,但感觉就是卡。
输用户名,密码,回车。等好久,终于进去。赶紧打开个终端窗口,敲个 `top`,想看看是哪个孙子在捣乱。
开始排查
这一看不要紧,CPU占用率直接拉满,100%!内存也剩下没多少。怪不得卡成这样,连ssh服务都没资源响应。
到底是啥进程搞的鬼? 定睛一看,一个平时挺老实的Java应用进程,CPU吃得死死的。这就奇怪,这应用平时负载不高。
赶紧琢磨,这应用最近有啥改动没?对,昨天下午好像更新一个小版本,说是优化个啥功能。难道是新版本有bug?
不能瞎猜,得看日志。 费劲巴拉地 `cd` 到应用日志目录,`tail -f *`。刷刷刷,屏幕上开始滚日志,全是错误!仔细一看,好像是新加的那个功能逻辑里,有个地方死循环,或者触发啥无限递归之类的玩意儿。
这就有点头绪。这玩意儿疯狂吃CPU,导致系统资源耗尽,其他服务都没法正常工作,连远程连接都卡死。
找到问题
原因大概是找到,咋办?总不能让它一直这么跑着。
- 先杀进程,恢复服务要紧。 找到那个Java进程的PID,`kill -9 PID`。强制干掉!
- 等一小会儿,再看 `top`,CPU占用率“唰”一下就下来,恢复正常。
- 再试试ssh连接,通!ping也通!网站访问,也恢复!
长舒一口气,总算是活过来。 但是事情没完,这只是临时解决问题,那个bug还在。
赶紧抓着开发那小子,让他看日志,查代码。果然,是他昨天更新的代码里,有个边界条件没考虑到,在特定情况下会进入死循环,疯狂消耗CPU。
让他赶紧修复,回滚。这帮小年轻,有时候做事就是毛糙。
这回宕机,前前后后折腾一个多小时。虽然解决,但影响挺不也给我提个醒,以后应用更新,特别是核心业务的,一定要做更充分的测试,还得加上资源使用的监控,不能等它把服务器拖垮才知道。
说起来,这让我想起刚入行那会儿,有一次也是服务器挂,那时候啥也不懂,对着屏幕抓瞎,还是老大过来几下就搞定。那时候就觉得,经验这东西,真是实打实干出来的,光看书本理论没用。得多踩坑,多实践,才能遇事不慌。
行,今天就记录到这儿,喝口水压压惊去。