V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
weishao666
V2EX  ›  问与答

Logback 同步日志偶尔阻塞问题

  •  
  •   weishao666 · 2019-07-15 20:37:10 +08:00 · 2167 次点击
    这是一个创建于 1719 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    1 条回复    2019-07-15 20:38:27 +08:00
    weishao666
        1
    weishao666  
    OP
       2019-07-15 20:38:27 +08:00
    我知道 Logback 有异步打日志的方式,并且效率相对优于同步,就是想搞明白,这里到底是怎么卡住了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2450 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 15:52 · PVG 23:52 · LAX 08:52 · JFK 11:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.