AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 825911
Accepted
MrDuk
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

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

htop

系统使用 1GB 的交换空间,同时保持近 40GB 的空闲、未使用的内存空间。我应该担心这个,还是大部分正常?

performance centos memory swap
  • 5 5 个回答
  • 9923 Views

5 个回答

  • Voted
  1. 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.

    • 68
  2. Jörg W Mittag
    2017-01-13T16:02:50+08:002017-01-13T16:02:50+08:00

    如果没有更好的事情可做,Linux 会先发制人地将页面写入磁盘。不过,这并不意味着它会从内存中清除这些页面。只是万一它必须在将来某个时候驱逐这些页面,它不需要等待它们被写入磁盘,因为它们已经在那里了。

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

    出于类似的原因,你的记忆应该永远是满的。内存页面,文件系统缓存,tmpfs有很多东西可以保存在内存中。真的,如果你的记忆是空的,你应该担心;毕竟,您为此付出了很多钱(至少与相同数量的磁盘空间相比),所以最好使用它!

    • 25
  3. 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 相比太慢了。

    我构建了自己的基准测试,这是一个非常常见的现实场景,对于许多应用程序来说都很常见。从我的测试中,我发现使用交换时吞吐量或延迟没有任何好处。离得很远。当交换开始时,它会降低吞吐量和延迟至少一个数量级。

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

    • 11
  4. 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 覆盖。

    • 8
  5. 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/

    • 0

相关问题

  • 基于 Microsoft 的服务器(IIS、MSSQL 等)上的病毒扫描应排除哪些内容?

  • jvm性能调优技巧/资源?

  • 加快 MSSQL 快照复制到 SQLExpress 副本的速度

  • 聚集索引与非聚集索引?

  • 使用大量 javascript 的页面上的鱿鱼速度很慢

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve