交换内存异常

交换内存异常

我目前在 centos 7.6 发行版上遇到内存问题。

尽管应该有高达 80GB 的 RAM 可用,但它还是从我的系统交换开始。

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

先前的结果是 0 免交换费

请记住,swapipiness 设置为 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 个小时和重负载后,交换仍然有 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 的存储空间。

答案1

使用 检查物理卷pvs。如果您看到一个,则表示/dev/vg2 您已将共享内存中的文件系统用作磁盘。如果您关心数据在下次重启后是否能继续存在,请使用/dev立即迁移 。pvmove

为了避免将来出现这种情况,请仅使用磁盘设备(例如 下的现有设备)创建和扩展 VG /dev/disk/。此外,在处理逻辑卷时,您不需要前导/dev,因此lvextend vg2/lv3


/proc/sys/vm/drop_caches仅对性能基准测试中的冷缓存有用。不要尝试使用它进行操作。

请记住,swapipiness 设置为 10,所以这种行为首先不应该发生。

如果不用的话,为什么要有分页空间呢?Committed_AS 占总内存的 135%,它将被调出。

当然,大约 100 GB 是值得怀疑的。如果您不打算配置共享内存(可能用于数据库),则配置不正确。如果您这样做,大页面会提高效率。

相关内容