????????Onload 是 Solarflare 公司開發(fā)的加速的網(wǎng)絡(luò)中間件。它在用戶空間實(shí)現(xiàn)了 TCP/IP 網(wǎng)絡(luò)協(xié)議棧,能在用戶空間直接訪問(安全的)網(wǎng)絡(luò)適配器硬件訪問權(quán)限硬件。網(wǎng)絡(luò)數(shù)據(jù)可以直接在網(wǎng)絡(luò)和應(yīng)用之間收發(fā),而不必通過操作系統(tǒng),這種技術(shù)稱為“內(nèi)核旁路”。
????????內(nèi)核旁路(kernel bypass)可避免系統(tǒng)調(diào)用、上下文切換以及中斷打斷,從而提高應(yīng)用程序代碼執(zhí)行效率。這也直接減少了主機(jī)處理開銷,通常能夠節(jié)省一半左右,為應(yīng)用程序處理留出更多的CPU時(shí)間。這對于網(wǎng)絡(luò)密集型應(yīng)用程序效果最為明顯,例如:
市場行情和交易應(yīng)用程序
- 計(jì)算流體動(dòng)力學(xué)(CFD)
- HPC(高性能計(jì)算)
- HPMPI(高性能消息傳遞接口),Onload兼容使用MPICH1和2、HPMPI、OpenMPI和SCALI
- 其他并行計(jì)算的物理模型
- 高帶寬視頻流
- Web 緩存、負(fù)載平衡和 Memcached 應(yīng)用程序
- 內(nèi)容加速網(wǎng)絡(luò)(CDN)和 HTTP 服務(wù)器
- 其他系統(tǒng)熱點(diǎn),如分布式鎖管理器或強(qiáng)制序列化點(diǎn)
????????Onload 庫在運(yùn)行時(shí)使用標(biāo)準(zhǔn) BSD 套接字 API,這意味著不需要對應(yīng)用程序任何修改即可進(jìn)行加速。Onload 是第一個(gè)也是唯一一個(gè)提供完整內(nèi)核旁路 的POSIX套接字的產(chǎn)品。
和傳統(tǒng)網(wǎng)絡(luò)對比
????????當(dāng)使用傳統(tǒng)網(wǎng)絡(luò)時(shí),應(yīng)用程序調(diào)用操作系統(tǒng)內(nèi)核向網(wǎng)絡(luò)發(fā)送數(shù)據(jù)和從網(wǎng)絡(luò)接收數(shù)據(jù)。從應(yīng)用程序到內(nèi)核的切換代價(jià)高,并且可能成為重要的性能瓶頸。當(dāng)使用 Onload 加速的應(yīng)用程序需要發(fā)送或接收數(shù)據(jù)時(shí),它不需要訪問操作系統(tǒng),而是可以直接訪問網(wǎng)絡(luò)適配器上的分區(qū)。
????????傳統(tǒng)模型的一個(gè)重要特征是,應(yīng)用程序不能直接訪問網(wǎng)絡(luò)硬件,因此不能損害系統(tǒng)的完整性。Onload 能夠通過在硬件級別將 NIC 劃分為多個(gè)受保護(hù)的“虛擬NIC”(VNIC)來保持系統(tǒng)完整性。應(yīng)用程序可以被授予對 VNIC 的直接訪問權(quán)限,而無需訪問系統(tǒng)的其余部分(包括不屬于該應(yīng)用程序的其他 VNIC 或內(nèi)存)。因此,在?Solarflare NIC 上使用 Onload 可以在不影響安全性或系統(tǒng)完整性的情況下實(shí)現(xiàn)最佳性能。?
????????總之,Onload 可以顯著降低網(wǎng)絡(luò)處理開銷。
onload 如何提升性能
????????Onload 可以通過降低 CPU 開銷,提升延遲、帶寬和程序擴(kuò)展性性能,顯著降低與網(wǎng)絡(luò)相關(guān)的開銷。
????????開銷
????????從用戶空間應(yīng)用程序轉(zhuǎn)換到內(nèi)核和從內(nèi)核轉(zhuǎn)換到內(nèi)核是一項(xiàng)相對昂貴的操作,這通常需要執(zhí)行數(shù)百或數(shù)千條指令。對于傳統(tǒng)的網(wǎng)絡(luò),每次應(yīng)用程序發(fā)送和接收數(shù)據(jù)時(shí)都需要這樣的轉(zhuǎn)換。使用Onload,TCP/IP 處理可以完全在用戶進(jìn)程內(nèi)完成,從而消除了昂貴的應(yīng)用程序/內(nèi)核轉(zhuǎn)換,即系統(tǒng)調(diào)用。此外,Onload TCP/IP 協(xié)議棧經(jīng)過高度優(yōu)化,進(jìn)一步節(jié)省了開銷。
????????Onload 節(jié)省的開銷意味著應(yīng)用程序可以使用更多的 CPU 計(jì)算能力來完成有用的工作。
? ? ? ? 延遲
????????按照慣例,當(dāng)服務(wù)器應(yīng)用程序準(zhǔn)備好處理事務(wù)時(shí),它會(huì)調(diào)用操作系統(tǒng)內(nèi)核來執(zhí)行“接收”操作,在該操作中,內(nèi)核會(huì)將調(diào)用線程“休眠”,直到來自網(wǎng)絡(luò)的請求到達(dá)。當(dāng)這樣的請求到達(dá)時(shí),網(wǎng)絡(luò)硬件“中斷”內(nèi)核,內(nèi)核接收請求并“喚醒”應(yīng)用程序。
????????所有這些開銷都需要占用CPU周期以及增加緩存和頁表緩沖(TLB)的空間。使用 Onload,應(yīng)用程序可以保持在用戶級別,等待請求到達(dá)網(wǎng)絡(luò)適配器并直接處理它們。消除內(nèi)核到用戶的轉(zhuǎn)換、中斷以及隨后的用戶到內(nèi)核的轉(zhuǎn)換可以顯著降低延遲。總之,降低開銷意味著降低延遲。
? ? ? ? 帶寬
????????由于 Onload 的開銷較小,它每秒可以處理更多字節(jié)的網(wǎng)絡(luò)流量。除了為萬兆網(wǎng)絡(luò)設(shè)計(jì)的經(jīng)過特殊優(yōu)化的緩沖和算法外,應(yīng)用程序使用 onload 可以顯著提升網(wǎng)絡(luò)帶寬。
? ? ? ? 可伸縮性
????????現(xiàn)代多核心系統(tǒng)能夠同時(shí)運(yùn)行許多應(yīng)用程序。然而,當(dāng)多個(gè)內(nèi)核在單個(gè)資源上競爭時(shí),這些優(yōu)勢可能會(huì)很快喪失,例如內(nèi)核網(wǎng)絡(luò)堆棧或設(shè)備驅(qū)動(dòng)程序中的鎖。這些問題在具有跨多個(gè) CPU 內(nèi)核的多個(gè)緩存和非統(tǒng)一內(nèi)存體系結(jié)構(gòu)的現(xiàn)代系統(tǒng)上更加復(fù)雜。
????????Onload 的使用使得網(wǎng)絡(luò)適配器被分成不同的分區(qū),并且每個(gè)分區(qū)都由 TCP/IP 協(xié)議棧的獨(dú)立副本訪問,從而實(shí)現(xiàn)增加 CPU 數(shù)量確實(shí)可以使吞吐量有相應(yīng)的增加。
onload 透明性?
????????Onload 在不需要重寫或重新編譯用戶應(yīng)用程序的情況下顯著提高了性能,同時(shí)保留了與標(biāo)準(zhǔn)TCP 和 UDP 協(xié)議的完全互操作性。
????????在常規(guī)內(nèi)核 TCP/IP 體系結(jié)構(gòu)中,應(yīng)用程序動(dòng)態(tài)鏈接到 libc庫。該操作系統(tǒng)庫通過一組“包裝器”函數(shù)為標(biāo)準(zhǔn)BSD套接字API提供支持,這些函數(shù)的實(shí)際處理發(fā)生在內(nèi)核級別。Onload 也支持標(biāo)準(zhǔn)的 BSD 套接字 API。然而,與內(nèi)核 TCP/IP 相比,Onload 將協(xié)議處理從內(nèi)核空間轉(zhuǎn)移到用戶級Onload 庫本身。
????????當(dāng)網(wǎng)絡(luò)應(yīng)用程序調(diào)用標(biāo)準(zhǔn)的 socket API 函數(shù)調(diào)用時(shí),例如 socket()、read()和 write()等,這些調(diào)用會(huì)被 Linux 上使用 LD_PRELOAD 機(jī)制的 Onload 庫截獲。在每次函數(shù)調(diào)用中,Onload 都會(huì)檢查文件描述符,使用 Solarflare 接口的套接字由 Onload 堆棧處理,而那些不使用 Solarflare 接口的套接字則透明地傳遞到內(nèi)核堆棧。
onload 堆棧
????????Onload 堆棧是 TCP/IP 堆棧的一個(gè)實(shí)例。堆棧包括傳輸和接收緩沖區(qū)、連接以及相關(guān)的端口號(hào)和堆棧選項(xiàng)。每個(gè)堆棧都關(guān)聯(lián)了一個(gè)或多個(gè)虛擬NIC(通常為每個(gè)使用的物理端口創(chuàng)建一個(gè) NIC)。
????????在正常使用中,每個(gè)加速進(jìn)程都有自己的 Onload 堆棧,由該進(jìn)程創(chuàng)建的所有連接共享。多個(gè)進(jìn)程也可以共享一個(gè) Onload 堆棧實(shí)例,單個(gè)應(yīng)用程序也可以具有多個(gè) Onload 棧。
虛擬網(wǎng)絡(luò)接口 VNIC
????????Solarflare 網(wǎng)絡(luò)適配器每個(gè)網(wǎng)絡(luò)端口上支持 1024 個(gè)傳輸隊(duì)列、1024 個(gè)接收隊(duì)列、1024 個(gè)事件隊(duì)列和 1024 個(gè)定時(shí)器資源。一個(gè)?VNIC(虛擬網(wǎng)絡(luò)接口)是由一組這些資源組成,允許 VNIC 客戶端,即Onload堆棧獨(dú)立、安全的發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)。通過網(wǎng)絡(luò)適配器上的 IP/MAC 過濾表和接收側(cè)調(diào)整機(jī)制(RSS)將接收到的數(shù)據(jù)包傳輸?shù)街付ǖ?VNIC。Onload 堆棧為每個(gè) Solarflare網(wǎng)絡(luò)端口分配一個(gè) VNIC,因此它在用戶模式下有一個(gè)專用的發(fā)送和接收通道。
????????重置 Solarflare 網(wǎng)絡(luò)適配器驅(qū)動(dòng)程序后,將重新安裝所有虛擬接口資源,包括 Onload 堆棧和套接字。重置操作對應(yīng)用程序是透明的,但在重置過程中流量會(huì)丟失。
功能概述
????????當(dāng)建立其第一個(gè)套接字時(shí),應(yīng)用程序被分配一個(gè) Onload 堆棧,該堆棧分配所需的 VNIC。
????????當(dāng)數(shù)據(jù)包到達(dá)時(shí),適配器中的 IP 過濾會(huì)識(shí)別套接字,并將數(shù)據(jù)寫入相應(yīng)的 Onload 堆棧中的下一個(gè)可用接收緩沖區(qū)。然后,適配器將一個(gè)事件寫入由 Onload 管理的“事件隊(duì)列”。如果應(yīng)用程序定期進(jìn)行套接字調(diào)用,則 Onload 會(huì)定期輪詢此事件隊(duì)列,然后直接處理事件而不是通過中斷來獲取這些數(shù)據(jù)。
????????用戶級處理顯著減少了內(nèi)核/用戶級上下文切換,并且只有在應(yīng)用程序阻塞時(shí)才需要中斷,因?yàn)楫?dāng)應(yīng)用程序進(jìn)行套接字調(diào)用時(shí),Onload 一直在處理接收新的網(wǎng)絡(luò)事件的事件隊(duì)列。
混合網(wǎng)絡(luò)適配器
????????服務(wù)器可以配備 Solarflare 網(wǎng)絡(luò)接口和非 Solarflare 的網(wǎng)絡(luò)接口。當(dāng)應(yīng)用程序加速時(shí),Onload讀取 Linux 內(nèi)核路由表(Onload 只考慮內(nèi)核默認(rèn)路由表),以確定需要哪個(gè)網(wǎng)絡(luò)接口來進(jìn)行連接。如果需要非 Solarflare 接口才能到達(dá)目的地,Onload 將把連接傳遞到內(nèi)核 TCP/IP 堆棧。無需額外配置即可實(shí)現(xiàn),因?yàn)?Onload 通過查找 IP 路由表自動(dòng)實(shí)現(xiàn)。
最大網(wǎng)絡(luò)接口數(shù)
????????最多可以向 Onload 驅(qū)動(dòng)程序注冊 32 個(gè)網(wǎng)絡(luò)接口。
????????默認(rèn)情況下,Onload 每個(gè)堆棧最多支持 8 個(gè)網(wǎng)絡(luò)接口。此限制可以是通過更改 src/include/CI/internal/transport_config_opt.h 頭文件 中的 CI_CFG_MAX_INTERFACES 更改,更改后需要重新編譯并安裝 Onload。
黑名單/白名單
? ? ? ? 從 Onload 201502 開始,用戶可以選擇哪些 Solarflare 接口為 Onload 使用。
????????intf_white_list Onload 模塊選項(xiàng)是一個(gè)以空格分隔的 Solarflare 列表,記錄 Onload 將用于網(wǎng)絡(luò) I/O 的網(wǎng)絡(luò)適配器接口。文章來源:http://www.zghlxwxcb.cn/news/detail-742903.html
- 白名單中標(biāo)識(shí)的接口將始終由 Onload 加速
- 未在白名單中識(shí)別的接口不會(huì)被 Onload 加速
- 空白白名單意味著所有 Solarflare 接口都將加速
????????intf_black_list Onload 模塊選項(xiàng)是一個(gè)以空格分隔的Solarflare網(wǎng)絡(luò)適配器接口列表,Onload不會(huì)將其用于網(wǎng)絡(luò) I/O。當(dāng)一個(gè)接口同時(shí)出現(xiàn)在兩個(gè)列表中時(shí),黑名單優(yōu)先。Onload 啟動(dòng)后對接口的重命名不會(huì)反映在訪問列表中,對列表的更改只會(huì)影響在這些更改后創(chuàng)建的 Onload 堆棧,而不會(huì)影響當(dāng)前正在運(yùn)行的堆棧??梢栽?/etc/modprobe.d 目錄中用戶創(chuàng)建的文件中指定 Onload 模塊選項(xiàng):文章來源地址http://www.zghlxwxcb.cn/news/detail-742903.html
options onload intf_white_list=eth4?
options onload intf_black_list="eth5 eth6
到了這里,關(guān)于【高性能網(wǎng)絡(luò)協(xié)議?!縪penonload 篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!