Memory

交換記憶體異常

  • April 29, 2019

我目前在我的 centos 7.6 發行版上遇到記憶體問題。

它從我的系統交換開始,即使應該有高達 80GB 的記憶體。

   free -m
             total        used        free      shared  buff/cache   available
Mem:         321931      239140        1291       79929       81498        1188
Swap:         30015       29681         334

之前的結果是 0 無交換

請記住,swipipiness 設置為 10,因此這種行為一開始就不應該發生。

df -h 顯示 devtmpfs (/dev) 佔用了大量空間,這不應該是這種情況,因為它應該是正在使用的臨時記憶體。

~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/vlmgrp1-OS   79G   51G   28G  65% /
devtmpfs                158G  100G   58G  64% /dev
tmpfs                   158G     0  158G   0% /dev/shm
tmpfs                   158G  4.0G  154G   3% /run
tmpfs                   158G     0  158G   0% /sys/fs/cgroup
/dev/nvme0n1p2         1014M  232M  783M  23% /boot
tmpfs                    32G     0   32G   0% /run/user/0
tmpfs                    32G     0   32G   0% /run/user/993

如您所見,/dev 正在使用 100GB,而 shared/buff/cache 持有 80GB 物理 RAM,並且沒有將其釋放給系統。

我試圖清除第一次執行sync; echo 1 | sudo tee /proc/sys/vm/drop_caches釋放 4GB 的記憶體。但這在 30 秒內被收回。然後sync; echo 2 | sudo tee /proc/sys/vm/drop_cachessync; echo 3 | sudo tee /proc/sys/vm/drop_caches沒有進一步釋放。

swapoff -a && swapon -a也沒有產生任何結果,經過 5 小時和重負載,swap 仍然有 0 空閒。

~]# ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

無輸出

~]# ipcs -lm

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509465599
max total shared memory (kbytes) = 18014398442373116
min seg size (bytes) = 1

~]# cat /proc/meminfo
MemTotal:       329657664 kB
MemFree:         1817656 kB
MemAvailable:    1476420 kB
Buffers:           14968 kB
Cached:         81813132 kB
SwapCached:      1098308 kB
Active:         231698396 kB
Inactive:       90111876 kB
Active(anon):   231527424 kB
Inactive(anon): 90073660 kB
Active(file):     170972 kB
Inactive(file):    38216 kB
Unevictable:       25724 kB
Mlocked:           25724 kB
SwapTotal:      30736380 kB
SwapFree:          10668 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:      238909760 kB
Mapped:            57984 kB
Shmem:          81611272 kB
Slab:            1126844 kB
SReclaimable:     454628 kB
SUnreclaim:       672216 kB
KernelStack:       35296 kB
PageTables:       566588 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    195565212 kB
Committed_AS:   446505420 kB
VmallocTotal:   34359738367 kB
VmallocUsed:     2154028 kB
VmallocChunk:   34189572924 kB
HardwareCorrupted:     0 kB
AnonHugePages:  44908544 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      816952 kB
DirectMap2M:    146685952 kB
DirectMap1G:    189792256 kB

~]# grep -R swap /usr/lib/tuned | grep swappiness
/usr/lib/tuned/latency-performance/tuned.conf:# The swappiness parameter controls the tendency of the kernel to move
/usr/lib/tuned/latency-performance/tuned.conf:vm.swappiness=10
/usr/lib/tuned/throughput-performance/tuned.conf:# The swappiness parameter controls the tendency of the kernel to move
/usr/lib/tuned/throughput-performance/tuned.conf:vm.swappiness=10
/usr/lib/tuned/virtual-guest/tuned.conf:vm.swappiness = 10

因此,似乎系統不應該開始交換到這種程度,但是交換已滿,並且我的 80GB 可用 RAM 無法訪問。我將注意力轉回 devtmpfs。什麼可能使用 100GB?

我想在這個路口,我應該提到這個伺服器是虛擬化和分區的。它使用 LVM 並且上面有很多虛擬機。上面有 5 個主要的捲組。

~]# vgscan
 Reading volume groups from cache.
 Found volume group "vg1" using metadata type lvm2
 Found volume group "vg2" using metadata type lvm2
 Found volume group "vg3" using metadata type lvm2
 Found volume group "vg" using metadata type lvm2
 Found volume group "nvmessd1" using metadata type lvm2

我去搜尋 /dev 中使用 100GB 的內容並找到了這個

