我是否应该担心在具有近40GB可用内存的主机上使用了swap?


39

我有一个生产主机,如下:

停止

该系统使用1GB的交换空间,同时保留近40GB的未使用的可用内存空间。我应该担心这一点,还是大多数情况下正常?


23
实际上,您应该担心实际负载浪费将近40GB内存的生产主机。当然,它可以找到某种用途来放置该内存-应用程序正在访问磁盘,难道它不能使用该内存来缓存某些数据,减少I / O并提高其性能吗?为什么40GB的内存浪费在正在运行的计算机上?那就是你应该关心的。那不正常。
David Schwartz

25
如果您向我们展示的输出,它确实会更有用free -m。图形很难阅读。
user9517支持GoFundMonica

@DavidSchwartz-我有一个与此相关的问题仍然很活跃。serverfault.com/questions/825909/…–
MrDuk

Answers:


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

忽略第一行,因为这是系统启动以来的活动。注意下的siso---swap--;他们通常应该是相当小的数字,即使在大多数情况下不为0。

还值得一提的是,可以通过内核设置来控制这种抢占式交换。位于的文件/proc/sys/vm/swappiness包含0到100之间的数字,它告诉内核如何积极地换出内存。整理文件以查看其设置。默认情况下,大多数Linux发行版默认将其设置为60,但是如果在内存耗尽之前不想看到任何交换,请在文件中回显0,如下所示:

echo 0 >/proc/sys/vm/swappiness

可以通过添加使其成为永久性

vm.swappiness = 0

/etc/sysctl.conf


14
还值得一提的是,可以通过内核设置来控制这种抢占式交换。/ proc / sys / vm / swappiness中的文件包含一个介于0到100之间的数字,它告诉内核如何积极地换出内存。整理文件以查看其设置。默认情况下,大多数Linux发行版默认将其设置为60,但是如果您不希望在内存耗尽之前看到任何交换,请在文件中回显一个0,如下所示:echo 0 >/proc/sys/vm/swappiness。可以通过添加vm.swappiness = 0到/etc/sysctl.conf 使其永久化。
virtex

@virtex:我喜欢在桌面上使用swappiness = 1或不到10的东西。大多数时候,这在服务器上也可能做得很好。强烈建议不要进行交换以释放RAM以获得更多页面缓存,而不完全禁止它。
彼得·科德斯

1
@PeterCordes照顾服务器,尤其是那些访问数据库或提供文件的服务器。这些可能会从可用于文件高速缓存的内存中受益匪浅。
乔纳斯·谢弗

4
@JonasWielicki:即使有swappiness=7什么用,长期未使用的页面也会被替换掉。swappiness=0与其他任何值之间甚至是较低的值之间都存在很大差异。缺省情况下,内核默认swappiness=60值通常对服务器有用,并且仅在交换性低的桌面交互式使用中才有用。但是将其设置为7或类似的东西应该不会有太大的伤害。(但是我没有检查,我不是服务器sysadmin)。
彼得·科德斯

2
@PeterCordes在施加内存压力之前,任何swappiness工作都很好。承受着巨大的压力,您将看到swappiness=7文件缓存几乎完全饿了很长时间,同时swappiness=60清理了很多缓存,但也开始在几秒钟内换出文件。仍然是高速缓存在击败,但是以一种更加平衡的方式。
kubanczyk

25

如果没有更好的事情,Linux将抢先将页面写到磁盘上。但这并不意味着它就会收回从内存中这些网页,但。这只是在情况下,它必须在未来某个时候驱逐那些页面,它并不需要等待它们被写入磁盘,因为他们已经在那里。

毕竟,内存不足的原因可能是因为您的计算机已经在努力工作,所以您不想为交换增加负担。机器什么都不做时最好进行交换。

由于类似的原因,您的内存应该总是装满的。内存页面,文件系统缓存等tmpfs,可以在内存中保存很多东西。确实,您应该担心内存是否为空。毕竟,您为此付出了很多钱(至少与同等数量的磁盘空间相比),因此最好使用它!


Jorg,内核抢先写入磁盘的页面不是交换页面,而是脏磁盘缓存页面。vm.dirty_background _...可调参数对此进行控制。换出活动根据可调性开始,并且不等待空闲时间。
卢卡斯

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

交换完全没有问题。在列非零个值,并因此是致命的服务器性能。特别是具有大量RAM的内存。

最好在具有数GB RAM的计算机上禁用交换性:

sysctl -w vm.swappiness=0

这不会禁用交换。它只会指示Linux使用交换作为最后的手段。这将浪费一些MB的程序,这些程序不需要在RAM中...但是最好是交换大量的磁盘访问队列。

编辑1:为什么默认交换值不是最佳的

我们要记得二十年前,一个大的486只有32Mb RAM。当整个RAM可以在短短的几分之一秒内移动到磁盘时,就开发了交换算法。即使当时的磁盘速度较慢。这就是默认交换策略如此激进的原因。内存是那些日子的瓶颈。从那时起,RAM的大小增加了10,000倍以上,磁盘速度也增加了10倍以下。这将瓶颈转移到磁盘带宽上。

编辑2:为什么这样的活动对服务器来说是致命的?

