如何分析Linux內存性能問題

一、Linux中的buffer與cache的區別

Linux的內存管理與監控_linux服務器虛假內存和真實內存怎么區分-CSDN博客文章瀏覽閱讀66次。本文主要是關于【Linux系統的物理內存與虛擬內存講解】【重點對虛擬內存的作用與用法進行了講解說明】【最后還對如何新增擴展、優化、刪除內存交換空間swap進行了詳細的操作流程講解】_linux服務器虛假內存和真實內存怎么區分 https://coffeemilk.blog.csdn.net/article/details/149689342

Linux中buffer與cache的區別
序號buffer與cache的區別

buffer與cache都是存放在物理內存中的數據。

正常情況下至于何時回收,怎么回收buffer與cache的數據是不用我們管的,操作系統的內核會自行調度處理。

不建議自己手動回收處理

#手動將所有寫入緩沖區但沒有同步到硬盤的數據進行同步命令
sync
#手動釋放頁緩存(PageCache)命令【可釋放的內存較多;可以執行】
echo 1 > /proc/sys/vm/drop_caches#手動釋放目錄緩存和inode節點(dentriesCache and inodes)命令【可釋放的內存較少(幾十兆)】【不建議執行】
echo 2 > /proc/sys/vm/drop_caches#手動釋放頁緩存、目錄緩存和inode節點等所有緩存內容【生產環境不建議使用,可能會導致應用程序出問題】
echo 3 > /proc/sys/vm/drop_caches

1

buffer主要是針對應用程序將【數據寫入硬盤】的場景(即:由于直接將應用程序的數據直接寫入到硬盤時,硬盤的寫入速度效率太低,因此buffer又稱為硬盤的緩沖區。而將buffer緩存區的數據寫入到硬盤的操作是由操作系統的文件系統來調度完成的)【Buffer(緩沖)為了提高內存和硬盤之間的寫操作】(buffer把分散的寫操作集中進行,減少磁盤碎片和硬盤的反復尋道,從而提高系統性能。更細的說是針對內存和硬盤之間的寫操作來設計的,目的是將寫的操作集中起來進行,減少磁盤碎片和硬盤反復尋址過程,提高性能。在Linux系統內部有一個守護進程,會定期清空Buffer中的內容,將其寫入硬盤內,當手動執行sync命令時也會觸發上述操作)。

注意:buffer里面存儲的數據雖然不是很多,但是數據都很關鍵(如:Linux系統正在寫數據,但是突然斷電,等電恢復后,系統重啟時會提示你進行數據恢復【這就是由于buffer里面的數據沒有寫入到硬盤導致的】好消息是文件系統的日志記錄功能可以幫助你進行數據的恢復【前提是文件系統擁有日志記錄功能且已經開啟】)。

buffer里面一般存儲的數據都不是很大,一般都在幾十兆到幾百兆。

2

cache主要是針對【CPU讀取硬盤文件數據】的場景(即:首次將硬盤的數據讀取后緩存在內存中,下次再使用的時候就直接從cache中獲取,讀取效率就提升了,方便CPU快速處理;一般cache中緩存的是最近經常使用的數據,長時間不使用的數據就會被文件系統清除掉)【Cache(緩存)是為了調高CPU和內存之間數據交換而設計的】。

一般cache里面會存在大量的緩存數據,多達幾G到幾十G,可以清除出大量的內存。

#查看Linux系統的內存使用情況命令
free -h#查看系統實時運行情況命令
top


Linux系統必學的基礎操作命令——快速上手Linux(上)-CSDN博客https://coffeemilk.blog.csdn.net/article/details/148987685

二、Linux內存不足時系統回收內存的步驟

