日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【linux】free 命令显示 swap 信息异常处理

發布時間:2024/3/24 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【linux】free 命令显示 swap 信息异常处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 前言
    • 問題原因:
      • 為什么出現這么大的值?
      • 為什么會發生 swap free 大于 swap total 的現象?
    • 解決方案:
    • 實踐:
      • 1. 啟用交換分區
      • 2. 增加交換分區使用頻率
      • 3. 編寫一個內存代碼 `munch.c`
      • 4. 編譯
      • 5. 執行
      • 6. 查看內存
      • 7. 修改交換分區使用頻率
    • 總結:
    • 錯誤:
    • 參考:

前言

今天發現有臺服務swap分區數據顯示異常,使用free -g 命令查看內存使用情況,swap 的 used 遠遠超過 swap total 的值, free 的值也大于 total, 如下所示:

[root@dx-selk00 ~]# free -gtotal used free shared buffers cached Mem: 125 125 0 0 0 40 -/+ buffers/cache: 83 42 Swap: 0 1717986918 3

可以看到交換分區使用明顯是不正常的,并且使用swapon/swapoff 命令也并不能解決問題!

使用swapon -a

使用swapoff -a

可以看到使用swapon/swapoff 命令也并不能解決問題!

問題原因:

為什么出現這么大的值?

通過查看 free 命令的源代碼說明: https://github.com/mmalecki/procps/

free.c 文件關于 swap 信息的代碼:

22 #define S(X) ( ((unsigned long long)(X) << 10) >> shift) ... ... 38 int shift = 10; ... ... 100 printf( 101 "%-7s %10Lu %10Lu %10Lu\n", "Swap:", 102 S(kb_swap_total), 103 S(kb_swap_used), 104 S(kb_swap_free) 105 );

追蹤 kb_swap_used 到 proc/sysinfo.c 文件的代碼:

41 #define MEMINFO_FILE "/proc/meminfo" ... 589 FILE_TO_BUF(MEMINFO_FILE,meminfo_fd); ... 621 kb_swap_used = kb_swap_total - kb_swap_free; 622 kb_main_used = kb_main_total - kb_main_free;

從代碼來看 free 命令是通過讀取 /proc/meminfo 的信息來顯示內存及 swap 的使用, 通過 free -m 函數可以看到 free 大于 total 的總量, 在這里的話 X 即為負數 -2752, 在宏定義函數 S 中, 將 X 強制轉換為64位的無符號整形, 表達式 (unsigned long long) (X) 等效于 2^64 - 2752 , 計算出結果后左移 10 位再右移 10(shift 值) 位, 得出結果 18014398509479232.

為什么會發生 swap free 大于 swap total 的現象?

在 kernel-2.6.32-573.7.1 版本之前, 函數 get_swap_page 在加鎖的過程中去掉了自旋鎖 swap_lock, 這可能會引起 nr_swap_pages 檢測異常使得 /proc/meminfo 記錄失效的 swapfree 數值, 由此可能引起 swapfree 大于 swaptotal 的現象. 詳見: RHBA-2015-1827.html bug 說明

  • A previous change in the get_swap_page() locking removed the use of the
    swap_lock spinlock. This could cause nr_swap_pages corruption and invalid
    SwapFree information in the /proc/meminfo file, where the size of SwapFree could
    exceed the size of SwapTotal. This update uses an atomic variable for
    nr_swap_pages, and the size of SwapFree in /proc/meminfo is now correct.
    (BZ#1259362)

解決方案:

上述問題的原因在于 kernel 方面的 bug 而引起, 所以要永久杜絕該現象可以升級內核到 2.6.32-573.7.1 版本, 重啟后即可生效; 如果不升級 kernel 的話, 只是簡單的 swapoff/swapon 是不能讓結果正常顯示的, 因為 swap 的使用未見變化。

  • 臨時解決方案: 重啟
  • 永久解決方案:升級內核
  • 占用部分 swap 空間就可以使 free 顯示正常

由于這臺服務器上部署的服務比較多,切服務比較重要,索引重啟機器和升級內核的方案不能使用。于是選擇使用第三種方案:

實踐:

1. 啟用交換分區

因為我們需要占用部分 swap 空間,所以第一步打開交換分區。

swapon -a

2. 增加交換分區使用頻率

增加交換分區的使用頻繁,這樣使我們的內存程序能夠更好的使用交換分區的空間。

echo 60 > /proc/sys/vm/swappiness

3. 編寫一個內存代碼 munch.c

代碼的功能是會盡可能多地占用內存,或者達到指定的限制

vim /tmp/munch.c

代碼內容如下:

#include <stdlib.h> #include <stdio.h> #include <string.h>int main(int argc, char** argv) {int max = -1;int mb = 0;char* buffer;if(argc > 1)max = atoi(argv[1]);while((buffer=malloc(1024*1024)) != NULL && mb != max) {memset(buffer, 0, 1024*1024);mb++;printf("Allocated %d MB\n", mb);}return 0; }

4. 編譯

編譯c程序

gcc munch.c -o munch

5. 執行

./munch 或者./munch 60000

這塊根據自己的服務器配置來寫,我這里讓程序去占用60G內存,這樣可能用到swap 分區。

6. 查看內存

這里建議開啟兩個終端窗口,一個用來執行代碼,一個用來查看內存情況。

free -g

可以看到swap分區已經顯示正常了。

7. 修改交換分區使用頻率

echo 1 > /proc/sys/vm/swappiness

這里有個注意點,當swap分區顯示正常后,如果我們再次關閉交換分區,那個這個異常問題還是會復現,所以在這里就不關閉交換分區了,只是調小交換分區的使用頻繁。

總結:

在內存急速被占盡的情況下, 由于舊版本 kernel 的函數處理可能會引起該問題的發生, 進而造成 /proc/meminfo 數據信息的異常, 最后導致 free 命令的錯誤. 如果要杜絕該現象, 需要將 kernel 升級到 kernel-2.6.32-573.7.1 版本. 另外也應該盡量避免運行急速消耗內存的進程.

錯誤:

問題一:
在編譯c程序時,報gcc commands not found。

出現以上問題的原因是系統沒有安裝gcc編譯器所以需要安裝,可以使用yum源進行安裝;

yum -y install gcc+ gcc-c++

參考:

  • https://blog.arstercz.com/free-%E5%91%BD%E4%BB%A4%E6%98%BE%E7%A4%BA-swap-%E4%BF%A1%E6%81%AF%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86/
  • https://www.linuxatemyram.com/play.html

總結

以上是生活随笔為你收集整理的【linux】free 命令显示 swap 信息异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。