問題描述:最近項目在各個環境,發現第一次請求時候,總是會很慢。但是之后的請求都是幾十或者幾百毫秒。通過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
