图片验证码事故总结

事故描述

2016.10.22.09.30左右验证码无法显示,一直超时。初步调查发现2016.10.21日晚上10点已经出现此问题。加上往前几天内也发现了图片验证码服务变慢,偶尔超时的现象。但是服务器一直运行,未出现宕机。

事故原因

最终调查发现,是因为图形验证码服务器中缓存的10000张图片导致了内存过多占用(>90%),服务器实际的请求处理能力变弱。之前2个多月的运行没有暴露是因为图片验证码用量小。最近用量稍微增大后,就会出现此问题。

事故分析

一开始考虑是并发量超过处理能力导致服务器变慢,于是在本地进行了压测,发现增大线程确实可以增大QPS,然而忽略了JVM运行参数,因此结论并不准确。
后来统计Nginx访问量后发现,接口调用在正常值范围内,并不多。

  • 查看线上日志后,发现了heap space的OOM错误,但是并不确定是请求拥塞还是其他原因。
  • 在本地使用和线上相同的JVM参数后再进行压测,由于生成图片验证码池需要一定时间,所以长时间压测后发现出现相同错误。参数中配置了dump OOM。
  • 使用MAT工具对dump文件进行分析。以下是MAT推荐分析结果。
Overview
  • 继续查看Histogram:
Histogram
  • 发现BufferImage占用了近470M内存(默认启动参数里设置的是500M)。Int数组为像素数组。验证码池刚好占用了91%,并没有完全占满。所以具备一定服务能力,也是为什么之前运行2个月都没有暴露的原因。不过请求数量变多,按道理会触发消耗图片验证码,反而是释放内存才对,确实,所以上述验证码对象并没有到达1万,dump前肯定有一定的消耗,但是由于剩余内存已经完全不够当时请求处理需要的内存,所以请求处理线程无法创建,请求一直积压导致timeout。 请求线程需要内存,同样也会释放内存,每0.5秒触发消耗验证码,但若是0.5秒内进来的请求所需的内存大于省下的内存,就会造成OOM。由于验证码对象个数并没有超过10000,所以初步断定不是内存泄漏导致。但是还需要进一步排除。

  • 在本地分别对单独循环生产验证码逻辑和生成到验证码池做测试,发现后者在内存一定的情况下,确实会引起OOM,前者并不会,排除内存泄漏。

  • 把JVM的 Xmx参数改为800M后,长时间压测没有影响系统稳定性,佐证了结论。

事故处理

调整JVM内存大小或者减小图片验证码池大小。目前一方面稍微增大了JVM内存,并且合理的设置了图片验证码大小。

事故总结

之前只是通过最终网页展示的图片大?。?lt;5KB)毛估了1万张图片的占用量(约50M),所以认为对内存需求并不大,事实是,每张图片对应的内存对象平均50KB左右(包括无法GC的直接或者间接强引用对象)。当时得出10000张的结论也没有经过科学计算,也是毛估。现在对其进行分析,得到了如下公式:
S = T3/T2 - T3/T1
其中:
S 为验证码池大小
T1 为生成到验证码池的周期
T2 为从验证码池消费验证码的周期
T3 为最大连续高峰服务时间(S值能保证这段时间内不用临时生成新的图片验证码而浪费CPU)
(时间单位均为s)
巧的是验证码池刚好接近500M占用,但是并不完全占用,所以小量运行没有运行就出错,而且后台生成到池子的速度也很慢,所以短期高并发压测也并不会出现异常。总之因为很多巧合,图片验证码系统侥幸运行至今。在设计系统的时候,还是要多一点科学的精打细算。

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,939评论 25 707
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,221评论 11 349
  • JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: ...
    光剑书架上的书阅读 2,497评论 2 26
  • 生命就是一杯清茶,就是一支歌谣,就是一首耐人寻味的小诗!让我们一路行走,一路品味,一路经历,静静享受这美丽的人生!
    张伟kk阅读 154评论 0 0
  • 年前为了投扇贝的产品经理职位撰写的扇贝产品分析报告: 原文地址:http://08643.cn/p/...
    人人都爱小小麦阅读 1,116评论 3 3