~]# du -h /dev
0       /dev/system
0       /dev/pve
0       /dev/centos
0       /dev/vg
0       /dev/vg3
100G    /dev/vg2
0       /dev/vg1
0       /dev/nvmessd1
0       /dev/vfio
0       /dev/snd
0       /dev/net
0       /dev/mqueue
0       /dev/hugepages/libvirt/qemu
0       /dev/hugepages/libvirt
0       /dev/hugepages
0       /dev/vlmgrp1
0       /dev/disk/by-label
0       /dev/disk/by-partuuid
0       /dev/disk/by-partlabel
0       /dev/disk/by-uuid
0       /dev/disk/by-path
0       /dev/disk/by-id
0       /dev/disk
0       /dev/block
0       /dev/bsg
0       /dev/dri
0       /dev/char
0       /dev/mapper
0       /dev/pts
0       /dev/shm
0       /dev/input/by-path
0       /dev/input/by-id
0       /dev/input
0       /dev/bus/usb/002
0       /dev/bus/usb/001
0       /dev/bus/usb
0       /dev/bus
0       /dev/raw
0       /dev/cpu/23
0       /dev/cpu/22
0       /dev/cpu/21
0       /dev/cpu/20
0       /dev/cpu/19
0       /dev/cpu/18
0       /dev/cpu/17
0       /dev/cpu/16
0       /dev/cpu/15
0       /dev/cpu/14
0       /dev/cpu/13
0       /dev/cpu/12
0       /dev/cpu/11
0       /dev/cpu/10
0       /dev/cpu/9
0       /dev/cpu/8
0       /dev/cpu/7
0       /dev/cpu/6
0       /dev/cpu/5
0       /dev/cpu/4
0       /dev/cpu/3
0       /dev/cpu/2
0       /dev/cpu/1
0       /dev/cpu/0
0       /dev/cpu
100G    /dev

對我來說,看起來 /dev/vg2 實際上正在使用交換記憶體。這怎麼可能?

我不確定這裡發生了什麼,也從未目睹過這種行為。我更願意在不重新啟動的情況下恢復交換和一些 RAM,但有沒有辦法因為我目前不知所措?

謝謝。

編輯

pvs 也有一個奇怪的錯誤,我只能猜測與此問題有關,並且 vg2 不在正確的位置。

~]# pvs
 Error reading device /dev/centos/root at 0 length 512.
 Error reading device /dev/centos/root at 0 length 4.
 Error reading device /dev/centos/root at 4096 length 4.
 Error reading device /dev/system/var at 0 length 512.
 Error reading device /dev/system/var at 0 length 4.
 Error reading device /dev/system/var at 4096 length 4.
 Error reading device /dev/system/tmp at 0 length 512.
 Error reading device /dev/system/tmp at 0 length 4.
 Error reading device /dev/system/tmp at 4096 length 4.
 Error reading device /dev/system/swap at 0 length 512.
 Error reading device /dev/system/swap at 0 length 4.
 Error reading device /dev/system/swap at 4096 length 4.
 Error reading device /dev/system/backup at 0 length 512.
 Error reading device /dev/system/backup at 0 length 4.
 Error reading device /dev/system/backup at 4096 length 4.
 PV                                                           VG       Fmt  Attr PSize   PFree
 /dev/mapper/vg2-vsv1685--dsakekjloo2ddm0a--eahin7pr71l0fwlc2 vg       lvm2 a--  <99.88g       0
 /dev/nvme0n1p3                                               vg3  lvm2 a--    1.86t  651.28g
 /dev/nvme1n1                                                 nvmessd1 lvm2 a--    1.86t <555.72g
 /dev/sda1                                                    vg1      lvm2 a--   <9.10t    4.04t
 /dev/sdb1                                                    vg2      lvm2 a--   <9.10t    3.74t

如您所見,vg2 只是一個位於分區號 1(整個磁碟)中的 sdb 磁碟上的捲組,它是一個 10TB 儲存。

使用 來查看物理卷pvs。如果您在下面看到一個,/dev/vg2 則您已將/dev共享記憶體中的文件系統用作磁碟。pvmove如果您關心您的數據在下次重新啟動後仍然存在,請立即遷移 。

為避免將來發生這種情況,請僅使用磁碟設備創建和擴展 VG,例如/dev/disk/. 此外,在處理邏輯卷時,您不需要前導/dev, 所以lvextend vg2/lv3.


/proc/sys/vm/drop_caches僅對性能基準測試中的冷記憶體有用。不要費心嘗試將其用於操作。

請記住,swipipiness 設置為 10,因此這種行為一開始就不應該發生。

如果不使用它,為什麼會有分頁空間?Committed_AS 是您總記憶體的 135%,它將被分頁。

當然,大約 100 GB 是可疑的。如果您不打算配置共享記憶體(可能用於數據庫),則配置不正確。如果這樣做,大頁面將提高效率。

引用自:https://serverfault.com/questions/965137