MrDuk Asked: 2017-01-13 09:04:02 +0800 CST2017-01-13 09:04:02 +0800 CST 2017-01-13 09:04:02 +0800 CST 我是否应该担心在具有近 40GB 可用内存的主机上使用交换? 772 我有一个生产主机,如下: 系统使用 1GB 的交换空间,同时保持近 40GB 的空闲、未使用的内存空间。我应该担心这个,还是大部分正常? performance centos memory swap 5 个回答 Voted Best Answer user9517 2017-01-13T09:10:10+08:002017-01-13T09:10:10+08:00 这不是问题,很可能是正常的。很少使用大量代码(可能还有数据),因此系统会将其换出以释放内存。 如果内存不断地被换入和换出,则交换主要是一个问题。正是这种活动会破坏性能并在系统的其他地方提出问题。 如果你想监控你的交换活动,你可以使用几个实用程序,但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 忽略第一行,因为这是系统启动后的活动。注意;下的si和so列 ---swap--如果在大多数情况下不是 0,它们通常应该是相当小的数字。 另外值得一提的是,这种抢先交换可以通过内核设置来控制。该文件/proc/sys/vm/swappiness包含一个介于 0 和 100 之间的数字,它告诉内核如何积极地换出内存。Cat 文件以查看它的设置。默认情况下,大多数 Linux 发行版默认为 60,但如果您不想在内存耗尽之前看到任何交换,请将 0 回显到文件中,如下所示: echo 0 >/proc/sys/vm/swappiness 这可以通过添加永久化 vm.swappiness = 0 到/etc/sysctl.conf. Jörg W Mittag 2017-01-13T16:02:50+08:002017-01-13T16:02:50+08:00 如果没有更好的事情可做,Linux 会先发制人地将页面写入磁盘。不过,这并不意味着它会从内存中清除这些页面。只是万一它必须在将来某个时候驱逐这些页面,它不需要等待它们被写入磁盘,因为它们已经在那里了。 毕竟,您内存不足的原因可能是因为您的机器已经在努力工作,您不想额外增加交换的负担。最好在机器什么都不做的时候进行交换。 出于类似的原因,你的记忆应该永远是满的。内存页面,文件系统缓存,tmpfs有很多东西可以保存在内存中。真的,如果你的记忆是空的,你应该担心;毕竟,您为此付出了很多钱(至少与相同数量的磁盘空间相比),所以最好使用它! Lucas 2017-01-13T11:27:14+08:002017-01-13T11:27:14+08:00 使用的交换还不错,但是交换活动很多 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 swapd列完全没有问题。si列上的非零值对服务器性能是致命的。特别是那些有很多内存的。 最好在具有几 GB ram 的机器上禁用 swapinness: sysctl -w vm.swappiness=0 这不会禁用交换。它只会指示 Linux 使用交换作为最后的手段。这将浪费几 MB 不需要在 RAM 中的程序......但最好交换膨胀的磁盘访问队列。 编辑1:为什么swappiness的默认值不是最优的 我们必须记住二十年前的大型 486 只有 32Mb RAM。交换算法是在整个 RAM 可以在几分之一秒内移动到磁盘时开发的。即使使用当时较慢的磁盘。这就是为什么默认掉期政策如此激进的原因。那些日子RAM是瓶颈。从那时起,RAM 大小增加了 10,000 多倍,磁盘速度增加了不到 10 倍。这将瓶颈转移到磁盘带宽上。 编辑 2:为什么如此活动对服务器来说是致命的? 拥有大量 RAM 的机器上的Si等活动是致命的,因为这意味着系统正在与自己争夺 RAM。发生的情况是,与 RAM 相比,磁盘,即使是大存储也太慢了。积极交换有利于内核磁盘缓存而不是应用程序数据,并且是争夺 RAM 的最常见来源。由于操作系统必须在每个si上释放磁盘缓存,swap 提供的额外缓存的生存时间太短而无法使用。结果是您正在占用磁盘带宽来存储可能不会使用的缓存并暂停您的程序等待si页面。这意味着消耗大量关键资源,而对应用程序几乎没有好处。 请注意响应的标题“具有大量 RAM 的服务器上的大量交换活动”。这不适用于偶尔有 si 等活动的机器。如果在操作系统中开发了更智能的交换算法,这可能在未来不适用。 编辑 3:“冷”页面 人们将交换算法浪漫化。有人说“它占用较少使用的 RAM 页面”,但这根本不是内核所做的。交换的难点在于内核不知道什么是“冷页”。内核没有一个好的指标来确定页面是否被使用或可能在不久的将来被使用。为了避免内核或多或少随机地将页面放入交换中,并且不需要的页面保留在那里。该算法的问题是页面需要转到交换处才能知道应用程序是否需要它们。这意味着很多“热门”页面将进入交换区。问题是磁盘与 RAM 相比太慢了。 我构建了自己的基准测试,这是一个非常常见的现实场景,对于许多应用程序来说都很常见。从我的测试中,我发现使用交换时吞吐量或延迟没有任何好处。离得很远。当交换开始时,它会降低吞吐量和延迟至少一个数量级。 我对此更进一步:我理解交换不是用于处理的。掉期仅用于紧急情况。那些同时运行太多应用程序并且您会遇到内存峰值的时刻。如果没有交换,这将导致内存不足错误。我认为交换使用是开发和生产团队的失败。这只是一个超出我们在这里讨论的观点,但这是我的想法。当然,我的应用程序本身具有出色的内存管理。 Aaron 2017-01-13T10:09:26+08:002017-01-13T10:09:26+08:00 这不是您问题的答案;相反,只是额外的信息来帮助您做出明智的决定。 如果您想知道哪些进程具体使用了多少交换,这里有一个小 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 覆盖。 Ross Nesbitt 2017-03-25T07:13:28+08:002017-03-25T07:13:28+08:00 我注意到当代理大量交换时,MySQL 集群复制会减慢或失败。也许某些应用程序不介意,甚至可能从某些交换中受益,但数据库似乎确实受到了影响。然而,我在论坛上看到的许多讨论都讨论了从特定工作负载讨论中脱离上下文的交换。 在 DBA 世界中,共识似乎是“常识是,当您运行 MySQL(或实际上任何其他 DBMS)时,您不希望在交换空间中看到任何 I/O。缩放缓存大小(使用innodb_buffer_pool_size 在 MySQL 的情况下)是标准做法,以确保有足够的可用内存,因此不需要交换。 但是如果你犯了一些错误或错误计算,并且发生了交换怎么办?它对性能的真正影响有多大?这正是我着手调查的内容。" 我希望读者能找到以下链接。 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/
这不是问题,很可能是正常的。很少使用大量代码(可能还有数据),因此系统会将其换出以释放内存。
如果内存不断地被换入和换出,则交换主要是一个问题。正是这种活动会破坏性能并在系统的其他地方提出问题。
如果你想监控你的交换活动,你可以使用几个实用程序,但
vmstat
通常非常有用,例如忽略第一行,因为这是系统启动后的活动。注意;下的
si
和so
列---swap--
如果在大多数情况下不是 0,它们通常应该是相当小的数字。另外值得一提的是,这种抢先交换可以通过内核设置来控制。该文件
/proc/sys/vm/swappiness
包含一个介于 0 和 100 之间的数字,它告诉内核如何积极地换出内存。Cat 文件以查看它的设置。默认情况下,大多数 Linux 发行版默认为 60,但如果您不想在内存耗尽之前看到任何交换,请将 0 回显到文件中,如下所示:这可以通过添加永久化
到
/etc/sysctl.conf
.如果没有更好的事情可做,Linux 会先发制人地将页面写入磁盘。不过,这并不意味着它会从内存中清除这些页面。只是万一它必须在将来某个时候驱逐这些页面,它不需要等待它们被写入磁盘,因为它们已经在那里了。
毕竟,您内存不足的原因可能是因为您的机器已经在努力工作,您不想额外增加交换的负担。最好在机器什么都不做的时候进行交换。
出于类似的原因,你的记忆应该永远是满的。内存页面,文件系统缓存,
tmpfs
有很多东西可以保存在内存中。真的,如果你的记忆是空的,你应该担心;毕竟,您为此付出了很多钱(至少与相同数量的磁盘空间相比),所以最好使用它!使用的交换还不错,但是交换活动很多
swapd列完全没有问题。si列上的非零值对服务器性能是致命的。特别是那些有很多内存的。
最好在具有几 GB ram 的机器上禁用 swapinness:
这不会禁用交换。它只会指示 Linux 使用交换作为最后的手段。这将浪费几 MB 不需要在 RAM 中的程序......但最好交换膨胀的磁盘访问队列。
编辑1:为什么swappiness的默认值不是最优的
我们必须记住二十年前的大型 486 只有 32Mb RAM。交换算法是在整个 RAM 可以在几分之一秒内移动到磁盘时开发的。即使使用当时较慢的磁盘。这就是为什么默认掉期政策如此激进的原因。那些日子RAM是瓶颈。从那时起,RAM 大小增加了 10,000 多倍,磁盘速度增加了不到 10 倍。这将瓶颈转移到磁盘带宽上。
编辑 2:为什么如此活动对服务器来说是致命的?
拥有大量 RAM 的机器上的Si等活动是致命的,因为这意味着系统正在与自己争夺 RAM。发生的情况是,与 RAM 相比,磁盘,即使是大存储也太慢了。积极交换有利于内核磁盘缓存而不是应用程序数据,并且是争夺 RAM 的最常见来源。由于操作系统必须在每个si上释放磁盘缓存,swap 提供的额外缓存的生存时间太短而无法使用。结果是您正在占用磁盘带宽来存储可能不会使用的缓存并暂停您的程序等待si页面。这意味着消耗大量关键资源,而对应用程序几乎没有好处。
请注意响应的标题“具有大量 RAM 的服务器上的大量交换活动”。这不适用于偶尔有 si 等活动的机器。如果在操作系统中开发了更智能的交换算法,这可能在未来不适用。
编辑 3:“冷”页面
人们将交换算法浪漫化。有人说“它占用较少使用的 RAM 页面”,但这根本不是内核所做的。交换的难点在于内核不知道什么是“冷页”。内核没有一个好的指标来确定页面是否被使用或可能在不久的将来被使用。为了避免内核或多或少随机地将页面放入交换中,并且不需要的页面保留在那里。该算法的问题是页面需要转到交换处才能知道应用程序是否需要它们。这意味着很多“热门”页面将进入交换区。问题是磁盘与 RAM 相比太慢了。
我构建了自己的基准测试,这是一个非常常见的现实场景,对于许多应用程序来说都很常见。从我的测试中,我发现使用交换时吞吐量或延迟没有任何好处。离得很远。当交换开始时,它会降低吞吐量和延迟至少一个数量级。
我对此更进一步:我理解交换不是用于处理的。掉期仅用于紧急情况。那些同时运行太多应用程序并且您会遇到内存峰值的时刻。如果没有交换,这将导致内存不足错误。我认为交换使用是开发和生产团队的失败。这只是一个超出我们在这里讨论的观点,但这是我的想法。当然,我的应用程序本身具有出色的内存管理。
这不是您问题的答案;相反,只是额外的信息来帮助您做出明智的决定。
如果您想知道哪些进程具体使用了多少交换,这里有一个小 shell 脚本:
我还应该补充一点,tmpfs 也会换掉。这在使用 systemd 的现代 linux 系统上更为常见,这些系统使用 tmpfs 创建用户空间 /tmp 覆盖。
我注意到当代理大量交换时,MySQL 集群复制会减慢或失败。也许某些应用程序不介意,甚至可能从某些交换中受益,但数据库似乎确实受到了影响。然而,我在论坛上看到的许多讨论都讨论了从特定工作负载讨论中脱离上下文的交换。
在 DBA 世界中,共识似乎是“常识是,当您运行 MySQL(或实际上任何其他 DBMS)时,您不希望在交换空间中看到任何 I/O。缩放缓存大小(使用innodb_buffer_pool_size 在 MySQL 的情况下)是标准做法,以确保有足够的可用内存,因此不需要交换。
但是如果你犯了一些错误或错误计算,并且发生了交换怎么办?它对性能的真正影响有多大?这正是我着手调查的内容。"
我希望读者能找到以下链接。
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/