linux redhat 5.4 - 在内存仍然可用时进行交换

linux redhat 5.4 - 在内存仍然可用时进行交换

该服务器的交换使用了 100%(15G 交换磁盘),但仍然有 30G 可用,我一直在寻找但无法弄清楚为什么会发生这种情况,我的理解是如果内存仍然可用,就不要使用交换。

# 猫/proc/meminfo
内存总量:131937984 kB
可用内存:29649644 kB
缓冲区:347424 kB
缓存:55013896 kB
交换缓存:2180808 kB
活动:42065900 kB
不活动:15782332 kB
最高总计:0 kB
高可用:0 kB
低总计:131937984 kB
低免费:29649644 kB
交换总量:16779884 kB
可用交换空间:2165300 kB
脏:1908 kB
回写:0 kB
匿名页面:323104 kB
映射:31100628 kB
板坯:408604 kB
页表:1737344 kB
NFS_不稳定:0 kB
跳出率:0 kB
提交限制:61777356 kB
已提交:52238240 kB
Vmalloc总计:34359738367 kB
已使用 Vmalloc:382524 kB
VmallocChunk:34359355491 kB
大页面总数:20480
HugePages_Free:20480
HugePages_Rsvd:0
大页面大小:2048 kB


# 顶部
顶部 - 14:33:16 启动 27 天,21:25,7 个用户,平均负载:3.47、4.39、4.34
任务:总计 669 个,其中 2 个正在运行,661 个正在休眠,0 个已停止,6 个僵尸
CPU:7.6%us,1.5%sy,0.0%ni,90.2%id,0.6%wa,0.0%hi,0.1%si,0.0%st
内存:总计 131937984k,已用 101503048k,可用 30434936k,缓冲区 347544k
交换:总计 16779884k,已使用 14608832k,可用 2171052k,缓存 54216540k

# vmstat 1
进程 -----------内存---------- ---交换----- -----io---- --系统----- -----cpu------
 rb swpd 免费 buff 缓存 si so bi bo in cs us sy id wa st
 1 0 14608504 30438520 347560 54216984 1 1 503 262 0 0 8 2 90 1 0
 3 0 14608504 30439016 347560 54217024 0 0 88 403 1434 4884 0 0 99 0 0
 2 0 14608468 30439760 347560 54217060 0 0 10 588 2381 5297 7 1 93 0 0
 0 0 14608468 30439884 347560 54217060 0 0 0 76 1429 4768 5 0 94 0 0
 1 0 14608448 30440180 347560 54217048 32 0 66 230 3371 4872 4 1 95 0 0
 6 0 14608420 30440668 347560 54217076 32 0 42 320 2439 4860 6 1 93 0 0
 3 0 14608412 30441384 347560 54217116 0 0 58 520 2128 4899 6 1 93 0 0
 4 0 14608412 30441504 347560 54217116 0 0 0 58 1355 4477 11 1 88 0 0
 3 0 14608392 30441844 347560 54217012 128 0 158 16 1491 4374 13 1 86 0 0
 5 1 14608352 30441512 347560 54216924 160 0 296 640 2748 5279 15 2 83 0 0
 4 0 14608324 30442132 347564 54217112 32 0 90 502 2493 4878 13 1 86 0 0
 8 0 14608296 30437288 347568 54217204 0 0 8 724 2243 5185 12 1 86 0 0

# 猫/proc/sys/vm/swappiness
60

bash-3.2# grep ^[az] /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
内核.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
内核.msgmnb = 65536
内核.msgmax = 65536
内核.shmmax = 68719476736
内核.shmall = 4294967296
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.default.log_martians = 0
kernel.panic_on_oops = 1
内核恐慌 = 5
fs.aio 最大数量 = 399360
kernel.exec-shield = 0
内核.randomize_va_space = 0
vm.nr_hugepages = 20480
net.ipv4.tcp_keepalive_time 300

一个选项是将 swappiness 从 60 改为更低的数字

答案1

我有一台装有 CentOS 5 的 Sybase 服务器,它不会导致交换。诀窍是将交换设置为 0,并为操作系统留出足够的内存。该服务器有 16GB(10GB 用于 Sybase,6GB 用于操作系统和其他服务)。从较小的 Sybase 缓存开始,然后逐渐增加它。

[root@db2 ~]# tail -2 /etc/sysctl.conf 
# Set Swappiness
vm.swappiness = 0

答案2

您可能正在运行在进程内存中维护大量缓存的软件。当另一个需要大量内存的任务运行时,这些页面将被换出。内存只有在必要时才会换回,因此当另一个需要大量内存的任务完成后,会有大量空闲内存,而这些内存只有在必要时才会被填充。

答案3

一个朋友遇到了同样的问题。我假设你有一个多核系统。在这种情况下,Linux 会将总物理 RAM 划分为每个处理器(即,如果你有 4 核和 16 GB 的 RAM,它会为每个核保留 4 GB)。当某个处理器的所有可用 RAM 都用完后,它会继续使用交换空间,而不是从其他处理器获取可用 RAM。

让我联系他,看看他得到的具体解决方案是什么,也许这个答案可以同时指出正确的方向。

答案4

如果您有一个在 NUMA 系统上分配了大量内存的单个进程,则可能只让它拥有属于一个 NUMA 节点或某个节点的内存。

请阅读以下文章:

http://jcole.us/blog/archives/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/

底线是:如果你可以通过 numactl 来使用所有内存,那么可能会更好。

但是,告诉数据库使用 32G 中的 32G 似乎过于乐观,因为会产生很大的开销。特别是在 x86_64 上,页表将占用大量空间(可能 0.5 G?),系统的其他部分也需要一些空间。我认为 75% 左右是更好的设置。

相关内容