【linux】free 命令显示 swap 信息异常处理
文章目錄
- 前言
- 問題原因:
- 為什么出現(xiàn)這么大的值?
- 為什么會發(fā)生 swap free 大于 swap total 的現(xiàn)象?
- 解決方案:
- 實踐:
- 1. 啟用交換分區(qū)
- 2. 增加交換分區(qū)使用頻率
- 3. 編寫一個內存代碼 `munch.c`
- 4. 編譯
- 5. 執(zhí)行
- 6. 查看內存
- 7. 修改交換分區(qū)使用頻率
- 總結:
- 錯誤:
- 參考:
前言
今天發(fā)現(xiàn)有臺服務swap分區(qū)數(shù)據(jù)顯示異常,使用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可以看到交換分區(qū)使用明顯是不正常的,并且使用swapon/swapoff 命令也并不能解決問題!
使用swapon -a
使用swapoff -a
可以看到使用swapon/swapoff 命令也并不能解決問題!
問題原因:
為什么出現(xiàn)這么大的值?
通過查看 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 函數(shù)可以看到 free 大于 total 的總量, 在這里的話 X 即為負數(shù) -2752, 在宏定義函數(shù) S 中, 將 X 強制轉換為64位的無符號整形, 表達式 (unsigned long long) (X) 等效于 2^64 - 2752 , 計算出結果后左移 10 位再右移 10(shift 值) 位, 得出結果 18014398509479232.
為什么會發(fā)生 swap free 大于 swap total 的現(xiàn)象?
在 kernel-2.6.32-573.7.1 版本之前, 函數(shù) get_swap_page 在加鎖的過程中去掉了自旋鎖 swap_lock, 這可能會引起 nr_swap_pages 檢測異常使得 /proc/meminfo 記錄失效的 swapfree 數(shù)值, 由此可能引起 swapfree 大于 swaptotal 的現(xiàn)象. 詳見: 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 而引起, 所以要永久杜絕該現(xiàn)象可以升級內核到 2.6.32-573.7.1 版本, 重啟后即可生效; 如果不升級 kernel 的話, 只是簡單的 swapoff/swapon 是不能讓結果正常顯示的, 因為 swap 的使用未見變化。
- 臨時解決方案: 重啟
- 永久解決方案:升級內核
- 占用部分 swap 空間就可以使 free 顯示正常
由于這臺服務器上部署的服務比較多,切服務比較重要,索引重啟機器和升級內核的方案不能使用。于是選擇使用第三種方案:
實踐:
1. 啟用交換分區(qū)
因為我們需要占用部分 swap 空間,所以第一步打開交換分區(qū)。
swapon -a2. 增加交換分區(qū)使用頻率
增加交換分區(qū)的使用頻繁,這樣使我們的內存程序能夠更好的使用交換分區(qū)的空間。
echo 60 > /proc/sys/vm/swappiness3. 編寫一個內存代碼 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 munch5. 執(zhí)行
./munch 或者./munch 60000這塊根據(jù)自己的服務器配置來寫,我這里讓程序去占用60G內存,這樣可能用到swap 分區(qū)。
6. 查看內存
這里建議開啟兩個終端窗口,一個用來執(zhí)行代碼,一個用來查看內存情況。
free -g可以看到swap分區(qū)已經(jīng)顯示正常了。
7. 修改交換分區(qū)使用頻率
echo 1 > /proc/sys/vm/swappiness這里有個注意點,當swap分區(qū)顯示正常后,如果我們再次關閉交換分區(qū),那個這個異常問題還是會復現(xiàn),所以在這里就不關閉交換分區(qū)了,只是調小交換分區(qū)的使用頻繁。
總結:
在內存急速被占盡的情況下, 由于舊版本 kernel 的函數(shù)處理可能會引起該問題的發(fā)生, 進而造成 /proc/meminfo 數(shù)據(jù)信息的異常, 最后導致 free 命令的錯誤. 如果要杜絕該現(xiàn)象, 需要將 kernel 升級到 kernel-2.6.32-573.7.1 版本. 另外也應該盡量避免運行急速消耗內存的進程.
錯誤:
問題一:
在編譯c程序時,報gcc commands not found。
出現(xiàn)以上問題的原因是系統(tǒng)沒有安裝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 信息异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何从软件工程师转型为AI工程师?
- 下一篇: xshell7 无法启动