1、问题现象
生产2C商品接口有RT超过1s的现象,打点并看不出问题所在
2、推测
servlet filter 有耗时操作
通过实现ResponseBodyAdvice#beforeBodyWrite方法 打点请求在写入buffer前的时间,判断耗时花在,response已经准备完成的后续 servlet filter或buffer write阶段
结果:打点 所有serlvet限时耗时无明显增加
socket buffer
org.apache.catalina.connector.CoyoteOutputStream#write
调用链
HttpEntityMethodProcessor#handleReturnValue -> MappingJackson2HttpMessageConverter#writeInternal -> UTF8JsonGenerator#flush ->
CoyoteOutputStream#write/flush -> Http11OutputBuffer#doWrite ->SocketWrapperBase#doWrite -> NioEndpoint#doWrite -> NioSelectorPool#write -> NioBlockingSelector#write
selector 轮训socket是否可写的超时时间默认是 1000ms
3、解决
数据包比较大,导致缓冲区慢了,客户端会等超时后再次重试
增加socket缓冲区大小
socket.appWriteBufSize=8096->65536
socket.txBufSize =8096->65536