您是否曾經因為一些慢到似乎永遠也載入不完的頁面而火大?最近我們一個旅遊行業的客戶就遭遇了這種事情。不知道為甚麼,他們有一些 web API 請求耗時長達 200ms。

幸運的是,OpenResty XRay 拯救了他們,幫助他們迅速找出了長延遲問題的根本原因。本文將演示 OpenResty XRay 如何使用“智慧抓包”功能,只抓取慢速的(或有其他錯誤的)TCP 連線上的資料包而不影響生產伺服器的效能。

問題

應用伺服器原本應該處理得很快的一些 API 請求卻耗時長達 200ms。

長延遲問題可能有很多不同的原因,比如磁碟 I/O 速度慢、核心網路堆疊或其他網路裝置的資料包丟失、CPU 使用率高導致應用程式或 web 伺服器響應速度減慢,或者只是網路連結和連線不暢。在這種可疑因素很多的情況下,使用像 OpenResty XRay 這樣的動態追蹤工具可以更加容易地解決這些棘手的問題。

分析過程

響應延遲的分佈

OpenResty XRay 首先對客戶生產環境中的 web 伺服器(這裡是指 OpenResty 或 Nginx web 伺服器)處理的請求進行取樣。OpenResty XRay 的一個優點是,它可以安全地分析線上應用程式和伺服器,而不對執行中的使用者程序做改動。

然後它自動為響應延遲建立下面顯示的對數分佈圖。

time-distr

注意,有 5 個請求延遲較長,時長在 131ms ~ 262ms 的範圍內。

最慢的請求

OpenResty XRay 還自動收集了那些最慢的請求的 URI 和其他資訊。

connection

出於保護隱私的原因,我們改了這裡的 Host 名。

從上表中可以看出來,所有慢請求的目標都是 URI /view/shopcart/

智慧抓包

OpenResty XRay 有一個獨特的功能,就是可以只在我們感興趣的 TCP 連線上捕捉和分析網路資料包。例如在上面這種情況下,我們就只想看到請求延遲超過 100ms 的 TCP 連線。

OpenResty XRay 自動識別了那些緩慢的 TCP 連線,並捕獲了其中的 TCP 資料包。其中一個樣本在 OpenResty XRay 的 web 控制檯中看起來是這樣的。

connection

在這個圖表上,小圓圈代表伺服器的 ingress 資料包,而方塊則代表 egress 資料包。

在圖表中,有一個資料包的延遲非常長,大約 200ms。就是這個 “ACK+PUSH” 資料包,它是用小圓圈標識的,這意味著它是一個從客戶端傳送的入站或 ingress 資料包。

從這一點我們可以排除應用伺服器或閘道器 web 伺服器的原因。一定是在客戶端或客戶端和伺服器之間的網路連結處多出了這個額外的 200ms 的延遲。

罪魁禍首

檢查客戶端和伺服器之間的網路連結是否有缺陷很簡單。我們的客戶隨後將注意力轉移到他們的安卓移動應用程式的客戶端應用程式上。

很快他們發現,客戶端軟體故意在傳送請求頭和傳送請求正文之間增加了 200ms 的延遲。謎底解開了!

修復後的改善

從下面的新的 OpenResty XRay 請求延遲分佈圖可以看出,在客戶修復了其客戶端應用中的額外延遲後,200ms 的長延遲問題已經不復存在。

connection

全自動化的分析

OpenResty XRay 可以自動選擇合適的分析器對目標程序進行取樣,自動分析生成的火焰圖,最後在自動分析報告中以人性化的形式呈現出分析結果。這將會更加方便客戶使用,他們不必整天盯著伺服器,也不必手動執行合適的分析器,甚至不必理解分析器本身取樣的結果。

OpenResty XRay 日報

OpenResty XRay 是甚麼

OpenResty XRay 是一個動態追蹤產品,它可以自動分析執行中的應用程式,以解決效能問題、行為問題和安全漏洞,並提供可行的建議。在底層實現上,OpenResty XRay 由我們的 Y 語言驅動,可以在不同環境下支援多種不同的執行時,如 Stap+、eBPF+、GDB 和 ODB。

關於作者

章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。

章亦春(Github ID: agentzh),生於中國江蘇,現定居美國灣區。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、雅虎、阿里巴巴, 是 “邊緣計算“、”動態追蹤 “和 “機器程式設計 “的先驅,擁有超過 22 年的程式設計及 16 年的開源經驗。作為擁有超過 4000 萬全球域名使用者的開源專案的領導者。他基於其 OpenResty® 開源專案打造的高科技企業 OpenResty Inc. 位於美國矽谷中心。其主打的兩個產品 OpenResty XRay(利用動態追蹤技術的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最適合微服務和分散式流量的全能型閘道器軟體),廣受全球眾多上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源專案貢獻了累計超過百萬行程式碼,其中包括,Linux 核心、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,並編寫過 60 多個開源軟體庫。

關注我們

如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號

翻譯

我們提供了英文版原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!