系統性能優化-4 磁盤

系統性能優化-4 磁盤

磁盤作為計算機中速度最慢的硬件之一,常常是系統的性能瓶頸,優化磁盤一般能得到明顯的提升~

文章以如何高效的傳輸文件來討論針對磁盤的優化技術,如零拷貝、直接 IO、異步 IO等。

最簡單的網絡傳輸

最簡單的方式的當然是找到文件存儲的路徑,創建一個固定的大小的緩沖區,每次讀取緩沖區大小的文件內容,再通過網絡 API 發送給客戶端,重復上述流程直到把文件發送完成。

順便一提,緩沖區的設置還是有必要的,java 有單字節的讀取寫入方式(FileInputStream.read()),這樣會很慢,緩沖區可以有效的提升讀取文件的性能。

但是這樣的性能依舊不是很高,原因是這需要進行多次的內容拷貝,會導致大量的上下文切換

image-20250624112007687

  • 每次讀取發送都經歷了 4 次用戶態與內核態的上下文切換
  • 每次發送的緩存區內容被拷貝了 4 次

接下來就從減少上下文切換次數減少內存拷貝次數來進行優化

零拷貝

讀取磁盤或者操作網卡都由操作系統內核完成。內核負責管理系統上的所有進程,它的權限最高,工作環境與用戶進程完全不同。只要我們的代碼執行 read 或者 write 這樣的系統調用,一定會發生 2 次上下文切換:首先從用戶態切換到內核態,當內核執行完任務后,再切換回用戶態交由進程代碼執行。

因此如果要減少上下文切換次數,就要減少系統調用次數。解決方案就是把 read 和 write 系統調用合二為一,直接在內核中完成文件的讀取和發送,可以把原本的 4 次上下文切換減少為 2 次。

那如何減少內存拷貝次數呢?對于常見的文件下載場景,我們并不需要進程對文件進行處理,如添加公司信息等,那么用戶緩沖區就沒有存在的必要,直接由 PageCache 拷貝到 Socket 緩沖區就可以,這可以把原本的 4 次內容拷貝縮短為 3 次,

image-20250624112749023

如果 網卡支持 DMA SG-DMA(The Scatter-Gather Direct Memory Access),那么 PageCache 可以直接拷貝到網卡,可以再減少一次內存拷貝。

image-20250624113104692

其實這就是零拷貝技術,它是操作系統提供的新函數,同時接收文件描述符和 TCP socket 作為輸入參數,這樣執行時就可以完全在內核態完成內存拷貝,既減少了內存拷貝次數,也降低了上下文切換次數。

零拷貝使用戶無需關心 socket 緩沖區的大小(因為 socket 緩沖區是動態變化的,它既用于 TCP 滑動窗口,也用于應用緩沖區,還受到整個系統內存的影響)。綜合種種優點,零拷貝可以極大的提升文件傳輸性能。

PageCache 磁盤高速緩存

正常讀取文件時,是先把磁盤文件拷貝到 PageCache 上,再拷貝到進程中。原因是磁盤的讀取速度是最慢的,而在內存中的 PageCache 速度就會快很多,那選擇哪些數據復制到內存呢?根據時間局部性原理(剛被訪問的數據在短時間內再次被訪問的概率很高),用 PageCache 緩存最近訪問的數據,當空間不足時淘汰最久未被訪問的緩存(即 LRU 算法)。讀磁盤時優先到 PageCache 中找一找,如果數據存在便直接返回,這便大大提升了讀磁盤的性能。

對于機械硬盤來說,需要旋轉磁頭到數據所在的扇區,再開始順序讀取數據。其中,旋轉磁頭耗時很長,為了降低它的影響,PageCache 使用了預讀功能。也就是即使你可能目前只讀 32KB 數據,但內核會把后續的部分數據也讀取到 PageCache,因為這個讀取成本很低,而如果后續一段時間訪問到了這些數據,帶來的收益是很值得的。

