效能

Envoy 的架構旨在透過在少量執行緒上執行事件迴圈,以最佳化可擴展性和資源使用率。「主」執行緒負責控制平面處理,而每個「工作」執行緒則處理一部分資料平面處理。Envoy 公開兩個統計資料,以監控所有這些執行緒上事件迴圈的效能。

  • 迴圈持續時間:在事件迴圈的每次迭代都會完成一些處理。此數量會隨著負載的變化而自然變化。但是,如果一個或多個執行緒具有異常長的尾部迴圈持續時間,則可能表示效能問題。例如,工作可能無法在工作執行緒之間公平分配,或者擴充功能中可能存在阻礙進度的長時間阻塞操作。

  • 輪詢延遲:在事件迴圈的每次迭代中,事件分派器會輪詢 I/O 事件,並且在某些 I/O 事件準備好處理或逾時觸發時「喚醒」,以先發生者為準。在逾時的情況下,我們可以測量輪詢後預期的喚醒時間和實際喚醒時間之間的差異;此差異稱為「輪詢延遲」。看到一些小的輪詢延遲是正常的,通常等於核心排程器的「時間片」或「量子」——這取決於 Envoy 執行的特定作業系統——但是,如果此數字顯著高於其正常的觀察基準,則可能表示核心排程器延遲。

可以透過將enable_dispatcher_stats設定為 true 來啟用這些統計資料。

警告

請注意,啟用分派器統計資料會記錄每個執行緒上事件迴圈每次迭代的值。這通常應該是最小的開銷,但是當使用statsd時,它會單獨透過網路傳送每個觀察到的值,因為 statsd 協定沒有任何方式來表示直方圖摘要。請注意,這可能是非常大量的資料。

事件迴圈統計

主執行緒的事件分派器有一個以 server.dispatcher. 為根的統計資料樹,而每個工作執行緒的事件分派器都有一個以 listener_manager.worker_<id>.dispatcher. 為根的統計資料樹,每個樹都有以下統計資料

名稱

類型

描述

loop_duration_us

直方圖

事件迴圈持續時間(以微秒為單位)

poll_delay_us

直方圖

輪詢延遲(以微秒為單位)

請注意,此處不包含任何輔助執行緒。

看門狗

除了事件迴圈統計資料之外,Envoy 還包含一個可設定的看門狗系統,該系統可以在 Envoy 沒有回應時遞增統計資料,並且可以選擇終止伺服器。該系統有兩個獨立的看門狗組態,一個用於主執行緒,另一個用於工作執行緒;這很有幫助,因為不同的執行緒有不同的工作負載。該系統還有一個擴充點,允許根據看門狗事件採取自訂動作。這些統計資料對於在高階層了解 Envoy 的事件迴圈是否沒有回應很有用,可能是因為它正在做太多工作、阻塞或未被作業系統排程。

看門狗會在 main_threadworkers 中發出匯總統計資料。此外,它還會在 server.<thread_name>. 樹下發出個別統計資料。<thread_name> 等於 main_threadworker_0worker_1 等。

名稱

類型

描述

watchdog_miss

計數器

標準遺失次數

watchdog_mega_miss

計數器

大型遺失次數