交換記憶體異常
我目前在我的 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_caches
並sync; 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 是可疑的。如果您不打算配置共享記憶體(可能用於數據庫),則配置不正確。如果這樣做,大頁面將提高效率。