騰訊雲伺服器記憶體不足量的問題
騰訊雲伺服器安裝 Debian 或 Ubuntu 系統後使用 free 命令檢視記憶體大小往往會發現比所購買配置的標稱記憶體要小很多,1G 記憶體的例項通常只有 860M 左右,2G 記憶體的查出來也只有 1870M 左右,如下圖所示(2G 記憶體):
一開始我也和大多數人想的一樣,認為這是黑心商家為了多賺錢故意少分配了記憶體,然而最近了解了一下情況之後發現這事還真是誤會騰訊雲了,下面簡單的記錄一下問題原因和解決方案吧。
問題原因
使用命令 dmidecode 檢視底層硬體資訊,可以看到我的 2G 記憶體的伺服器是分配足了 2048M 記憶體的。
使用 dmidecode 命令檢視底層硬體資訊
但是為什麼使用 free 命令看到的記憶體變少了呢?查閱資料找到了答案:free 命令看到的是夥伴系統管理的記憶體,這部分記憶體是不包括 OS 核心一些基本資料結構消耗以及核心預留記憶體的。
使用命令 dmesg | grep -i memory 檢視核心預留記憶體,注意到如下部分:
檢視系統中的核心預留記憶體
嗯,為 crashkernel 預留了 128M 的記憶體,很明顯這就是導致我們“記憶體不足量”的罪魁禍首。
騰訊雲提供的 Debian 和 Ubuntu 系統映象預設開啟了 kdump 服務,當 Linux 核心出現了故障時 kdump 會協助產生一個 dump 檔案,記錄下此時的記憶體執行引數等資訊,便於使用者後續對核心問題的定位分析。而上面提到的“為 crashkernel 預留的記憶體”就是用於這一服務的,也就是導致我們“記憶體不足量”的元凶。
這一服務對於那些注重安全的大公司來說可能會有些用處,但我們這種個人用途的低配置伺服器也開著的話就沒有什麼必要了,本身記憶體就不大,還要為這服務分出去一部分不能用,想想還是有點浪費的。
解決方案
既然問題是由於系統為 kdump 服務預留了一部分記憶體導致的,那我們把 kdump 服務關了就行了。
暴力點,直接解除安裝 kdump-tools:
apt purge kdump-tools
解除安裝後順便清理一下它的那些已經用不到了的依賴包:
apt autoremove
然後編輯 /etc/default/grub 檔案,將其中的 crashkernel=xxx 欄位全部刪掉,我這裡的修改情況如下:
# 待修改的兩行配置 GRUB_CMDLINE_LINUX_DEFAULT="crashkernel=384M-:128M" GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 console=ttyS0,115200 console=tty0 panic=5 crashkernel=auto" # 修改後的配置 GRUB_CMDLINE_LINUX_DEFAULT="" GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 console=ttyS0,115200 console=tty0 panic=5"
修改完之後執行 update-grub2 更新 grub 引導檔案,最後再重啟一下伺服器就可以啦!
如下圖所示,重啟後可用記憶體變成了 2004M(比之前多了 128M):