在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

linux內存性能優化介紹

科技綠洲 ? 來源:Linux開發架構之路 ? 作者:Linux開發架構之路 ? 2023-11-10 15:23 ? 次閱讀

【1】內存映射

Linux 內核給每個進程都提供了一個獨立且連續的虛擬地址空間,以便進程可以方便地訪問虛擬內存;虛擬地址空間的內部又被分為內核空間和用戶空間兩部分,不同字長的處理器,地址空間的范圍也不同;圖示為 32 位和 64 位系統的虛擬地址空間;

圖片

內存映射是將虛擬內存地址映射到物理內存地址,內核為每個進程都維護了一張頁表,記錄虛擬地址與物理地址的映射關系;

圖片

頁表存儲在 CPU 的內存管理單元 MMU 中,正常情況下,處理器就可以直接通過硬件,找出要訪問的內存;當進程訪問的虛擬地址在頁表中不存在時,系統會產生一個缺頁異常,進入內核空間分配物理內存、更新進程頁表,最后再返回用戶空間,恢復進程的運行;

TLB (Translation Lookaside Buffer,轉譯后備緩沖器) 是 MMU 中頁表的高速緩存,由于進程的虛擬地址空間是獨立的,而 TLB 的訪問速度又比 MMU 快得多,因此通過減少進程的上下文切換,減少 TLB 的刷新次數,可以提高 TLB 緩存的使用率,進而提高 CPU 的內存訪問性能;

MMU 規定了內存映射的最小單位,即頁,通常是 4 KB 大小,每一次內存映射,都需要關聯 4KB 或者 4KB 整數倍的內存空間;

多級頁表就是把內存分成區塊來管理,將原來的映射關系改成區塊索引和區塊內的偏移;由于虛擬內存空間通常只用了很少一部分,多級頁表就只保存這些使用中的區塊,從而大大地減少頁表的項數,Linux 四級頁表管理內存頁圖示

圖片

大頁,即比普通頁更大的內存塊,常見的大小有 2MB 和 1GB;

【2】虛擬內存空間分布

32 位系統中用戶空間的分段示意圖

圖片

    1. 只讀段,包括代碼和常量等
    1. 數據段,包括全局變量等
    1. 堆,包括動態分配的內存,從低地址開始向上增長
    1. 文件映射段,包括動態庫、共享內存等,從高地址開始向下增長
    1. 棧,包括局部變量和函數調用的上下文等,棧的大小是固定的,一般是 8 MB

【3】內存的分配與回收

內存分配

小塊內存 (小于 128K),使用 brk() 來分配,即通過移動堆頂的位置來分配內存,這些內存釋放后并不會立刻歸還系統,而是被緩存起來,以便重復使用;

  • brk() 方式分配內存,可以減少缺頁異常的發生,提高內存訪問效率;由于這些內存沒有歸還系統,在內存工作繁忙時,頻繁的內存分配和釋放會造成內存碎片;

大塊內存 (大于 128K),使用內存映射 mmap() 來分配,即在文件映射段找一塊空閑內存分配出去

  • mmap() 方式分配內存,會在釋放時直接歸還系統,因此 mmap 會發生缺頁異常;在內存工作繁忙時,頻繁的內存分配會導致大量的缺頁異常,使內核的管理負擔增大;

內存回收

回收緩存,如使用 LRU (Least Recently Used) 算法,回收最近使用最少的內存頁面;

回收不常訪問的內存,把不常用的內存通過交換分區直接寫到磁盤中;

  • 交換分區 (Swap) 即把一塊磁盤空間當成內存來用;把進程暫時不用的數據存儲到磁盤中(換出),當進程訪問這些內存時,再從磁盤讀取這些數據到內存中 (換入)

殺死進程,內存緊張時系統還會通過 OOM (Out of Memory),直接殺掉占用大量內存的進程;

內核的一種保護機制,監控進程的內存使用情況,并且使用 oom_score 為每個進程的內存使用情況進行評分;

  • 一個進程消耗的內存越大,oom_score 就越大;
  • 一個進程運行占用的 CPU 越多,oom_score 就越小;
  • 管理員可以通過 /proc 文件系統,手動設置進程的 oom_adj,從而調整進程的 oom_score;

oom_adj 的范圍是 [-17, 15],數值越大,表示進程越容易被 OOM 殺死;數值越小,表示進程越不容易被 OOM 殺死,其中 -17 表示禁止 OOM;

【4】buffer/cache