Linux內存不足時系統回收內存的步驟
序號內存不足時系統回收內存的步驟說明
1臟頁面(DirtyPages)寫回臟頁面是指:內存中已被修改但尚未寫入磁盤的數據
vm.dirty ratio:控制臟頁面占用系統內存的最大比例(可手動配置比例)
vm.dirty background ratio:當臟頁面達到這個比例時,系統自動觸發臟數據寫回操作(可手動配置比例)
在內存緊張時,內核會加速將臟頁面寫回磁盤以釋放內存
2頁面緩存(Page Cache)清理Page Cache會占用很大物理內存,它主要作用是加快文件讀取速度
當內存不足時,系統首先會嘗試清理不再頻繁訪問的頁面緩存,以釋放內存
內核通過LRU(Least Recently Used,最近最少使用)算法清理不常使用的緩存頁面
3使用交換分區(Swap)Page Cache釋放還是不夠時,Linux系統內核會將不常用的內存頁交換到swap分區
頻繁的swap操作會導致性能下降,尤其是在涉及大量硬盤I/O的情況下
通過vm.swappiness來控制內存交換的頻率
4

OOM Killer

(Out Of Memory Killer)

當內核無法通過上述步驟回收足夠的內存時,OOM Killer啟動
OOM Killer 會基于進程的OOM分數選擇占用內存較多的進程進行終止?
OOM Killer 通常優先殺死占用內存過多的后臺進程
注意:一旦運行到這一步OOM Killer回收內存空間則對于我們的應用程序來說就很危險了!!!很容易被OOM Killer殺掉,會導致業務中斷情況發生(且這里殺掉的應用一般是占用內存較多的應用,且不確定是哪個)

示例:如下圖Linux系統的物理內存是3.5G+內存交換空間8G=11.5G的總內存空間;假如現在有一個應用程序需要11G的內存運行空間,現在空閑的物理內存是2.7G不足11G,系統回收內存的步驟如下:

????????1、臟頁面寫回(即釋放臟頁面占用的內存,一般也不能釋放多少空間【大概幾十兆到幾百兆】)假設這里釋放了0.1G;

????????2、頁面緩存清理(按照LRU【最近最少使用算法】將不常使用的緩存頁面移動到交換分區中【即虛擬內存中】)假設這里釋放了0.5G;

????????3、目前的可用的空間=空閑的物理內存2.7G+臟頁面寫回釋放的內存0.1G+頁面緩存清理釋放的內存0.5G=3.3G,還是不夠應用程序所需的12G;此時交換分區(虛擬內存)提供了7G的內存空間,目前可用內存為=3.3G+7G=10.3G還是不足11G(這里可供使用的物理內存只占到不足一半的空間,應用程序運行響應會非常緩慢).

????????4、OOM Killer就會啟動對運行的程序進行打分,然后將打分最高的程序殺掉釋放空間比如這里釋放0.8G空間,此時可用的空間=10.3G+0.8G=11.1G滿足程序運行,程序就可以正常運行了(但是OOM Killer根據打分情況將我們正在運行的應用程序殺掉,十分危險)。

比如當我們使用自己編寫的memload程序申請16g內存啟動后,可以不斷的運行【free -h】或【free -m】命令查看內存空間的使用情況(可以看到由于我們Linux系統無法提供該程序所需的16g內存導致該程序無法成功運行被殺掉,可以使用【dmesg】命令查看被殺死程序的詳細信息日志),如下圖所示:?

????????從上面的示例我們可以看到,其實Linux系統的內核會自己調度系統的內存資源進行處理,效果也是很好的,根本不用我們自己手動釋放內存資源(特別是生產環境一般不建議自己手動釋放資源和重啟系統,這樣造成的風險會比較高)。

三、swappiness

????????swappiness值的大小對如何使用swap分區是有著很大的聯系的。swappiness=0的時候表示最大限度使用物理內存,然后才是 swap空間,swappiness=100的時候表示積極的使用swap分區,并且把內存上的數據及時的搬運到swap空間里面。linux的基本默認設置為60。

? ? ? ? 請注意:swap交換內存性能遠比不上物理內存,且過多使用swap反而會降低系統整體性能,這違背了創建swap交換內存的初衷。我們希望在物理內存即將到達滿荷時再使用交換內存swap,因此swappiness的值建議范圍在10-60的區間,而固態硬盤可以將這個值設置的偏高一些。

3.1、手動優化swap操作命令

#查看系統當前設置的swap值(值為60表示你的物理內存在使用到100-60=40%的時候,就開始使用swap交換了)
cat /proc/sys/vm/swappiness
#從操作系統層面來說,要盡可能使用物理內存(因為物理內存是比swap內存快很多的)我們這里臨時設置物理內存到70%的時候才使用swap交換
sysctl vm.swappiness=30
#設置vm.swappiness=30永久生效,則需要修改/etc/sysctl.conf配置文件在這個配置文件末尾添加上【vm.swappiness = 30】系統重啟后生效
vi /etc/sysctl.conf

3.2、手動刪除swap文件命令

#1-先停用內存交換空間文件
swapoff /data/swapfile1
#2-再直接移除這個內存空間交換文件
rm -rf /data/swapfile1
#3-注釋或直接刪除掉之前在/etc/fstab文件里追加的開機自動掛載配置內容
#/data/swapfile1 swap swap defaults 0 0

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

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

相關文章

二次型 線性代數

知識結構總覽首先是我們的二次型的定義,就是說什么樣的才算是一個二次型。然后就是如何把二次型化為標準型,最后就是正定二次型的定義和判斷的一些條件。二次型的定義二次型其實是一種函數表達的方式,如上,含義其實就是每個項都是…

云原生三劍客:Kubernetes + Docker + Spring Cloud 實戰指南與深度整合

在當今微服務架構主導的時代,容器化、編排與服務治理已成為構建彈性、可擴展應用的核心支柱。本文將深入探討如何將 Docker(容器化基石)、Kubernetes(編排引擎)與 Spring Cloud(微服務框架) 無縫…

vue讓elementUI和elementPlus標簽內屬性支持rem單位

vue讓elementUI和elementPlus標簽內屬性支持rem單位 如 Element Plus 的 el-table 默認不直接支持使用 rem 作為列寬單位 解決方法: 將 rem 轉換為像素值(基于根元素字體大小) // 計算rem對應的像素值 const calcRem (remValue) > {// 獲取根元素(ht…

基于OAuth2與JWT的微服務API安全實戰經驗分享

引言 在微服務架構中,API 安全成為了保護服務免受未授權訪問和攻擊的關鍵要素。本文結合真實生產環境案例,以實戰經驗為出發點,分享基于 OAuth2 JWT 的微服務 API 安全方案,從業務場景、技術選型、實現細節、踩坑及解決方案&…

scrapy庫進階一

scrapy 庫復習 scrapy的概念:Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架 scrapy框架的運行流程以及數據傳遞過程: 爬蟲中起始的url構造成request對象–>爬蟲中間件–>引擎–>調度器調度器把request–>引擎…

Objective-C實現iOS平臺微信步數修改指南

本文還有配套的精品資源,點擊獲取 簡介:本文介紹如何在iOS平臺上使用Objective-C語言,通過蘋果的HealthKit框架讀取和修改微信步數以及相關健康數據。首先介紹如何引入和使用HealthKit框架,包括請求權限、讀取步數數據、寫入步…

【ElementPlus】深入探索ElementPlus:前端界面的全能組件庫

📚 引言在現代 Web 開發中,創建既美觀又功能強大的用戶界面是一項挑戰。Element Plus,作為 Vue 3 生態中的明星 UI 組件庫,以其豐富的組件、優秀的性能和易用性贏得了廣大開發者的青睞。本文將全面覆蓋 Element Plus 的 常用核心組…

Json Jsoncpp

文章目錄Json 介紹Jsoncpp 介紹Json::Value序列化接口反序列化接口序列化操作反序列化操作Json 介紹 JSON(JavaScript Object Notation,JavaScript 對象表示法)是一種輕量級的數據交換格式,具有簡潔、易讀、跨平臺等特點&#xff…

openwrt下安裝istore(基于pve)

openwrt下安裝istore(基于pve)ssh連接到openwrt,用如下命令安裝istore:opkg update || exit 1cd /tmpwget https://github.com/linkease/openwrt-app-actions/raw/main/applications/luci-app-systools/root/usr/share/systools/i…

2025年Python Web框架之爭:Django、Flask還是FastAPI,誰將主宰未來?