因此与吨的RAM机活动是致命的,因为手段的系统与自身奋斗的RAM。发生的事情是,与RAM相比,磁盘甚至大型存储都太慢了。主动交换倾向于使用内核磁盘缓存而不是应用程序数据,并且是争夺RAM的最常见来源。由于操作系统将必须释放每个si上的磁盘缓存,因此交换所提供的额外缓存的生存时间太短而无法使用。结果是您占用了磁盘带宽来存储可能不会使用的缓存,并暂停了等待si页的程序。这意味着消耗大量关键资源,而对应用程序几乎没有好处。

注意响应的标题“具有大量RAM的服务器上的大量交换活动”。这不适用于具有si等活动的机器。如果操作系统中开发了更智能的交换算法,则将来可能不适用。

编辑3:“冷”页面

人们将交换算法浪漫化。有人说“占用较少的RAM页面”,但这根本不是内核要做的。关于交换的事情很难理解,因为内核不知道什么是“冷页”。内核没有很好的指标来确定页面是否已被使用或在不久的将来可能会被使用。为了避免内核将页面或多或少地随机放置在交换中,不需要的页面保留在那里。该算法的问题是页面需要转到交换区以了解应用程序是否需要它们。这意味着很多“热门”页面将进入交换。问题在于,与RAM相比,磁盘太慢了。

我建立了自己的基准,这是许多应用程序都非常常见的现实情况。从我的测试中,我发现使用交换时在吞吐量或延迟方面没有任何好处。离得很远。交换开始时,它将吞吐量和延迟都降低了至少一个数量级。

我对此做进一步介绍:我知道交换不用于处理。掉期仅用于紧急情况。那些时刻,同时有太多的应用程序在运行,您会遇到内存高峰。如果不进行交换,将导致内存不足错误。我认为交换使用是开发和生产团队的失败。这只是超越我们在此讨论的观点,而是我的想法。当然,我的应用程序本身具有出色的内存管理。


9
“最好禁用交换性”最好,为什么呢?(最好,出于什么目的?)默认值可能并不适合所有用途,但我仍然需要更改它的理由。
jpaugh

3
如何是si更致命的到你的服务器比bi?两者都意味着某些程序正在等待4096字节从磁盘读取到内存。该bi是从任何文件,并si从文件中的一个特定的窄类别(但他们的字节移动一样快过完全相同的路径)。
kubanczyk

2
带有128MB内存的486很少见,被认为是大型机或超级计算机-因此CPU不可能是486。我的旧486具有4MB的RAM,我羡慕我朋友的机器有16MB的RAM(大型服务器)具有16到32 MB的RAM)。快进奔腾,我们开始看到8到16 MB是正常的。当Pentium3首次出现时(CPU正常启动时超过1GHz)为32MB,而Web服务器通常为64至128MB。
slebetman '17

swappiness=0似乎完全不适合服务器。您可能会考虑将其用于交互式桌面系统(但即使这样,swappiness=1还是最终换出真正冷的页面的更好选择)。查看对另一个答案的评论swappiness=7否则某些操作将显着减少交换活动,而无需在OOM之前将冷页固定到RAM中,而如果您认为60对于特定服务器来说太过交换了,则值得考虑。
彼得·科德斯

1
@kubanczyk:我认为sibi。大多数服务器软件的设计均基于以下假设:来自磁盘的I / O可能很慢,并且在等待I / O时通常使用线程,异步I / O或其他某种技术来保持响应。页面错误可能在任何地方发生。在最坏的情况下,执行锁定后可能会发生缓慢的页面错误,从而阻止所有其他线程进入该临界区约10ms(在慢速旋转存储上进行交换)。如果关键部分将数据从共享数据结构复制到潜在的冷页,这可能是合理的。
彼得·科德斯

8

这不是您问题的答案;而是提供了更多信息来帮助您做出明智的决定。

如果您想知道哪些进程专门在使用多少交换,请使用以下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"

我还应该补充一点,tmpfs也将换出。这在使用systemd的现代linux系统上更为常见,后者使用tmpfs创建用户空间/ tmp覆盖。


不错的脚本。也来看看smem。
user9517支持GoFundMonica

我想你可以写了很多更有效(少叉进程)awk '/Swap/ {sw += $2} FNR==1 { /*first line of a new file */ find the command somehow, maybe still fork/exec ps;} END { print totals }' /proc/[0-9]*/smaps。这会为每个进程运行cut和ps,并为系统中的每个进程运行grep + awk几次。
彼得·科德斯

0

我注意到代理进行大量交换时,MySQL Cluster复制会变慢或失败。也许某些应用程序不介意,甚至可能从某些交换中受益,但数据库似乎确实遭受了它的折磨。但是,我在论坛上看到的许多讨论都讨论了从特定工作负载讨论中脱上下文而来的交换。

在DBA世界中,共识似乎是“常识是,当您运行MySQL(或实际上是任何其他DBMS)时,您不希望在交换空间中看到任何I / O。缩放缓存大小(使用在MySQL的情况下为innodb_buffer_pool_size)是一种标准做法,可确保有足够的可用内存,因此不需要交换。

但是,如果您犯了一些错误或计算错误,并且发生交换,该怎么办?它实际上对性能有多大影响?这正是我要调查的内容。”

希望读者能从以下内容找到合适的链接。

https://www.percona.com/blog/2017/01/13/impact-of-swapping-on-mysql-performance/

https://www.percona.com/blog/2010/01/18/why-swapping-is-bad-for-mysql-performance/


1
欢迎来到服务器故障!尽管从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Frederik Nielsen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.