Cloudfloar proxy issue

今天收到反應說 API 速度有變慢,盤查結果發現目前使用的 Cloudflare 中的 proxy 功能造成的,這邊紀錄盤查過程。

從下圖可以看到有多支 API 變慢,這邊先分析變慢的原因。

api request is slow

分析

  1. 測試網路節點狀況,看是否有節點異常緩慢
  2. 測試 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。

目前路由狀況是 client -> cloudflare proxy -> origin server。由於網站上的 SSL 綁定都是使用 Cloudflare 免費 SSL/TLS,這功能必須 enable proxy。若要 disable proxy 的話,必須將 SSL 憑證在其他地方綁定。這次測試先暫時把 SSL 憑證改綁在 AWS Elastic Load Balancing 上。

比較結果

可以看到調整過後,約提升了 60% 的效率。這邊評估可能是 proxy 的節點較遠,而 client 需要先經過 proxy 才能到達 origin server,所以導致變慢。 這邊有一個網站 cloudflare-test,可以測試 proxy 的地理位置,另外 proxy 會隨時間作變動非固定。

BeforeAfter
 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
 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
comments powered by Disqus