文章概要 作為一名Python開發者,我經常被問到同一個問題:在2025年,Django、Flask和FastAPI哪個框架更值得使用?隨著技術的快速發展,這個問題的答案也在不斷變化。本文將全面比較這三個主流Python Web框架的特點、性能、…

高級11-Java日志管理:使用Log4j與SLF4J

在現代Java應用開發中,日志(Logging)是系統監控、調試、故障排查和性能分析的核心工具。一個高效、靈活、可配置的日志系統,不僅能幫助開發者快速定位問題,還能為運維團隊提供寶貴的運行時信息。在Java生態系統中&…

sc-atac的基礎知識(0)

sc-atac的基礎知識 **fragment**是ATAC-seq實驗中的一個重要概念,它指的是通過Tn5轉座酶對DNA分子進行酶切,然后經由雙端測序得到的序列。根據Tn5插入導致的偏移從read比對得到的位置推斷出fragment的起始和結束位置。根據之前的報道,Tn5轉座…

Python從入門到精通計劃Day01: Python開發環境搭建指南:從零開始打造你的“數字廚房“

目錄一、配置你的「魔杖」:Python 3.x安裝1.1 跨平臺安裝指南1.2 驗證你的「法力值」二、選擇你的「魔法工坊」:IDE配置2.1 VS Code:輕量級實驗室2.2 PyCharm:專業級法師塔三、施展第一個「魔咒」:Hello World3.1 基礎…

MCP Agent 工程框架Dify初探

目錄引言一、Dify是什么二、為什么使用Dify三、使用Dify要怎么做1、聊天助手2、Agent2.1 Function calling(函數調用)和 ReAct 兩種推理模式的區別2.1.1 技術本質與工作流程對比2.1.2 優缺點對比2.1.3 適用場景與選擇依據2.2 LangChain 的 Agent 實現原理…

無人機光伏巡檢漏檢率↓78%!陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析,核心技術參數與架構設計引用自《陌訊技術白皮書》,轉載請注明來源。一、行業痛點:無人機光伏巡檢的 "識別困境"光伏電站的大規模鋪設推動了無人機巡檢的普及,但實際作業中仍面臨三大技術瓶頸…

機動車占道識別準確率提升 29%:陌訊動態輪廓感知算法實戰解析

原創聲明本文為原創技術解析,核心技術參數與架構設計引用自《陌訊技術白皮書》,禁止未經授權的轉載與改編。一、行業痛點:機動車占道治理的技術瓶頸城市交通監控中,機動車占用應急車道、公交車道等違規行為已成為影響通行效率與交…

UNet改進(29):記憶增強注意力機制在UNet中的創新應用-原理、實現與性能提升

記憶增強注意力機制概述 記憶增強注意力是一種結合了外部記憶模塊的注意力機制,它使神經網絡能夠存儲和檢索長期知識,而不僅僅是依賴當前的輸入特征。這種機制特別適合需要保持長期依賴關系的任務,如醫學圖像分割,其中模型需要記住不同樣本中出現的常見模式。 核心組件 記…

使用Python開發Ditto剪貼板數據導出工具

前言在日常工作中,我們經常需要處理大量的剪貼板數據。Ditto作為一款優秀的剪貼板管理軟件,幫助我們保存了豐富的歷史記錄。但有時我們需要將這些數據導出進行進一步分析或備份,而Ditto本身并沒有提供直觀的批量導出功能。C:\pythoncode\new\…

【人工智能】提示詞設計原則:簡潔性、明確性、具體性如何平衡?

提示詞設計原則:簡潔性、明確性、具體性如何平衡?1. 提示詞設計三大原則的核心內涵1.1 簡潔性1.1.1 定義用最少的文字傳遞核心信息,避免冗余和不必要的描述。比如 “寫 3 個春天的成語” 比 “我想讓你寫出來 3 個和春天有關系的成語詞語” 更…

JS的作用域

文章目錄一、為什么需要作用域?二、什么是 JS 作用域?2.1 什么是詞法作用域和動態作用域?1. 詞法作用域(Lexical Scpoe)2. 動態作用域2.2 JS 的作用域2.3 JS 作用域的分類1. 全局作用域2. 模塊作用域3. 函數作用域4. 塊…