PageCache 在 90% 以上場景下都會提升磁盤性能,但在某些情況下,PageCache 會不起作用,甚至由于多做了一次內存拷貝,造成性能的降低。

先說結論:在讀取大文件時,不應使用 PageCache,進而也不應使用零拷貝技術處理。

當用戶訪問大文件時,內核就會把它們載入到 PageCache 中,這些大文件很快會把有限的 PageCache 占滿。一方面這些大文件被再次訪問的概率其實很低,耗費 CPU 多拷貝到 PageCache 一次;另一方面大文件占用 PageCache 會導致熱點小文件無法被加載到 PageCache 中,讀取的速度變慢。

  • 比如視頻文件通常按時間順序播放,播放器只會按需加載一定長度的視頻數據。雖然文件本身很大,但只有少部分數據會在某一時間點內被訪問到,其余的數據部分在播放過程中可能根本不會被訪問到。
  • 某些大數據庫文件也是按順序或按塊讀取的,而數據庫的查詢操作通常集中在特定區域或范圍內。大文件的其他部分可能在較長時間內不會被訪問,導致它們在 PageCache 中的緩存效果差。

那么高并發場景下該怎么處理大文件呢?

異步 IO + 直接 IO

高并發場景處理大文件時,應當使用異步 IO 和直接 IO 來替換零拷貝技術。

當調用 read 方法讀取文件時,實際上 read 方法會在磁盤尋址過程中阻塞等待,導致進程無法并發地處理其他任務,如下圖所示:

image-20250624132341046

異步 IO(異步 IO 既可以處理網絡 IO,也可以處理磁盤 IO,這里我們只關注磁盤 IO)把讀操作分為兩部分,前半部分向內核發起讀請求,但不等待數據就位就立刻返回,此時進程可以并發地處理其他任務。當內核將磁盤中的數據拷貝到進程緩沖區后,進程將接收到內核的通知,再去處理數據,這是異步 IO 的后半部分。如下圖所示:

image-20250624132423219

異步 IO 并沒有把數據拷貝到 PageCache 中,這其實是異步 IO 實現上的缺陷。經過 PageCache 的 IO 我們稱為緩存 IO,它與虛擬內存系統耦合太緊,導致異步 IO 從誕生起到現在都不支持緩存 IO。繞過 PageCache 的 IO 是個新物種,我們把它稱為直接 IO。對于磁盤,異步 IO 只支持直接 IO。

直接 IO 的應用場景為:

  • 應用程序已經實現了磁盤文件的緩存,不需要 PageCache 再次緩存,引發額外的性能消耗。比如 MySQL 等數據庫就使用直接 IO
  • 高并發下傳輸大文件

缺點為無法享受 PageCache 造成的性能提升(內核會緩存盡量多的連續IO在 PageCache 中,合并為一個更大的 IO 發給磁盤,減少磁盤的尋址操作;內核也會預讀后續的 IO 放在 PageCache 中,減少磁盤操作)

總結

零拷貝技術基于 PageCache(緩存最近讀的數據),合并讀取和發送的系統調用,能夠有效減少傳輸文件過程中的上下文切換次數和內存拷貝次數,同時最大程度利用 socket 緩沖區。但缺點是用戶進程無法對文件做任何修改,比如壓縮后再發送。當文件大小超過某個閾值后,PageCache 還可能引發副作用,因此,實踐中通常會設定一個文件大小閾值,針對大文件使用異步 IO 和直接 IO,而對小文件使用零拷貝( 例如 Nginx 的 directio 指令)。

文件傳輸場景中的優化可以大概分為三個方向:

  • 減少磁盤工作量(PageCache)
  • 減少 CPU 工作量 (直接 IO)
  • 提高內存利用率(零拷貝)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/911767.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/911767.shtml
英文地址,請注明出處:http://en.pswp.cn/news/911767.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows注冊HTTP服務實現Jenkins Allure報告、測試日志永久訪問

使用 NSSM (Non-Sucking Service Manager) 將 Allure 報告的 HTTP 服務注冊為 Windows 后臺服務的詳細操作攻略,確保 Jenkins 測試結果可以長期通過 URL 訪問。 ? 目標 將 allure generate 生成的報告目錄托管為靜態網頁服務,并作為后臺服務運行&#…

