Logback 同步日志偶尔阻塞问题

2019-07-15 20:37:10 +08:00
 weishao666

Logback 同步方式打的日志,在生产环境上接口的调用响应时间,偶发性的出现超过 2s 的情况。 在测试环境上起一个接口,接口简单地就只执行 log 一个字符串的功能。模拟压测,50 个线程连续压一分钟,就能复现问题,卡点在两个方面:

  1. 在 Logback 底层实现中最后写文件是用到 BufferedOutputStream 的 flush 方法,写文件一般都挺快,可每隔几秒钟就会出现几次需要秒级才能完成的情况,慢的时候可以达 3-4s
  2. 同步方式写文件,Logback 源码中在写日志文件之前,会持有一个 ReentrantLock,那这种情况下前面持有锁的线程阻塞在写文件步骤了,其他的线程也就进不来了

基础知识不牢固,不知道怎么从 IO 层面去分析这个问题,想请假一下 V 友,如果说我云服务器的配置是 2 核 4G,磁盘是普通的云盘,为何会出现这种断续的耗时比较长的情况呢?是我磁盘的写入速率就这么高么?不至于吧,持有锁的线程就一个,写一个字符串能有多大?

还是说我其实还有一层,接口是跑在这个宿主机的容器里边,可能是容器层面什么配置设置得不合理?

再或者说断续的写同一个文件,表现就是这样的,跟底层的类似于用户缓存区呀,内核缓存区啥的有关?

卡好几天了,有了解的朋友望不吝赐教,感谢

2182 次点击
所在节点    问与答
1 条回复
weishao666
2019-07-15 20:38:27 +08:00
我知道 Logback 有异步打日志的方式,并且效率相对优于同步,就是想搞明白,这里到底是怎么卡住了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/583217

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX