Cloudfloar proxy slow
今天收到反應說服務 API 的反應速度有變慢, 盤查結果發現目前使用的 Cloudflare 中的 proxy 功能造成的, 這邊紀錄盤查過程.
從下圖可以看到有多支 API 變慢,這邊先分析變慢的原因。
分析
- 測試網路節點狀況,看是否有節點異常緩慢
- 測試 API 請求狀況,查看請求是否有緩慢的階段
測試網路節點狀況
MTR 分析網路節點狀況,可以看到節點的響應速度在 200 ms 內,看起來還在可接受範圍內。
1➜ sudo mtr --tcp --port 443 --report --report-cycles 5 api.bitwin.ai
2Start: 2021-08-13T17:28:56+0800
3HOST: JustinLee Loss% Snt Last Avg Best Wrst StDev
4 1.|-- rt-ac68u-2ad0 0.0% 5 2.5 2.4 1.8 3.5 0.7
5 2.|-- h254.s98.ts.hinet.net 0.0% 5 11.7 7.9 6.1 11.7 2.3
6 3.|-- tpn2-3301.hinet.net 0.0% 5 20.0 11.2 5.8 20.0 6.0
7 4.|-- tpdb-3031.hinet.net 40.0% 5 9.9 9.5 9.1 9.9 0.4
8 5.|-- 220-128-8-121.hinet-ip.hi 0.0% 5 8.5 10.7 7.5 18.5 4.5
9 6.|-- tyfo-4011.hinet.net 0.0% 5 12.0 9.1 6.8 12.0 2.0
10 7.|-- r31-la.us.hinet.net 0.0% 5 142.5 142.9 140.1 148.3 3.2
11 8.|-- r32-la.us.hinet.net 0.0% 5 139.9 141.4 139.0 143.1 1.9
12 9.|-- 141.101.72.250 0.0% 5 153.2 146.1 139.4 153.3 6.8
13 10.|-- 104.21.33.138 0.0% 5 140.3 141.2 139.8 142.6 1.2
測試 API 請求狀況
使用 curl 命令對 api/ping 做請求, 這支 API 非常輕量, 但響應時間需要 1144 ms, 有點不合理.
由下面資訊可以看到在 time_appconnect 這邊花了比較長的時間, 也就是可能在做 TLS 的時候佔了很長的時間, 而因為有使用 Cloudflare proxy, 所以 client 端在是對 proxy 的機器做 TLS Handshake.
time_appconnect here is TLS setup. The client is then ready to send it’s HTTP GET request.
1➜ bash curl_timetrace.sh
2# starting_time: Fri Aug 13 17:43:56 CST 2021
3 time_namelookup: 0.002113
4 time_connect: 0.187355
5 time_appconnect: 0.521270
6 time_redirect: 0.000000
7 time_pretransfer: 0.521435
8time_starttransfer: 1.144257
9 ---------------------
10 time_total: 1.144484 seconds
Troubleshoot
經由上面分析觀察到可能是 TLS 耗時太久. 嘗試移除 Cloudflare proxy 的功能, 讓 Cloudflare 只單純的做 DNS.
目前路由狀況如下圖. 由於網站上的 SSL 綁定都是使用 Cloudflare 免費 SSL/TLS, 這功能必須啟用 proxy. 若要禁用 proxy 的話, 必須將 SSL 憑證在其他地方綁定. 測試時先暫時把 SSL 憑證改綁在 AWS Elastic Load Balancing 上.
flowchart LR client --> cloudflare["Cloudflare proxy"] cloudflare --> originServer["origin server"]
比較結果
可以看到調整過後, 約提升了 60% 的效率. 這邊評估可能是 proxy 的節點較遠, 而 client 需要先經過 proxy 才能到達 origin server, 所以導致變慢.
這邊有一個網站 cloudflare-test,可以測試 proxy 的地理位置,另外 proxy 會隨時間作變動非固定。
Before
1➜ bash curl_timetrace.sh
2# starting_time: Fri Aug 13 17:43:56 CST 2021
3 time_namelookup: 0.002113
4 time_connect: 0.187355
5 time_appconnect: 0.521270
6 time_redirect: 0.000000
7 time_pretransfer: 0.521435
8time_starttransfer: 1.144257
9 ---------------------
10 time_total: 1.144484 seconds
After
1➜ bash curl_timetrace.sh
2##### starting_time: Fri Aug 13 20:31:22 CST 2021
3
4 time_namelookup: 0.002898
5 time_connect: 0.117132
6 time_appconnect: 0.344409
7 time_redirect: 0.000000
8 time_pretransfer: 0.344475
9 time_starttransfer: 0.453052
10 ---------------------
11 time_total: 0.453251 seconds