虛擬記憶體設置(解決linux記憶體不夠情況)

来源:https://www.cnblogs.com/gethinwang/archive/2019/03/11/10511047.html
-Advertisement-
Play Games

一、 虛擬記憶體介紹 背景介紹 Memory指機器物理記憶體,讀寫速度低於CPU一個量級,但是高於磁碟不止一個量級。所以,程式和數據如果在記憶體的話,會有非常快的讀寫速度。但是,記憶體的造價是要高於磁碟的,且記憶體的斷電丟失數據也是不能把所有數據和程式都保存在記憶體中的原因。 既然不能全部使用記憶體,那數據還有程 ...


一、      虛擬記憶體介紹

背景介紹

  Memory指機器物理記憶體,讀寫速度低於CPU一個量級,但是高於磁碟不止一個量級。所以,程式和數據如果在記憶體的話,會有非常快的讀寫速度。但是,記憶體的造價是要高於磁碟的,且記憶體的斷電丟失數據也是不能把所有數據和程式都保存在記憶體中的原因。

既然不能全部使用記憶體,那數據還有程式不可能一直霸占在記憶體中。當記憶體沒有可用的,就必須要把記憶體中不經常運行的程式踢出去。但是踢到哪裡去,這時候swap就出現了。

Swap全稱為swap place,即交換分區。當記憶體不夠的時候,被踢出的進程被暫時存儲到交換區。當需要這條被踢出的進程時,就從交換區重新載入到記憶體,否則它不會主動交換到真實記憶體中。

Swap介紹

  在詳細介紹swap之前,需要知道的是電腦記憶體分為物理記憶體與虛擬記憶體(註意虛擬記憶體和虛擬地址空間的區別)。

  物理記憶體是電腦的實際記憶體大小,由RAM晶元組成。虛擬記憶體則是虛擬出來的、使用磁碟代替記憶體。虛擬記憶體的出現,讓機器記憶體不夠的情況得到部分解決。當程式運行起來由操作系統做具體虛擬記憶體到物理記憶體的替換和載入(相應的頁與段的虛擬記憶體管理)。這裡的虛擬記憶體即所謂的swap。

  當用戶提交程式,然後產生進程在機器上運行。機器會判斷當前物理記憶體是否還有空閑允許進程調入記憶體運行,如果有則直接調入記憶體進行;如果沒有,則會根據優先順序選擇一個進程掛起,把該進程交換到swap中等待,然後把新的進程調入到記憶體中運行。根據這種換入和換出,實現了記憶體的迴圈利用,讓用戶感覺不到記憶體的限制。從這也可以看出swap扮演了一個非常重要的角色,就是暫存被換出的進程。

  記憶體與swap之間是按照記憶體頁為單位來交換數據的,一般Linux中頁的大小設置為4Kb。而記憶體與磁碟則是按照來交換數據的。

Swap的設置

  從上可以看出,當物理記憶體使用完或者達到一定比例之後,我們可以使用swap做臨時的記憶體使用。當物理記憶體和swap都被使用完那麼就會出錯,如:out of memory。

  對於使用多大比例記憶體之後開始使用swap,在系統配置文件中可以通過調整參數進行修改。 

1 [root@localhost ~]# cat /proc/sys/vm/swappiness

2 60

   該參數範圍為0-100。0就是最大限度使用記憶體,儘量不使用swap;100是積極使用swap。

 

  物理記憶體無法更改,所以swap大小的設置將會影響應用能否正常運行。swap大小的確定,根據Centos官網介紹可以得出如下公式:

1 M = Amount of RAM in GB, and S = Amount of swap in GB, then If M < 2, S = M *2 Else S = M + 2

 

   註意:最小不應小於32M。

  

  Swap分區的數量對性能也有很大的影響。因為swap畢竟還是以磁碟來偽裝成記憶體,交換的操作是磁碟IO的操作而不是記憶體的ioad與store操作。如果有多個swap交換區,每個swap會有一定的優先順序,該優先順序也可以調整。swap空間的分配會以輪流的方式操作於所有的swap,這樣會大大均衡IO的負載,加快swap交換的速度。

swap相關命令

1 [root@localhost ~]# swapon -s #查看當前swap的使用情況

2 Filename Type Size Used Priority

3 /dev/sda3 partition 2064376 0 -1

4 [root@localhost ~]# cat /proc/swaps #查看當前swap的使用情況

5 Filename Type Size Used Priority

6 /dev/sda3 partition 2064376 0 -1

7 [root@localhost ~]# swapoff /dev/sda3 #關閉相應的swap_disk_name

8 [root@localhost ~]# swapon -s

9 Filename Type Size Used Priority

10 [root@localhost ~]# swapon /dev/sda3 #啟動相應的swap_disk_name

11 [root@localhost ~]# swapon -s

12 Filename Type Size Used Priority

13 /dev/sda3 partition 2064376 0 -1
 

二、      虛擬記憶體設置

1、檢查 Swap 空間

在設置 Swap 文件之前,有必要先檢查一下系統里有沒有既存的 Swap 文件。

運行以下命令:

swapon -s

如果返回的信息概要是空的,則表示 Swap 文件不存在。

2、檢查文件系統

在設置 Swap 文件之前,同樣有必要檢查一下文件系統,看看是否有足夠的硬碟空間來設置 Swap 。運行以下命令:

df -hal

檢查返回的信息,還剩餘足夠的硬碟空間即可。

3、創建並允許 Swap 文件

下麵使用 dd 命令來創建 Swap 文件。

dd if=/dev/zero of=/tmp/swapfile bs=1024 count=1024k

這樣就建立一個/tmp/swapfile的分區文件,大小為1G。

參數解讀:

if=文件名:輸入文件名,預設為標準輸入。即指定源文件。< if=input file >

of=文件名:輸出文件名,預設為標準輸出。即指定目的文件。< of=output file >

bs=bytes:同時設置讀入/輸出的塊大小為bytes個位元組

count=blocks:僅拷貝blocks個塊,塊大小等於bs指定的位元組數。

4、格式化並激活 Swap 文件

上面已經創建好 Swap 文件,還需要格式化後才能使用。運行命令:

dd if=/dev/zero of=/tmp/swapfile bs=1024 count=1024k

激活 Swap ,運行命令:

swapon /tmp/swapfile

以上步驟做完,再次運行命令:

swapon -s

你會發現返回的信息概要:

Filename Type Size Used Priority

/tmp/swapfile file 524284 0 -1

如果要機器重啟的時候自動掛載 Swap ,那麼還需要修改 fstab 配置。

用 vim 打開 /etc/fstab 文件,在其最後添加如下一行:

/tmp/swapfile           swap                    swap    defaults        0 0

最後,賦予 Swap 文件適當的許可權:

chown root:root /tmp/swapfile

chmod 600 /tmp/swapfile

同時,我們還可以修改 Linux Swap 空間的 swappiness ,降低對硬碟的緩存。

Linux 會使用硬碟的一部分做為 Swap 分區,用來進行進程調度–進程是正在運行的程式–把當前不用的進程調成‘等待(standby)’,甚至‘睡眠(sleep)’,一旦要用,再調成‘活動(active)’,睡眠的進程就會在 Swap 分區,把記憶體空出來讓給‘活動’的進程。

如果記憶體夠大,應當告訴 Linux 不必太多的使用 Swap 分區,可以通過修改 swappiness 的參數來設置。swappiness=0 的時候表示最大限度使用物理記憶體,然後才是 Swap 空間,swappiness=100 的時候表示積極的使用 Swap 分區,並且把記憶體上的數據及時的搬運到 Swap 空間裡面。

在 CentOS 中,swappiness 的預設值是60。

通過以下命令可以看到:

cat /proc/sys/vm/swappiness

返回值60

我們可以調整 swappiness 的值到一個合適的參數,從而達到最優化使用 Swap 的目的。這裡我們將其設為10。這樣你就將值由60改為10,這可以大大降低系統對於swap的寫入,建議記憶體為512M或更多的朋友採用此方法。如你你發現你對於swap的使用極少,可以將值設為0。這並不會禁止你對swap的使用,而是使你的系統對於swap的寫入儘可能的少,同時儘可能多的使用你的實際記憶體。這對於你在切換應用程式時有著巨大的作用,因為這樣的話它們是在物理記憶體而非swap分區中。 

使用 sysctl 命令:

sysctl vm.swappiness=10

但是這隻是臨時性的修改,在你重啟系統後會恢復預設的60,要永久設置,還需要在 vim 中修改sysctl.conf:

vi /etc/sysctl.conf

在這個文檔的最後加上這樣一行:

# Search for the vm.swappiness setting. Uncomment and change it as necessary.

vm.swappiness=10

輸入:x,保存退出 vim 。

這樣一來,Swap 分區重啟後都會生效了。

 

 

 

 

參考: https://www.cnblogs.com/004x/p/6651600.html

https://blog.csdn.net/shinaiqing/article/details/70132424

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉載:https://www.cnblogs.com/little-white/p/3236548.html 一、大端模式和小端模式的起源 關於大端小端名詞的由來,有一個有趣的故事,來自於Jonathan Swift的《格利佛游記》:Lilliput和Blefuscu這兩個強國在過去的36個月中一直 ...
  • 1)介面區別:NOR FLASH地址線和數據線分開,來了地址和控制信號,數據就出來。NAND Flash地址線和數據線在一起,需要用程式來控制,才能出數據。通俗的說,就是光給地址不行,要先命令,再給地址,才能讀到NAND的數據。而且都是在一個匯流排完成的。結論是:ARM無法從NAND直接啟動。除非裝載 ...
  • 微處理器的兩種結構比較 馮·諾依曼結構 VS 哈佛結構 1、馮·諾依曼結構 馮·諾依曼結構又稱作普林斯頓體繫結構(Princetionarchitecture)。 1945年,馮·諾依曼首先提出了“存儲程式”的概念和二進位原理,後來,人們把利用這種概念和原理設計的電子電腦系統統稱為“馮·諾依曼型結 ...
  • 鄭重聲明:轉載自http://blog.csdn.net/zhongjin616/article/details/18765301 1> 首先討論各種單片機與操作系統的關係 說到單片機,大家第一時間想到的應該是51單片機,對吧。不錯,更高級一點的AVR,把他稱為單片機,我們也還覺得可以接受。那麼再高 ...
  • 深入linux內核架構,演算法,Linux命令行與shell腳本編程大全等高質量書籍 ...
  • 這個問題困擾了我好長時間,網上查了好長時間,這個問題的解決方法,就是將binultils升級到2.26。 造成這個問題的原因是gcc和binultils版本不匹配,gcc對應的版本較高,gcc編譯後,ld(由binultils決定)進行鏈接,結果由於binultils版本較低, 無法識別。 解決方法 ...
  • 1.準備安裝環境yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-develgcc編譯器用於編譯軟體包,pcre庫支持rewrite模塊,zlib支持gzip模塊,openssl庫支持ss ...
  • 註:Nginx服務在運行時,會保持一個主進程(master process)和一個或多個工作進程(worker process)。 每一個進程都會有一個PID進程號,可以通過向主進程的PID進程號發送信號關閉伺服器。 Nginx伺服器啟動後,預設在Nginx伺服器安裝目錄的logs目錄中會產生文件名 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...