MrD*_*Duk 40 performance memory centos swap
我有一个生产主机,如下:
系统使用了 1GB 的交换空间,同时保持了近 40GB 的空闲、未使用的内存空间。我应该担心这个吗,或者这主要是正常的吗?
use*_*517 68
这不是问题,很可能是正常的。很少使用大量代码(可能还有数据),因此系统会将其换出以释放内存。
如果内存不断地换入和换出,交换通常只是一个问题。正是这种活动会降低性能并暗示系统其他地方存在问题。
如果您想监控您的交换活动,您可以使用多个实用程序,但vmstat通常非常有用,例如
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 348256 73540 274600 0 0 1 9 9 6 2 0 98 0 0
0 0 0 348240 73544 274620 0 0 0 16 28 26 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 29 33 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 21 23 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 24 26 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 23 23 0 0 100 0 0
Run Code Online (Sandbox Code Playgroud)
忽略第一行,因为这是系统启动以来的活动。请注意;下的si和so列 ---swap--如果大部分时间不是 0,它们通常应该是相当小的数字。
另外值得一提的是,这种抢占式交换可以通过内核设置进行控制。文件 at/proc/sys/vm/swappiness包含一个 0 到 100 之间的数字,它告诉内核换出内存的积极程度。Cat 文件以查看它的设置。默认情况下,大多数 Linux 发行版默认为 60,但如果您不想在内存耗尽之前看到任何交换,请将 0 回显到文件中,如下所示:
echo 0 >/proc/sys/vm/swappiness
Run Code Online (Sandbox Code Playgroud)
这可以通过添加永久化
vm.swappiness = 0
Run Code Online (Sandbox Code Playgroud)
到/etc/sysctl.conf。
Jör*_*tag 25
如果 Linux 无事可做,它会先发制人地将页面写入磁盘。但这并不意味着它就会收回从内存中这些网页,但。只是在将来某个时候它必须驱逐这些页面时,它不需要等待它们被写入磁盘,因为它们已经在那里了。
毕竟,您内存不足的原因可能是因为您的机器已经在努力工作,您不想通过交换给它带来额外的负担。最好在机器什么都不做时进行交换。
出于类似的原因,您的内存应该始终是满的。内存页面、文件系统缓存、tmpfs内存中可以保存的东西太多了。真的,你应该担心你的记忆是否是空的;毕竟,你为它付出了很多(至少与相同数量的磁盘空间相比),所以最好使用它!
小智 11
vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
6 0 521040 114564 6688 377308 8 13 639 173 0 1100 5 4 90 0
1 0 521040 114964 6688 377448 0 0 256 0 0 1826 3 4 94 0
0 0 521040 115956 6688 377448 0 0 0 0 0 1182 7 3 90 0
0 0 521036 115992 6688 377448 4 0 16 0 0 1154 10 2 88 0
3 0 521036 114628 6696 377640 0 0 928 224 0 1503 15 17 67 1
Run Code Online (Sandbox Code Playgroud)
列swapd完全没有问题。在列非零个值对,并因此是致命的服务器性能。特别是那些有大量内存的。
最好在具有几 GB 内存的机器上禁用交换:
sysctl -w vm.swappiness=0
Run Code Online (Sandbox Code Playgroud)
这不会禁用交换。它只会指示 Linux 使用交换作为最后的手段。这将浪费几 MB 不需要在 RAM 中的程序......但最好是交换膨胀你的磁盘访问队列。
我们必须记住二十年前,一个大的 486 只有 32Mb 的 RAM。当整个 RAM 可以在几分之一秒内移动到磁盘时,交换算法就被开发出来了。即使使用当时较慢的磁盘。这就是默认掉期政策如此激进的原因。RAM 是当时的瓶颈。从那时起,RAM 大小增加了 10,000 多倍,磁盘速度增加了不到 10 倍。这将瓶颈转移到磁盘带宽上。
硅和因此与吨的RAM机活动是致命的,因为手段的系统与自身奋斗的RAM。与 RAM 相比,磁盘,即使是大存储空间也太慢了。主动交换有利于内核磁盘缓存而不是应用程序数据,并且是争夺 RAM 的最常见来源。由于操作系统必须在每个si上释放磁盘缓存,因此交换提供的额外缓存的生存时间太短而无用。结果是您占用了磁盘带宽来存储可能不会使用的缓存并暂停您的程序以等待si页。这意味着消耗大量关键资源而对应用程序几乎没有好处或没有好处。
请注意响应的标题“具有大量 RAM 的服务器上的大量交换活动”。这不适用于偶尔有 si 等活动的机器。如果操作系统中开发了更智能的交换算法,这在未来可能不适用。
人们将交换算法浪漫化。有人说“它占用了较少使用的 RAM 页”,但这根本不是内核所做的。关于交换,很难理解的是内核不知道什么是“冷页”。内核没有一个很好的指标来确定页面是否被使用或可能在不久的将来被使用。为了避免内核或多或少随机地将页面放入交换中,并且不需要的页面留在那里。该算法的问题在于,页面需要进行交换才能知道应用程序是否需要它们。这意味着很多“热门”页面将被交换。问题是磁盘与 RAM 相比太慢了。
我构建了自己的基准测试,这是一个现实场景,对于许多具有体面量的应用程序来说非常常见。从我的测试中,我发现使用交换时吞吐量或延迟没有任何好处。离得很远。当交换开始时,它会使吞吐量和延迟至少降低一个数量级。
我更进一步:我知道交换不是用于处理的。掉期仅用于紧急情况。那些同时运行太多应用程序并且您会遇到内存峰值的时刻。如果没有交换,这将导致内存不足错误。我认为交换使用是开发和生产团队的失败。这只是一种超出我们在这里讨论的范围的意见,但就是我的想法。当然,我的应用程序本身具有出色的内存管理。
这不是您问题的答案;而是帮助您做出明智决定的额外信息。
如果您想知道哪些进程具体使用了多少交换,这里有一个小 shell 脚本:
#!/bin/bash
set -o posix
set -u
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"` ; do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
SUM=0
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` ; do
let SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"
let OVERALL=$OVERALL+$SUM
done
echo "Overall swap used: $OVERALL"
Run Code Online (Sandbox Code Playgroud)
我还应该补充一点,tmpfs 也会换掉。这在使用 systemd 的现代 linux 系统上更为常见,这些系统使用 tmpfs 创建用户空间 /tmp 覆盖。
| 归档时间: |
|
| 查看次数: |
9475 次 |
| 最近记录: |