Buffer 是內核緩沖區用到的內存,對應的是 /proc/meminfo 中的 Buffers 值;

Cache 是內核頁緩存和 Slab 用到的內存,對應的是 /proc/meminfo 中的 Cached 與 SReclaimable 之和;

  • Buffers 是對原始磁盤塊的臨時存儲,即用來緩存磁盤的數據,通常不會特別大 (20MB 左右);從而內核可以把分散的寫集中起來,統一優化磁盤的寫入,比如可以把多次小的寫合并成單次大的寫等等;

Buffer 既可以用作 “將要寫入磁盤數據的緩存”,也可以用作 “從磁盤讀取數據的緩存”

  • Cached 是從磁盤讀取文件的頁緩存,即用來緩存從文件讀取的數據;從而,下次訪問這些文件數據時,就可以直接從內存中快速獲取,而不需要再次訪問緩慢的磁盤;

實際上,Cache 也會緩存寫文件時的數據

Cache 既可以用作 “從文件讀取數據的頁緩存”,也可以用作 “寫文件的頁緩存”

  • SReclaimable 是 Slab 的一部分,Slab 包括兩部分,其中的可回收部分,用 SReclaimable 記錄;而不可回收部分,用 SUnreclaim 記錄;

【5】內存泄漏

棧內存由系統自動分配和管理,一旦程序運行超出了這個局部變量的作用域,棧內存就會被系統自動回收,不會產生內存泄漏的問題;

堆內存由應用程序分配和管理,除非程序退出,這些堆內存并不會被系統自動釋放,而是需要應用程序明確調用庫函數 free() 釋放,如果應用程序沒有正確釋放堆內存,就會造成內存泄漏;

只讀段,包括程序的代碼和常量,由于是只讀的,不會再去分配新的內存,不會產生內存泄漏;

數據段,包括全局變量和靜態變量,這些變量在定義時就已經確定了大小,不會產生內存泄漏;

內存映射段,包括動態鏈接庫和共享內存,其中共享內存由程序動態分配和管理,若程序在分配后忘了回收,就會導致泄漏問題;

【6】Swap 知識點

Swap 即把一塊磁盤空間或者一個本地文件當成內存來使用,包括換出和換入兩個過程;

  • 換出,即把進程暫時不用的內存數據存儲到磁盤中,并釋放這些數據占用的內存;
  • 換入,即在進程再次訪問這些內存的時候,把它們從磁盤讀到內存中來;

NUMA 與 Swap

NUMA (Non-Uniform Memory Access) 架構,在 NUMA 架構下,多個處理器被劃分到不同 Node 上,且每個 Node 都擁有自己的本地內存空間,而同一個 Node 內部的內存空間,又可以進一步分為不同的內存域(Zone);

某個 Node 內存不足時,系統可以從其他 Node 尋找空閑內存,也可以從本地內存中回收內存;可以通過
/proc/sys/vm/zone_reclaim_mode 來選擇模式,支持以下幾個選項;

  • 默認的 0,表示既可以從其他 Node 尋找空閑內存,也可以從本地回收內存;
  • 1、2、4 都表示只回收本地內存,2 表示可以回寫臟數據回收內存,4 表示可以用 Swap 方式回收內存;

swappiness

  • 對文件頁的回收,即直接回收緩存,或者把臟頁寫回磁盤后再回收;
  • 對匿名頁的回收,即通過 Swap 機制,把它們寫入磁盤后再釋放內存;

Linux 提供了 /proc/sys/vm/swappiness 選項,用來調整使用 Swap 的積極程度,swappiness 的范圍是 0-100,數值越大,越積極使用 Swap,即更傾向于回收匿名頁;數值越小,越消極使用 Swap,即更傾向于回收文件頁;

降低 Swap 的使用,可以提高系統的整體性能

  1. 禁止 Swap,現在服務器的內存足夠大,所以除非有必要,禁用 Swap 即可,隨著云計算的普及,大部分云平臺中的虛擬機都默認禁止 Swap;
  2. 若實在需要用到 Swap,可以嘗試降低 swappiness 的值,減少內存回收時 Swap 的使用傾向;
  3. 響應延遲敏感的應用,如果它們可能在開啟 Swap 的服務器中運行,你還可以用庫函數 mlock() 或者 mlockall() 鎖定內存,阻止它們的內存換出;

【7】Linux 回收內存的時機