從ADI與AMD的專利訴訟,看高端FPGA的巔峰對決

RFSoC,作為FPGA家族中的“貴族”,高端芯片中的尖端代表,技術積累要求高、利潤厚,售價貴,主要面向不差錢的軍用雷達處理、通信和測試/測量儀器用戶。 2019年,模擬芯片龍頭ADI公司,發起專利侵權訴訟,而嘗到甜頭的賽靈思,一邊反訴,一邊揶揄ADI公司:愛哭的娃未必有奶吃…

性能測試-jmeter實戰3

課程:B站大學 記錄軟件測試-性能測試學習歷程、掌握前端性能測試、后端性能測試、服務端性能測試的你才是一個專業的軟件測試工程師 性能測試-jmeter實戰3 負載測試穩定性測試負載測試曲線圖其他測試策略并發測試壓力測試容量測試 性能指標的介紹響應時間并發用戶數…

Maven鏡像

在 Maven 中配置多個鏡像源,主要是為了解決依賴包在不同地區下載速度不同的問題,或者為了使用特定的私有倉庫作為依賴源。Maven 支持在 pom.xml 文件中配置多個鏡像源(repositories),也可以在 Maven 的全局配置文件 se…

ArduPilot 教程(2):運行第一個 SITL 無人機仿真

目錄 1. MAVLink 通信協議 2. MAVProxy 地面控制站 3. 運行 SITL 無人機仿真 3.1. 使用 MAVProxy 控制無人機 3.2. 使用 SITL 地圖界面控制無人機 4. MAVProxy 常用命令 5. 其它地面控制站 5.1. QGroundControl 5.2. MissionPlanner 5.3. 不啟用 MAVProxy 6. 本講小…

開源AI大模型驅動下視頻媒介對圖文生態的重構與S2B2C商業場景創新——基于AI智能名片與商城小程序源碼的實踐分析

摘要:數字媒介演進的進程中,視頻對圖片及文字的媒介侵蝕效應正呈現加速態勢,尤其在Z世代及新網民群體中,視頻已成為其觸網的首要信息載體。本文基于媒介技術迭代與商業場景融合的雙重視角,探究開源AI大模型如何通過智能…

Kafka線上集群部署方案:從環境選型到資源規劃思考

在分布式消息系統的落地應用中,Kafka集群的線上部署方案直接關系到業務系統的穩定性與性能表現。不同于測試環境的簡易搭建,生產級集群需要從操作系統適配、存儲介質選型、容量規劃到網絡資源調度等多維度進行系統性設計。本文將從工程實踐角度&#xff…

算法第40天|買賣股票的最佳時機 1 2 3

