跳過導覽

2020 年 Google Summer of Code 計畫

您知道此頁面是由 Github Wiki 頁面 自動產生的嗎?您可以自行改善 此處

加入基於 io_uring 的通訊協定

說明

Netty 支援立即使用的各種通訊協定,可根據作業系統來使用。目前它支援

  • NIO 通訊協定 - 可以在任何支援 Java 的平台/作業系統上運作
  • 原生 Epoll 通訊協定 - 僅在 Linux 上運作,可用功能會根據使用的 Kernel/GLIBC 版本而有所不同
  • 原生 Kqueue 通訊協定 - 理論上可以在任何 BSD 上運作,但主要在 MacOS 上測試。

由於大多數公司都使用 Linux 作為生產系統的主要作業系統,因此「原生 Epoll 通訊協定」通常被使用。雖然此通訊協定已經比一般 NIO 通訊協定提供許多優點,但它仍然「遭受」一個缺點,而且這項缺點也存在於 NIO 通訊協定中。它使用系統呼叫與系統/kernel 進行通訊以執行所有網路操作。

這包括(但不限於)

  • 開啟 Socket
  • 接受 Socket
  • 寫入 Socket
  • 從 Socket 讀取
  • 關閉 Socket

在過去幾年,使用系統呼叫為我們帶來許多好處,但由於頻譜和熔毀事件,系統呼叫的成本愈來愈高(未來很有可能還會更高),因此現在大家都有興趣降低系統呼叫的次數。

有望達到此目標的方式就是使用 io_uring (https://kernel.dk/io_uring.pdf) [1, 2]。它提供一種抽象和 API,可以用於與核心溝通,以進行大多數情況下完全無需系統呼叫的 IO 操作。雖然詳細解釋 io_uring 的實際內部運作不在本討論範圍內,但最重要的重點在於它提供一種通過環狀緩衝區進行溝通的方式,而該環狀緩衝區使用的是同時對應到使用者空間和核心空間的記憶體。

預期的成果/好處/交付成果

為確保 Netty 未來可以使用 io_uring,我們需要撰寫一個新傳輸層,它將利用提供的 API。由於這將使用 C API,因此需要透過 JNI 來完成(就像原生 Epoll 傳輸層)。

所需的技能

  • 熟悉 Java 和 C 程式語言(包括如何從 Java 程式碼中使用它 == JNI)
  • 了解 Linux 及其網路 API

複雜度

  • 困難

潛在的導師

  • Francesco Nigro
  • Norman Maurer

相關資源

回歸測試套件

說明

Netty 目前包含一些單元測試和整合測試,它們會在 PR 驗證以及每晚執行。雖然這樣有助於確保我們未在功能方面加入任何回歸錯誤,但對於偵測其他類型的回歸錯誤卻無濟於事,例如:

  • 記憶體外洩(原生和非原生)
  • 記憶體負擔
  • 配置量增加
  • GC 壓力

為了協助我們偵測這些類型的問題,我們希望擴充目前的測試套件,以納入有助於確保我們在上文中提到的情況下不會發生回歸錯誤的測試/工具。

預期的成果/好處/交付成果

  • 能夠在 CI 建置中執行測試套件,如果偵測到回歸錯誤,則終止建置
  • 產生顯示與配置/記憶體使用等相關趨勢的圖表

所需的技能

  • 熟悉 Java
  • 熟悉測試架構
  • 熟悉 Docker

潛在的導師

  • Francesco Nigro
  • Norman Maurer

複雜度

  • 中等

相關資源

實作事件迴圈遙測

說明

Netty 附帶自己實作不同的事件迴圈類型,但卻缺乏觀察能力:如果在事件迴圈上提供計數器和指標,讓外部觀察者了解事件迴圈的使用方式,將有助於使用者調整並確認應用程式的效能瓶頸或錯誤設定,以達成目標負載。雖然觀察能力通常需要付出代價,但理想情況下,它的影響應該可以由它自身衡量,並且經過仔細設計和實作,以盡可能輕量化。

預期的成果/好處/交付成果

設計、實作並透過不同的使用案例評量建議指標的有效性,以及當不用遙測時與之比較會有哪些影響。

所需的技能

  • 具有 Java 和評量經驗
  • [理解佇列理論]

複雜度

  • 中度

潛在的導師

  • Francesco Nigro
  • Norman Maurer

實作原生事件迴圈遙測

說明

Netty 支援立即使用的各種通訊協定,可根據作業系統來使用。目前它支援

  • NIO 通訊協定 - 可以在任何支援 Java 的平台/作業系統上運作
  • 原生 Epoll 通訊協定 - 僅在 Linux 上運作,可用功能會根據使用的 Kernel/GLIBC 版本而有所不同
  • 原生 Kqueue 通訊協定 - 理論上可以在任何 BSD 上運作,但主要在 MacOS 上測試。

後兩項在 Netty 本身就有特定的 JNI 實作,而第一項則使用 Java NIO,只做一些微幅更動。這類原生的傳輸實作可以收集特定的指標和遙測資料,有助於觀察/解決正在執行的系統問題。

預期的成果/好處/交付成果

設計、實作並透過不同的使用案例評量建議指標的有效性,以及當不用遙測時與之比較會有哪些影響。

所需的技能

  • 具有 Java 和評量經驗
  • 熟悉 Java 和 C 程式語言(包括如何從 Java 程式碼中使用它 == JNI)
  • 了解 Linux 及其網路 API

複雜度

  • 中度

潛在的導師

  • Francesco Nigro
  • Norman Maurer
上次於 2024-07-19 檢索