问题描述:最近项目在各个环境,发现第一次请求时候,总是会很慢。但是之后的请求都是几十或者几百毫秒。通过skywalking检测,发现有个undertow特别耗时:
一般都是第一次有这个问题,之后再请求,都是毫秒级的。
网上搜了几次后,刚开始是在yaml文件加上配置:
server: port: ${LAFENG_SERVER_PORT:8102} undertow: io-threads: 16 # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程 # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8 worker-threads: 256 # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理 # 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可 buffer-size: 1024 # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region #buffers-per-region: 1024 # 是否分配的直接内存(NIO直接分配的堆外内存) direct-buffers: true
发现不起作用,刚开始以为是自己设置的问题。但是网上开了几篇类似文章,解决方式都是让加这个配置。最后发现是自己写的方式有问题:改成这种就生效了
server: port: ${LAFENG_SERVER_PORT:8102} undertow: # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程 # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8 # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理 # 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可 buffer-size: 1024 # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region #buffers-per-region: 1024 # 是否分配的直接内存(NIO直接分配的堆外内存) direct-buffers: true threads: io: 8 worker: 256
具体原因,网上有分析。参考:
https://blog.csdn.net/hunger_wang/article/details/91997210?spm=1001.2101.3001.6650.16&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-16.topblog&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-16.topblog&utm_relevant_index=23
https://blog.csdn.net/weixin_40623736/article/details/117482482
https://blog.csdn.net/hunger_wang/article/details/90180215