高内存 64 位服务器,不使用所有内存

高内存 64 位服务器,不使用所有内存

我有一些运行 centos 64 位的高内存 Linux 服务器,在运行 10-20 天后,我注意到所有这些服务器实际上都没有使用所有可用的 RAM(在 48GB 系统上它们都有大约 10GB 的可用内存,在 64GB 系统上都有大约 20GB 的可用内存)。

它们是 Web 服务器,并且具有超过服务器 RAM 数量的工作数据集(例如活动文件),因此我会假设页面缓存将增长到使用所有 RAM 的程度,然后页面缓存中的页面将在需要时被释放。

例如 :

top - 09:44:46 up 57 days,  9:32,  5 users,  load average: 6.44, 6.33, 6.27
Tasks: 680 total,   4 running, 676 sleeping,   0 stopped,   0 zombie
Cpu(s): 17.3%us,  3.3%sy,  0.0%ni, 79.0%id,  0.1%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:  49313212k total, 39277524k used, 10035688k free,  1247064k buffers
Swap: 20643832k total,        0k used, 20643832k free, 20592968k cached

显示该服务器已运行 57 天,但有 10GB 的可用内存可用于页面缓存。

以下 sysctl 是从库存 centos 设置的:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.all.log_martians = 1
error: "kernel.maps_protect" is an unknown key
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_max_syn_backlog = 4096
net.core.netdev_max_backlog = 20000
vm.min_free_kbytes = 85536
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 6000
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_fin_timeout = 40
net.ipv4.tcp_keepalive_time = 1000
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_intvl = 30
net.netfilter.nf_conntrack_tcp_timeout_established = 2000
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
kernel.panic = 40
fs.proc_can_see_other_uid = 0
net.ipv4.ipfrag_secret_interval = 6000
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.tcp_max_tw_buckets_ub = 720000
net.core.optmem_max = 25165824
fs.proc_can_see_other_uid = 0
fs.proc_super_gid = 32010
vm.swappiness = 2
fs.file-max = 400000
fs.suid_dumpable = 1
kernel.msgmni = 1024
kernel.sem = 250 256000 32 1024

我现在尝试改变一个或多个 sysctl!,并希望一些好心人可能以前见过这个,提前感谢任何帮助。

答案1

我回来这里是为了回答我自己的问题!

这个问题是由于你有多台 CPU(不是多核)导致的,例如 2 个 CPU,每个都有 x 个核心

vm.zone_reclaim_mode=0

修复了这个问题。

答案2

我不确定这里是否存在问题。您是否遇到过其他问题,例如磁盘 IO 过高?

大多数软件并非设计为消耗所有内存,因为它可以。您没有提到您正在使用哪种 Web 服务器软件,但大多数 Web 服务器软件都有内部算法,用于在对象请求频率不够高时从缓存中清除对象。它们还具有可配置机制,用于控制它们在服务器上消耗的资源量。

假设你正在使用 Apache,性能调优部分Apache 文档中有一节关于调整 MaxRequestWorkers 的部分:

您可以(也应该)控制 MaxRequestWorkers 设置,这样您的服务器就不会生成太多子进程,从而开始进行交换。执行此操作的过程很简单:通过 top 等工具查看进程列表,确定平均 Apache 进程的大小,并将其除以总可用内存,为其他进程留出一些空间。

如果您正在使用 Apache 并且已经这样做了,那么很可能您收到的请求数量不足以让 Apache 维持所有这些工作进程。也可能是因为您对工作进程数量的估计太低,您可以增加 MaxRequestWorkers 以尝试让 Apache 生成更多工作进程。

除非您遇到其他问题,否则听起来没什么问题。但无论如何,这可能是 Web 服务器软件配置问题,而不是 sysctl 问题。

答案3

任何未用于程序的 RAM 都用作磁盘缓存。因此,理论上,所有 RAM 都得到了使用。这里有一个很好的解释:http://www.linuxatemyram.com/

相关内容