121. 買賣股票的最佳時機 題目 思路與解法 記錄每一天買或不買時的價值 class Solution { public:int maxProfit(vector<int>& prices) {// dp數組含義&#xff1a;// dp[i][0]:第i天&#xff0c;持有股票時的最大價值&#xff0c;dp[i][1]:第i天&#xff0c;不持…

【趙渝強老師】使用select...into outfile語句備份MySQL

MySQL可以使用select…into outfile語句將表的內容導出為一個文本文件。其基本的語法格式如下&#xff1a; select [列名] from 表名 [WHERE 語句] into outfile 目標文件 [其他選項];該語句分為兩個部分。前半部分是一個普通的select語句&#xff0c;通過這個select語句來查詢…

PHY XGE 自協商AN數據交互過程

在裸機環境下&#xff0c;兩個 **支持 10GBASE-T** 的 PHY 芯片通過 Clause 73 協議完成自協商&#xff08;Auto-Negotiation&#xff0c;AN&#xff09;&#xff0c;它們在 **無操作系統控制** 的條件下&#xff0c;完成以下 **完整的點對點數據交互流程**&#xff1a; --- ##…

【算法 day09】LeetCode 232.用棧實現隊列 | 225. 用隊列實現棧 | 20. 有效的括號 |1047. 刪除字符串中的所有相鄰重復項

232.用棧實現隊列 題目鏈接 | 文檔講解 |視頻講解 : 鏈接 1.思路&#xff1a; 使用2個棧去實現隊列 先將元素放入棧1中&#xff0c;然后在將棧1中的元素出棧到棧2中&#xff0c;棧2的元素出棧順序就和隊列的出隊一樣 2.代碼&#xff1a; class MyQueue {Stack<Integer…

大模型項目實戰:業務場景和解決方案

你的這張圖已經涵蓋了很多主流的大模型實戰項目&#xff0c;非常全面&#xff01;下面我會補充更多市面上常見的AI大模型實戰項目&#xff0c;并且簡要說明每個項目的核心內容、實現思路和主流技術棧&#xff0c;方便你參考和擴展。 1. 智能問答/知識庫系統 核心內容&#xff…

vscode + Jlink 一鍵調試stm32 單片機程序(windows系統版)

vscode Jlink 一鍵調試stm32 單片機程序 安裝交叉編譯工具鏈安裝 x-pack 構建工具安裝 JLink 工具gnu-debuger 插件編譯一鍵啟動調試 安裝交叉編譯工具鏈 stm32采用 交叉編譯工具鏈 arm-none-eabi-xxx, 下載之后解壓&#xff0c;壓縮包內部結構如下圖&#xff1a; 目錄下的bi…

Linux線程概念和控制

Linux線程概念 Linux中線程如何理解 線程<執行流<進程 Linux中的線程模擬進程實現&#xff08;線程就是輕量級進程&#xff09; 與獨立的進程相比&#xff0c;線程創建和銷毀的開銷較小&#xff0c;因為它們共享相同的內存空間和資源。 線程是進程內的執行分支&…

服務器出現問題,連接服務器出現3680 并刪除數據庫出現1192,請查看詳細問題(運維)

mysql連接服務器時&#xff0c;出現這個問題&#xff1a;3680 - Failed to create schema directory xxxx (errno: 28 - No space left on device) 第一步&#xff1a;診斷問題類型 檢查磁盤空間 運行以下命令&#xff1a; bash df -h # 查看磁盤使用情況 如果輸出中 Use% 接…

uniapp:微信小程序膠囊「復制鏈接」灰色處理

在原生開發的小程序中默認是支持復制的 &#x1f424; 但是在 uniapp 開發的小程序中無法復制&#xff08;體驗版與開發版都可以進行復制&#xff0c;但發布后不可&#xff09; 解決方法&#xff1a; methods: {onShareAppMessage: function() {// return custom share data …

差分數組c++

溫度波動記錄 每天記錄溫度&#xff0c;支持區間溫度調整和單日查詢 輸入&#xff1a; 第一行&#xff1a;一個整數n表示有n個溫度 第二行&#xff1a;n個數表示具體溫度 第三行&#xff1a;三個整數&#xff1a;S&#xff0c;e&#xff0c;c&#xff0c;表示從…

Vue.js 列表過濾實現詳解(watch和computed實現)

Vue.js 列表過濾實現詳解 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthd…

性能測試-jmeter實戰4

課程&#xff1a;B站大學 記錄軟件測試-性能測試學習歷程、掌握前端性能測試、后端性能測試、服務端性能測試的你才是一個專業的軟件測試工程師 性能測試-jmeter實戰4 jmeter環境搭建1. 安裝Java環境&#xff08;必需&#xff09; JMeter環境搭建完整指南1. 安裝Java&#xff0…

GPPT(Graph Pre-training and Prompt Tuning)項目復現

GPPT(Graph Pre-training and Prompt Tuning)項目復現 項目概述 GPPT是一種創新的圖神經網絡預訓練與提示調整框架,由MingChen-Sun等人提出。該項目通過將自然語言處理中的提示學習概念引入圖領域,解決了圖預訓練模型在下游任務中的適應性問題。 環境配置 # 創建Python…