Logback 同步方式打的日志,在生产环境上接口的调用响应时间,偶发性的出现超过 2s 的情况。 在测试环境上起一个接口,接口简单地就只执行 log 一个字符串的功能。模拟压测,50 个线程连续压一分钟,就能复现问题,卡点在两个方面:
- 在 Logback 底层实现中最后写文件是用到 BufferedOutputStream 的 flush 方法,写文件一般都挺快,可每隔几秒钟就会出现几次需要秒级才能完成的情况,慢的时候可以达 3-4s
- 同步方式写文件,Logback 源码中在写日志文件之前,会持有一个 ReentrantLock,那这种情况下前面持有锁的线程阻塞在写文件步骤了,其他的线程也就进不来了
基础知识不牢固,不知道怎么从 IO 层面去分析这个问题,想请假一下 V 友,如果说我云服务器的配置是 2 核 4G,磁盘是普通的云盘,为何会出现这种断续的耗时比较长的情况呢?是我磁盘的写入速率就这么高么?不至于吧,持有锁的线程就一个,写一个字符串能有多大?
还是说我其实还有一层,接口是跑在这个宿主机的容器里边,可能是容器层面什么配置设置得不合理?
再或者说断续的写同一个文件,表现就是这样的,跟底层的类似于用户缓存区呀,内核缓存区啥的有关?
卡好几天了,有了解的朋友望不吝赐教,感谢