一次线上异常的追踪与处理

💡 原文中文,约3600字,阅读约需9分钟。
📝

内容提要

5月31日晚,玩家反馈游戏请求超时,经过检查发现是JDBC连接异常和内存溢出引起的。通过增加Hikari连接池大小和优化数据库性能,问题得到解决,数据库空间清理后性能显著提升。

🎯

关键要点

  • 5月31日晚,玩家反馈游戏请求超时,经过检查发现是JDBC连接异常和内存溢出引起的。
  • 请求超时的错误状态码为408,表示服务器关闭空闲连接。
  • 日志检查发现两个pod宕机,原因是JDBC连接异常和Java内存溢出。
  • 未设置连接池上限导致请求排队,最终导致内存溢出和服务宕机。
  • 通过增加Hikari连接池大小解决了连接问题,最大连接数从10增加到100。
  • 服务对数据库请求处理过慢是导致阻塞的深层原因,需优化数据库性能。
  • 聊天记录存储占用性能,通过分表处理和异步插入优化性能。
  • 优化消息保存数量,每500条进行一次清理,清理至300条以节省空间。
  • 对数据库表进行空间优化,清理后表空间占用缩小了40%。
  • 经验教训:计算资源不足时,请求会阻塞,最终导致内存溢出和服务崩溃。

延伸问答

游戏请求超时的原因是什么?

请求超时是由于JDBC连接异常和内存溢出引起的。

如何解决JDBC连接异常的问题?

通过增加Hikari连接池的大小,从默认的10增加到100,解决了连接问题。

内存溢出的根本原因是什么?

内存溢出的根本原因是未设置连接池上限,导致请求排队和内存占用过高。

如何优化数据库性能以避免请求阻塞?

通过分表处理聊天记录、使用异步插入和定期清理消息数量来优化数据库性能。

清理数据库表空间的效果如何?

经过清理,表空间占用缩小了40%,使数据库性能显著提升。

在处理大量请求时,如何避免服务崩溃?

确保计算资源充足,避免请求阻塞,定期优化数据库和连接池设置。

➡️

继续阅读