我们正在将一些服务器从 centos 7.7ish 迁移到 Rocky linux 8,我们发现几乎每个进程都使用了 20-50% 的内存,导致机器锁定。
例如在centos上sh:
# sh -c 'egrep "VmRSS|VmSwap" /proc/$$/status'
VmRSS: 664 kB
VmSwap: 0 kB
与洛基对比:
# sh -c 'egrep "VmRSS|VmSwap" /proc/$$/status'
VmRSS: 1136 kB
VmSwap: 0 kB
这只是一个简单的例子;在相同的硬件上,httpd、nginx、postgres 进程都有很大的增加,尽管具体数量从 20% 到 50% 左右不等。
有人能建议一下要查看哪些内容来调试这个问题吗?我们可以查看一些 /proc 设置吗?
内核报告:centos:3.10.0-1160.62.1.el7.x86_64 rocky:4.18.0-348.12.2.el8_5.x86_64
编辑
我们已经更新了 centos 7 内核,使其与 rocky 8 版本相匹配,甚至超过了 rocky 8 版本。Centos 7 的内存使用情况不是增长到与 rocky 8 相同的程度(它增加了一点,可能 3%,正如我所预料的,只是内核膨胀)。所以我们假设这不是内核问题,而是库中的问题(因为这个问题在不同的进程中非常普遍)。
getconf PAGESIZE 对于两个操作系统都返回 4096
/proc/meminfo (请注意,这台机器有交换,而我们的生产机器没有)
MemTotal: 3826180 kB
MemFree: 1292540 kB
MemAvailable: 2010048 kB
Buffers: 100 kB
Cached: 1071740 kB
SwapCached: 76916 kB
Active: 1028020 kB
Inactive: 1219360 kB
Active(anon): 266816 kB
Inactive(anon): 1097744 kB
Active(file): 761204 kB
Inactive(file): 121616 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 1679356 kB
SwapFree: 983108 kB
Dirty: 52 kB
Writeback: 0 kB
AnonPages: 1104196 kB
Mapped: 132244 kB
Shmem: 193280 kB
KReclaimable: 78224 kB
Slab: 130756 kB
SReclaimable: 78224 kB
SUnreclaim: 52532 kB
KernelStack: 5728 kB
PageTables: 31140 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3592444 kB
Committed_AS: 3708844 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
Percpu: 1776 kB
HardwareCorrupted: 0 kB
AnonHugePages: 724992 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
FileHugePages: 0 kB
FilePmdMapped: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 370560 kB
DirectMap2M: 3823616 kB
答案1
您可以尝试sysctl -a
在两个系统上运行以找出不同之处。查找与、、和等相关vm.swappiness
的vm.dirty_background_ratio
设置vm.overcommit_memory
。
您可能还想检查 httpd、nginx 和 postgres 配置文件,看看默认值是否已更改。还要检查在 rocky Linux 8 上安装的任何额外软件包是否占用更多内存。例如,对于 Apache/Nginx,请确保检查工作进程/线程的数量以匹配可用的硬件资源。工作进程过多可能会导致内存使用问题。
如果其他方法都失败了,您可以尝试使用类似 Valgrind 工具“Massif”来分析上述进程的内存使用情况,以分析堆内存使用情况。但这是另一回事。