線上機器 swap 過高導致告警

来源:https://www.cnblogs.com/edisonfish/p/18071304
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚。 今天收到了一個告警,說有台伺服器上的 swap 過高,已經用了 50% 以上了。 登錄機器查看一下記憶體以及 swap 的使用情況。 [root@localhost ~]# free -h total used free shared buff/cache available ...


哈嘍大家好,我是鹹魚。

今天收到了一個告警,說有台伺服器上的 swap 過高,已經用了 50% 以上了。
swap 使用率超過 50%

登錄機器查看一下記憶體以及 swap 的使用情況。

[root@localhost ~]# free -h
total        used        free      shared  buff/cache   available
Mem:    62G         27G        2.9G        568M         32G         33G
swap:   16G        8.3G        8.1G

可以看到還有 2.9G 的空閑物理記憶體,但是系統已經開始使用 swap 了,初步判斷是機器上面的程式記憶體需求比較大,但物理記憶體不夠用所以開始使用 swap 來存儲部分數據。

什麼是 swap

swap 顧名思義指的是 Linux 上的交換分區,有點像 Windows 的虛擬記憶體,說白了就是把一塊磁碟空間或者一個本地文件當成記憶體來使用

在早期記憶體價格昂貴的時代,swap 的出現解決了物理記憶體不足導致無法運行程式的問題。

swap 包含換出和換入兩個過程:

  • 換出:把進程暫時不用的記憶體數據存儲到磁碟中,並釋放這些數據占用的記憶體。
  • 換入:進程再次訪問這些記憶體數據時,把它們從磁碟讀到記憶體來。

那現在隨著記憶體越來越便宜,伺服器上面的記憶體也越來越大,swap 是不是就沒啥作用了呢?

不是的,對於程式來說,記憶體再大也有不夠用的時候。比如說記憶體不足的時候,有些程式不希望被 OOM 殺死,而是希望等待一段時間讓人工來處理,或者等系統自動釋放其他進程的記憶體之後再分配給它。

又比如我們常見的筆記本電腦的休眠和快速開機的功能確實是基於 swap 的。在休眠時,操作系統會將當前記憶體的狀態保存到交換空間或者稱為休眠文件中,然後關閉電腦。當再次開機時,系統可以直接從休眠文件中恢復記憶體狀態,而不需要重新載入應用程式和初始化系統,從而實現了快速開機的功能。

在 Linux 中,/proc/sys/vm/swappiness 用來調整使用 swap 的積極程度。swappiness 的範圍是 0-100,數值越大,越積極使用 swap。一般來講預設值是 60 。

需要註意的是:這個範圍是 swap 積極程度的權重,即使我們設置成 0,在某些情況下(例如進程可用記憶體耗盡了)還是會使用 swap 的。

排查過程

首先我們來看下 swap 的積極程度。

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

swappiness 顯示的是預設值 60,這是一個相對中和的配置,所以系統會根據實際情況來選擇是回收可用緩存以增加可用記憶體空間,還是使用交換空間來增加可用記憶體空間。

接下來我們要找出是哪些進程使用到了 swap。在 Linux 中,可以用 proc 文件系統來查看進程 swap 換出的虛擬記憶體大小,它保存在 /proc/pid/status 的 Vmswap 欄位中。

但是一臺伺服器中有這麼多進程,一個一個找太麻煩了,所以我們可以使用下麵的命令來找出當前系統中 swap 占用最大的幾個進程,併列出它們的進程號、進程名和 swap 大小。

[root@localhost ~]# for file in /proc/*/status ; do awk '/Vmswap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head
java 153707 3245376 kB
java 153544 1757916 kB
java 172612 732100 kB
java 323072 339756 kB
java 172807 161988 kB
  1. for file in /proc/*/status ; do ... done:這是一個 for 迴圈,它遍歷了 /proc 目錄下的所有子目錄,每個子目錄都包含一個名為 status 的文件,其中包含了該進程的一些狀態信息。
  2. awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file:對於每個 /proc/*/status 文件,awk 命令用於匹配 VmSwapName 或者 Pid 這幾個關鍵字,並輸出它們的值。這些關鍵字分別表示交換空間、進程名和進程號。
  3. sort -k 3 -n -r:對輸出的結果進行排序。-k 3 表示按第三列進行排序,即按照交換空間大小排序;-n 表示按照數字順序排序;-r 表示逆序排序,即從大到小排序。
  4. head -5 :輸出排序後的前5行。