在內存資源緊張時,Linux 通過直接內存回收和定期掃描的方式,釋放文件頁和匿名頁,以便把內存分配給更需要的進程使用;

直接內存回收,存在新的大塊內存分配請求,但是剩余內存不足,此時系統就需要回收一部分內存,進而盡可能地滿足新內存請求;

kswapd0 內核線程,用于定期回收內存,kswapd0 定義了三個內存閾值,分別是頁最小閾值 (pages_min)、頁低閾值(pages_low) 和頁高閾值(pages_high);pages_free 表示剩余內存;

圖片

  • 剩余內存小于頁最小閾值,說明進程可用內存都耗盡了,只有內核才可以分配內存;
  • 剩余內存落在頁最小閾值和頁低閾值中間,說明內存壓力比較大,剩余內存不多了;這時 kswapd0 會執行內存回收,直到剩余內存大于高閾值為止;
  • 剩余內存落在頁低閾值和頁高閾值中間,說明內存有一定壓力,但還可以滿足新內存請求;
  • 剩余內存大于頁高閾值,說明剩余內存比較多,沒有內存壓力;

頁低閾值可以通過內核選項
/proc/sys/vm/min_free_kbytes 來間接設置,min_free_kbytes 設置了頁最小閾值,而其他兩個閾值,都是根據頁最小閾值計算生成,如下

pages_low  = pages_min * 5 / 4
pages_high = pages_min * 3 / 2

性能指標與工具總結

圖片

圖片

實戰記錄

【1】free 命令

圖片

  • total 總內存大小;
  • used 已使用內存的大小,包含了共享內存;
  • free 未使用內存的大小;
  • shared 共享內存的大小;
  • buff/cache 緩存和緩沖區的大小;
  • available 新進程可用內存的大小;

【2】top 命令

圖片

VIRT 是進程虛擬內存的大小,只要是進程申請過的內存,即便還沒有真正分配物理內存,也會計算在內;

RES 是常駐內存的大小,即進程實際使用的物理內存大小,但不包括 Swap 和共享內存;

SHR 是共享內存的大小,比如與其他進程共同使用的共享內存、加載的動態鏈接庫以及程序的代碼段等;

%MEM 是進程使用物理內存占系統總內存的百分比;

注意

    1. 虛擬內存通常并不會全部分配物理內存;
    1. 共享內存 SHR 并不一定是共享的,如程序的代碼段、非共享的動態鏈接庫,也都算在 SHR 里;

【3】磁盤和文件寫案例

【3.1】案例一,寫文件

測試命令
$ dd if=/dev/urandom of=/tmp/file bs=1M count=500

監控命令
vmstat 2

圖片

    1. 在 Cache 剛開始增長時,塊設備 I/O 很少,而過一段時間后,才會出現大量的塊設備寫;
    1. 當 dd 命令結束后,Cache 不再增長,但塊設備寫還會持續一段時間,并且多次 I/O 寫的結果加起來是 dd 要寫的 500M 的數據;

【3.2】案例二,寫磁盤

測試命令
# 運行dd命令向磁盤分區/dev/sdb1寫入2G數據
$ dd if=/dev/urandom of=/dev/sdb1 bs=1M count=2048

監控命令
vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0      0 7584780 153592  97436    0    0   684     0   31  423  1 48 50  2  0
 1  0      0 7418580 315384 101668    0    0     0     0   32  144  0 50 50  0  0
 1  0      0 7253664 475844 106208    0    0     0     0   20  137  0 50 50  0  0
 1  0      0 7093352 631800 110520    0    0     0     0   23  223  0 50 50  0  0
 1  1      0 6930056 790520 114980    0    0     0 12804   23  168  0 50 42  9  0
 1  0      0 6757204 949240 119396    0    0     0 183804   24  191  0 53 26 21  0
 1  1      0 6591516 1107960 123840    0    0     0 77316   22  232  0 52 16 33  0
    1. 寫磁盤時 (即 bo 大于 0 時),Buffer 和 Cache 都在增長,但顯然 Buffer 的增長快得多;

【4】磁盤和文件讀案例

【4.1】案例一、讀文件

測試命令
# 運行dd命令讀取文件數據
$ dd if=/tmp/file of=/dev/null

監控命令
vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  1      0 7724164   2380 110844    0    0 16576     0   62  360  2  2 76 21  0
 0  1      0 7691544   2380 143472    0    0 32640     0   46  439  1  3 50 46  0
 0  1      0 7658736   2380 176204    0    0 32640     0   54  407  1  4 50 46  0
 0  1      0 7626052   2380 208908    0    0 32640    40   44  422  2  2 50 46  0
  • 讀取文件時 (即 bi 大于 0 時),Buffer 保持不變,而 Cache 則在不停增長;

