[英]Highly Concurrent Apache Async HTTP Client IOReactor issues
應用說明:
根據以上各節,這是我的光纖http客戶端的調諧(當然,我正在使用的單個實例):
PoolingNHttpClientConnectionManager connectionManager = new PoolingNHttpClientConnectionManager( new DefaultConnectingIOReactor( IOReactorConfig. custom(). setIoThreadCount(16). setSoKeepAlive(false). setSoLinger(0). setSoReuseAddress(false). setSelectInterval(10). build() ) ); connectionManager.setDefaultMaxPerRoute(32768); connectionManager.setMaxTotal(131072); FiberHttpClientBuilder fiberClientBuilder = FiberHttpClientBuilder. create(). setDefaultRequestConfig( RequestConfig. custom(). setSocketTimeout(1500). setConnectTimeout(1000). build() ). setConnectionReuseStrategy(NoConnectionReuseStrategy.INSTANCE). setConnectionManager(connectionManager). build();
將打開文件的ulimit設置為超高(軟值和硬值都為131072)
kernel.printk = 8 4 1 7 kernel.printk_ratelimit_burst = 10 kernel.printk_ratelimit = 5 net.ipv4.ip_local_port_range = 8192 65535 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.rmem_default = 16777216 net.core .wmem_default = 16777216 net.core.optmem_max = 40960 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.core.netdev_max_backlog = 100000 net.ipv4.tcp_max_syn_backets = 20000.net net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_slow_start_after_idle = 0 net.ipv4.tcp_sack = 0 net.ipv4.tcp_timestamps = 1
問題描述
Pending
stat clibms也急劇上升到30K掛起的連接請求 lsof
荷蘭國際集團的java程序,我可以看到它有成千上萬的文件描述符,幾乎所有的人都在CLOSE_WAIT(這是有道理的,因為I / O反應螺紋模/停止功能和永遠不會真正關閉它們 問題
忘了回答這個問題,但是發布問題大約一周后,我得到了什么?
某種錯誤配置導致io反應器僅產生2個線程。
即使在提供更多的反應堆線程之后,問題仍然存在。 事實證明,我們的傳出請求主要是SSL。 Apache SSL連接處理將核心處理傳播到JVM的SSL設施,這些設施-效率不足以每秒處理數千個SSL連接請求。 更具體地說,SSLEngine內部的一些方法(如果我沒記錯的話)是同步的。 在高負載下執行線程轉儲顯示IORecator線程在嘗試打開SSL連接時互相阻塞。
甚至嘗試以連接租用超時的形式創建泄壓閥也不起作用,因為創建的積壓訂單過多,導致應用程序無用。
將SSL傳出請求處理工作卸載到nginx的情況甚至更糟-因為遠程端點搶先終止了請求,所以無法使用SSL客戶端會話緩存(JVM實現也是如此)。
忍不住將信號燈放在整個模塊的前面,在任何給定的時刻將整個事情限制在6000左右,這解決了問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.