從輸出的結果可以看到,使用 swap 比較多的是 java 進程。

如何解決

在定位到是哪些進程使用 swap 比較高之後,我們找到對應的開發同事進行討論,最後決定把 swap 關掉。通常來講,降低 swap 的使用,可以提高系統的整體性能。

一方面是因為頻繁地進行 swap 操作,會導致大量的磁碟讀寫操作,降低系統的響應速度和整體性能。

另一方面是因為頻繁地將數據從記憶體交換到 swap 空間,併在需要時再次交換回來時,會增加 CPU 和記憶體的負擔。

如何關閉 swap ?

首先使用 swapoff 命令關閉當前正在使用的交換空間。

[root@localhost ~]# swapoff -a

然後我們看下 swap 空間是否已經關閉,如果輸出為空則表示 swap 成功關閉。

[root@localhost ~]# cat /proc/swaps

需要註意的是,前面的 swap 關閉操作只是臨時關閉,如果機器重啟是會重新開啟 swap 的。

所以為了下一次重啟機器後 swap 還是關閉狀態我們還要編輯 /etc/fstab 文件,將其中關於 swap 的配置註釋掉或者刪除掉。

# 找到以 swap 標識的行,然後註釋
[root@localhost ~]# vim /etc/fstab
# /dev/mapper/centos-swap swap                    swap

這樣如果機器後面要是重啟了,swap 依舊是關閉狀態。


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

-Advertisement-
Play Games
更多相關文章
  • 開閉原則(Open-Closed Principle, OCP)是面向對象設計的五大SOLID原則之一。這個原則主張“軟體實體(類、模塊、函數等)應該對擴展開放,對修改關閉”。也就是說,軟體的設計應該允許在不修改原有代碼的情況下增加新的功能。這樣的設計有助於降低代碼的複雜性和維護成本,同時提高系統的 ...
  • 上傳附件判斷word、excel、txt等文檔中是否含有敏感詞如身份證號,手機號等,其它檢測如PDF,圖片(OCR)等可以自行擴展。 互聯網項目中,展示的數據中不能包含個人信息等敏感信息。判斷word中是否包含手機號,word正文中是否包含身份證號等敏感信息,通過正則表達式判斷匹配手機號,身份證號, ...
  • 單一職責原則(Single Responsibility Principle, SRP)是面向對象編程和設計的五大SOLID原則之一。它強調一個類、方法或模塊應該只有一個職責,即只做一件事情。如果一個類承擔的職責過多,那麼它的可維護性、可讀性和可擴展性都會受到影響。當需要修改類的某個職責時,可能會影 ...
  • 由於同一臺電腦可以安裝多個版本的.NET Core SDK。 當安裝了許多不同版本的.NET Core SDK 之後,要如何才能使用舊版dotnet 命令,執行dotnet new 或dotnet build 之類的命令? 這部分其實並不困難,只要設定global.json 即可。 首先要查詢目前電 ...
  • 1、準備材料 正點原子stm32f407探索者開發板V2.4 STM32CubeMX軟體(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP模擬器 XCOM V2.6串口助手 一個滑動變阻器 2、學習目標 本文主要學習 FreeRTOS 信號量的相關知識 ...
  • Linux的shell腳本,有時候我們在運行shell腳本時會給腳本傳入參數,出於邏輯上的嚴謹,在腳本中可能會做一些邏輯判斷或處理,例如判斷腳本傳入參數的個數。一般我們會用$#獲取傳入參數的個數,假如,我們在shell腳本的main函數中去判斷腳本傳入參數的個數,類似如下所示: .........f ...
  • 本文主要學習 FreeRTOS 消息隊列的相關知識,包括消息隊列概述、創建刪除複位隊列、寫入/讀取數據到隊列等關於隊列的基礎知識 ...
  • 一:新建虛擬主機 1. 在tomcat里新建文件夾myapps,在裡面添加ROOT文件,放入網站的首頁文件 新建文本文檔,輸入你想要的內容我這裡的內容是TOM.AI,把文本文檔的名字改成index.htm 2. server.xml下每個host節點就代表一個主機,相當於一個網站。 用記事本打開to ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...