【4.2】案例二、讀磁盤

測試命令
# 運行dd命令讀取文件
$ dd if=/dev/sda1 of=/dev/null bs=1M count=1024

監控命令
vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 7225880   2716 608184    0    0     0     0   48  159  0  0 100  0  0
 0  1      0 7199420  28644 608228    0    0 25928     0   60  252  0  1 65 35  0
 0  1      0 7167092  60900 608312    0    0 32256     0   54  269  0  1 50 49  0
 0  1      0 7134416  93572 608376    0    0 32672     0   53  253  0  0 51 49  0
 0  1      0 7101484 126320 608480    0    0 32748     0   80  414  0  1 50 49  0
  • 讀磁盤時 (也就是 bi 大于 0 時),Buffer 和 Cache 都在增長,但顯然 Buffer 的增長快很多;

附錄

【1】文件系統與磁盤的區別

磁盤是一個存儲設備(塊設備),可以被劃分為不同的磁盤分區,而在磁盤或者磁盤分區上,還可以再創建文件系統,并掛載到系統的某個目錄中,這樣,系統就可以通過這個掛載目錄,來讀寫文件;即磁盤是存儲數據的塊設備,也是文件系統的載體;文件系統需要通過磁盤,來保證數據的持久化存儲;

在讀寫普通文件時,I/O 請求會首先經過文件系統,然后由文件系統負責,來與磁盤進行交互;在讀寫塊設備文件時,會跳過文件系統,直接與磁盤交互,也就是所謂的 “裸 I/O”;

【2】統計所有進程的物理內存使用量

每個進程的 PSS ,是指把共享內存平分到各個進程后,再加上進程本身的非共享內存大小的和;

# 使用grep查找Pss指標后,再用awk計算累加值
$ grep Pss /proc/[1-9]*/smaps | awk '{total+=$2}; END {printf "%d kBn", total }'
391266 kB
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19286

    瀏覽量

    229853
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209523
  • 內存
    +關注

    關注

    8

    文章

    3025

    瀏覽量

    74056
  • 緩存
    +關注

    關注

    1

    文章

    240

    瀏覽量

    26679
