你知道吗?chrome自动更新到104版本,居然引起Java服务内存泄漏

前言

近期在工作中,遇到了一次很有意思的内存泄漏,把排查过程和思路记下来,供大家参考和学习,如有不正确的,欢迎指正。

起因

最近几天很多半托管客户,突然报连接服务失败,登上服务器后查看内存很高,为了让客户尽快恢复业务,运维同事第一时间选择了重启。

top图

重启后,内存肉眼可见的速度涨了上来,研发同事判断后,可能之后又需要重启,临时给客户部署了备用服务。(不管三七二十一先扩容)

冰山一角

  • • 日志

    日志

Too many open files 代表已经到了当前进程可以打开的最大文件数,第一时间选择了先加大当前进程打开的最大文件数,让后续的请求可以正常处理

echo - n "Max open files=85535:85535" > /proc/pid/limits

通过命令查看当前已经打开的文件数

lsof -p pid | wc -l43326

正常的进程不可能打开这么多fd,所以应该存在连接泄漏

lsof - p pid | grep can't identify protocol

jstack打印当前的堆栈

jstack -l pid > pid.txt

找到当前堆栈中使用http地方,排查代码,检查代码有可能没close连接的地方。

修复好代码,上线后,重启进程,在观察发现内存很平稳,打开的文件数也逐渐平稳。

你以为这么简单就完事了?如果就这么简单,我就不会写这篇文章了。

第二天,第三天陆续有其他半托管客户找过来,同样的问题,内存泄漏,最大文件数一直居高不下,直到达到限制。

和上面的客户一样,修复同样的代码后,均都恢复了正常。

提问

1、为什么都是半托管的客户报这个问题,公有云未有客户反馈

2、这些半托管的客户为了稳定,代码已经很久没升级,代码都是2021年的,为什么都跟商量好似的,一起报问题,难道我有bug吸引体质?

3、为什么这些客户,物理机房隔离,问题表象却都一样?

4、客户需要一个合理的解释,我总不能说网络抽风了吧?

所有不合理的地方,其实都有合理的解释

半托管:后端服务和敏感数据在客户机房,前端网页在公有云。

理性分析

由于都是半托管客户,又都是因为fd太多,导致的内存泄漏。

那我们有一点是可以肯定的,那就是连接过多,导致fd激增,既然是网络问题,那我们就使用 万能法则 (遇事不决,先抓个包)

tcpdump -i any tcp -w tcp.pcap

抓完包后使用wireshark进行分析,发现有很多OPTIONS请求。

wireshak分析options

waht? 这个请求是使用jsonp的方式,为什么会存在options请求

在查看原本GET请求的内容

在这里插入图片描述

然后在公有云相同的服务器抓了个包,发现只有get请求,没有options请求,那可以说明这个options请求,只有在出现问题的半托管机器上有

但是我们有那么多半托管客户,报问题的却只有几个

大胆假设

我们都知道options是浏览器发的跨域预检请求,那说明这件事和浏览器脱不了干系,通过抓包文件来看,发options请求的浏览器的版本都是chrome 104版本。

嗯,chrome居然又更新了,我们大胆假设一下,内存泄漏和chrome版本有关系。

为了验证我的假设,我找到了chrome的升级说明。

嗯,果然只有假设才会有答案

附上chrome的升级说明。如果打不过也可以看下github的这个说明

  • • 大概意思就是说:

如果你从公网访问私有网络,那么会在chrome104版本,发option进行预检,该请求带有一个新的标头(Access-Control-Request-Private-Network: true)。在这个初始阶段,这个请求被发送,但是目前阶段你收到可以不响应,后续的请求还是会正常发送,并不会影响到你的业务,只会在 DevTools 中显示警告

下图带有private的为私有网络

私有网络定义

好家伙我一看,我处理的半托管客户,ip地址都为192x,172x,10x,全都属于私有网络,又都从公有云的网站发起请求,正好符合104版本描述的条件。

而且服务的代码比较老,收到options请求,没有正常释放,导致了内存泄漏。

天啦撸,你能想到一个内存泄漏,居然是因为chrome自动更新导致的吗?

总结

1、为什么都是半托管的客户报这个问题,公有云未有客户反馈

答:只有半托管客户满足公有ip访问私有ip的条件,且部分用户的chrome浏览器自动更新了

2、这些半托管的客户为了稳定,代码已经很久没升级,代码都是2021年的,为什么都跟商量好似的,一起报问题,难道我有bug吸引体质?

答:chrome自动更新导致

3、为什么这些客户,物理机房隔离,问题表象却都一样?

答:chrome自动更新导致,代码版本都比较老

4、客户需要一个合理的解释,我总不能说网络抽风了吧?

答:不知道chrome发表的版本说明,能不能说服客户

5、是不是只有chrome104版本受影响?

答:应该和chrome104同版本的其他浏览器也会受影响,测试edge也会有影响

6、如何判断我的网站受到影响。

答:首先需要满足公网访问私有网络的条件,其次可以在chrome请求或者抓包中,查看请求头有没有该标头

在这里插入图片描述

7、访问内网的https受影响不

答:上图就是访问https的服务,会受到影响

8、设置chrome://flags/#block-insecure-private-network-requests 可以避免不

答:我测试104版本没效果

9、服务端如何兼容

答:服务器应检查是否存在Access-Control-Request-Private-Network: true标头。如果请求中存在此标头,则服务器应检查Origin标头和请求路径以及任何其他相关信息(例如Access-Control-Request-Headers)以确保请求是安全的。通常,您应该允许访问您控制下的单个源。

一旦您的服务器决定允许该请求,它应该响应204 No Content(或200 OK)必要的 CORS 标头和新的 PNA 标头。这些标头包括Access-Control-Allow-Origin和Access-Control-Allow-Private-Network: true,以及其他需要的标头。

响应示例

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://foo.exampleAccess-Control-Allow-Private-Network: true

或者

HTTP/1.1 200 No Content
Access-Control-Allow-Origin: https://foo.exampleAccess-Control-Allow-Private-Network: true

10、服务端要不要兼容更新

答:我认为是有必要的,现在chrome发起options请求,你响应或者不响应都不会阻止后续的请求,但是如果他那天在自动更新,你如果未正常处理options请求,就不发送后续业务请求,

嗯。。。我已经联想到了一大部分程序员连夜加班修bug的场面了。

本文使用 文章同步助手 同步

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

推荐阅读更多精彩内容