收藏 人收藏

    評論

    相關推薦

    linux內存相關知識科普

    linux 內存組織結構和頁面布局,內存碎片產生原因和優化算法。
    發表于 08-08 10:57 ?392次閱讀

    走進Linux內存系統探尋內存管理的機制和奧秘

    Linux 內存是后臺開發人員,需要深入了解的計算機資源。合理的使用內存,有助于提升機器的性能和穩定性。本文主要介紹
    的頭像 發表于 01-05 09:47 ?1632次閱讀

    關于Linux內存管理的詳細介紹

    Linux內存管理是指對系統內存的分配、釋放、映射、管理、交換、壓縮等一系列操作的管理。在Linux中,內存被劃分為多個區域,每個區域有不同
    發表于 03-06 09:28 ?1069次閱讀

    Linux內存相關知識科普

    Linux 內存是后臺開發人員,需要深入了解的計算機資源。合理的使用內存,有助于提升機器的性能和穩定性。本文主要介紹**Linu****x
    發表于 07-25 14:43 ?731次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內存</b>相關知識科普

    查看Linux系統內存使用情況的幾種方法

    Linux系統中,內存監控是優化系統性能的關鍵。本文為你介紹12種方法,幫助你全面掌握Linux
    的頭像 發表于 11-13 09:30 ?1.4w次閱讀
    查看<b class='flag-5'>Linux</b>系統<b class='flag-5'>內存</b>使用情況的幾種方法

    Linux系統的性能優化策略

    近年來,世界上許多大軟件公司紛紛推出各種Linux服務器系統及Linux下的應用軟件。目前,Linux 已可以與各種傳統的商業操作系統分庭抗禮,在服務器市場,占據了相當大的份額。本文分別從磁盤調優,文件系統,
    發表于 07-16 06:23

    基于Linux的Socket網絡編程的性能優化

    基于Linux的Socket網絡編程的性能優化 隨著Intenet的日益發展和普及,網絡在嵌入式系統中應用非常廣泛,越來越多的嵌入式設備采用Linux操作系統。
    發表于 10-22 20:48 ?1086次閱讀
    基于<b class='flag-5'>Linux</b>的Socket網絡編程的<b class='flag-5'>性能</b><b class='flag-5'>優化</b>

    linux內存管理機制淺析

    本內容介紹了arm linux內存管理機制,詳細說明了linux內核內存管理,linux虛擬
    發表于 12-19 14:09 ?73次下載
    <b class='flag-5'>linux</b><b class='flag-5'>內存</b>管理機制淺析

    Android性能優化之Java內存

    在Android開發中,一些不好的編程習慣會導致我們的開發的app存在內存泄露的情況。下面介紹一些在Android開發中常見的內存泄露優化方案。
    發表于 04-26 15:38 ?1002次閱讀
    Android<b class='flag-5'>性能</b><b class='flag-5'>優化</b>之Java<b class='flag-5'>內存</b>

    Linux CPU的性能應該如何優化

    Linux系統中,由于成本的限制,往往會存在資源上的不足,例如 CPU、內存、網絡、IO 性能。本文,就對 Linux 進程和 CPU 的原理進行分析,總結出 CPU
    的頭像 發表于 01-18 08:52 ?3384次閱讀

    一文解析Linux內存系統

    Linux 內存是后臺開發人員,需要深入了解的計算機資源。合理的使用內存,有助于提升機器的性能和穩定性。本文主要介紹
    的頭像 發表于 09-01 10:46 ?2445次閱讀
    一文解析<b class='flag-5'>Linux</b><b class='flag-5'>內存</b>系統

    嵌入式linux+io+優化,嵌入式Linux系統內存優化使用方法研究

    優化進而確保響應運行。并且經過實踐證明,嵌入式系統內存優化使用,能夠提升系統空間5%內存,確保系統順利運行。【關鍵詞】 嵌入式 Linux
    發表于 11-01 16:31 ?10次下載
    嵌入式<b class='flag-5'>linux</b>+io+<b class='flag-5'>優化</b>,嵌入式<b class='flag-5'>Linux</b>系統<b class='flag-5'>內存</b><b class='flag-5'>優化</b>使用方法研究

    Linux系統的共享內存的使用

    但有時候為了讓不同進程之間進行通信,需要讓不同進程共享相同的物理內存Linux通過 共享內存 來實現這個功能。下面先來介紹一下Linux
    的頭像 發表于 11-14 11:55 ?1320次閱讀

    Linux驅動模塊.ko內存精簡優化過程

    Linux 驅動模塊可以獨立的編譯成 .ko 文件,雖然大小一般只有幾 MB,但對總內存只有幾十 MB 的小型 Linux 系統來說,常常也是一個非常值得優化的點。本文以一個實際例子,
    發表于 09-25 09:23 ?1512次閱讀

    Linux內核slab性能優化的核心思想

    今天分享一篇內存性能優化的文章,文章用了大量精美的圖深入淺出地分析了Linux內核slab性能優化
    的頭像 發表于 11-13 11:45 ?628次閱讀
    <b class='flag-5'>Linux</b>內核slab<b class='flag-5'>性能</b><b class='flag-5'>優化</b>的核心思想
    主站蜘蛛池模板: 国产一区二区影院| 亚洲综合激情另类专区| 黄网观看| 91久久人澡人人添人人爽| 日本人69xxx| 在线 | 一区二区三区四区| 婷婷六月综合网| 色老板在线视频一区二区| 免费永久欧美性色xo影院| 国产亚洲精品线观看77| 国内精品久久久久影院免费| 国产精品一区在线播放| 美女黄页黄频| 免费看黄资源大全高清| 欧美大尺度aaa级毛片| 婷婷中文网| 2021韩国理论片ok电影天堂| 喷潮白浆| 亚洲一一在线| 欧美巨大bbbb动漫| 成人在线观看网站| 视频网站免费看| 黄蓉h肉辣文大全| 四虎影视地址| 狠狠色丁香久久综合婷婷| 五月综合在线| 欧美不卡在线视频| 开心激情播播网| 天天干天天射天天舔| 女同性进行性行为视频| 精品香港经典三级在线看| 天天网综合| zsvdy午夜片| 日本免费不卡视频一区二区三区| 亚洲乱亚洲乱妇41p国产成人| 欧美一级高清片在线| 在线视频 亚洲| 男人j进入女人j在线视频| 黄色大片网| 中文字幕精品一区二区三区视频 | 久久电影福利|