SWAP的罪与罚

标签: Technical Linux SWAP | 发表时间:2012-11-08 15:41 | 作者:老王
出处:http://huoding.com

说个案例:一台Apache服务器,由于其MaxClients参数设置过大,并且恰好又碰到访问量激增,结果内存被耗光,从而引发SWAP,进而负载攀升,最终导致宕机。

正所谓:SWAP,性能之大事,死生之地,存亡之道,不可不察也。

哪些工具可以监测SWAP

最容易想到的就是free命令了,它指明了当前SWAP的使用情况:

shell> free -m
             total       used       free     shared    buffers     cached
Mem:         32178      32075        103          0        298       7032
-/+ buffers/cache:      24744       7433
Swap:        34175      11374      22801

另一个常用的是sar命令,它能列出系统在各个时间的SWAP使用情况:

shell> sar -r
01:00:01 AM kbmemfree kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
01:00:01 AM    164112  32786496     99.50    274340   7347520  23345644  11650572     33.29   4656908
01:10:01 AM    106940  32843668     99.68    278612   7409376  23346452  11649764     33.29   4656216
01:20:01 AM     93244  32857364     99.72    317368   7369564  23346556  11649660     33.29   4650308
01:30:01 AM    126316  32824292     99.62    320896   7401228  23346932  11649284     33.29   4649888
01:40:01 AM    126824  32823784     99.62    323692   7365428  23346992  11649224     33.29   4648848

不过free命令和sar命令显示的都不是实时数据,如果需要,可以使用vmstat命令:

shell> 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
 2  0 11647532 123664 305064 7193168    0    0     6   155    0     0  8  2 90  0  0
 0  0 11647532 123672 305064 7193172    0    0    12     0 6626 14699  6  2 92  0  0
 0  0 11647532 125728 305064 7193468    0    0    12     0 6717 13706  5  2 93  0  0
 2  0 11647532 125376 305064 7193476    0    0    24     0 6830 15961  7  2 91  0  0
 1  0 11647532 124508 305068 7193624    0    0     0  1164 6645 13363  6  2 92  0  0

每秒刷新一次结果,在SWAP一栏里列出了相关数据,至于si和so的解释,大致如下:

  • si: Amount of memory swapped in from disk (/s).
  • so: Amount of memory swapped to disk (/s).

如果它们一直是零当然最好不过了,偶尔不为零也没啥,糟糕的是一直不为零。

前面介绍的方法,看到的都是SWAP的整体情况,可是如果我想查看到底是哪些进程使用了SWAP,应该如何操作呢?这个问题有点棘手,我们来研究一下:

好消息是top命令能提供这个信息,不过缺省并没有显示,我们需要激活一下:

  1. 打开top;
  2. 按「f」进入选择字段的界面;
  3. 按「p」选择「SWAP」字段;
  4. 按回车确认。

坏消息是top命令提供的SWAP信息只是一个理论值,或者更直白一点儿来说它根本就是不可信的(在top里SWAP的计算公式是:SWAP=VIRT-RES)。

BTW:相比之下,top里的「nFLT」字段更有价值,它表示 PageFault的次数。

那到底我们能不能获取到进程的SWAP情况呢?别着急,看代码:

#!/bin/bash

cd /proc

for pid in [0-9]*; do
    command=$(cat /proc/$pid/cmdline)

    swap=$(
        awk '
            BEGIN  { total = 0 }
            /Swap/ { total += $2 }
            END    { print total }
        ' /proc/$pid/smaps
    )

    if (( $swap > 0 )); then
        if [[ "${head}" != "yes" ]]; then
            echo -e "PID\tSWAP\tCOMMAND"
            head="yes"
        fi

        echo -e "${pid}\t${swap}\t${command}"
    fi
done

说明:请使用root权限来运行此脚本。

哪些因素可能影响SWAP

内存不足无疑会SWAP,但有些时候,即便看上去内存很充裕,还可能会SWAP,这种现象被称为 SWAP Insanity,罪魁祸首主要有以下几点:

Swappiness的迷失

实际上,当可用内存不足时,系统有两个选择:一个是通过SWAP来释放内存,另一个是删除Cache中的Page来释放内存。一个很常见的例子是:当拷贝大文件的时候,时常会发生SWAP现象。这是因为拷贝文件的时候,系统会把文件内容在Cache中按Page来缓存,此时一旦可用内存不足,系统便会倾向于通过SWAP来释放内存。

内核中的swappiness参数可以用来控制这种行为,缺省情况下,swappiness的值是60:

shell> sysctl -a | grep swappiness
vm.swappiness = 60

它的含义是:如果系统需要内存,有百分之六十的概率执行SWAP。知道了这一点,我们很自然的会想到用下面的方法来降低执行SWAP的概率:

shell> echo "vm.swappiness = 0" >> /etc/sysctl.conf
shell> sysctl -p

这样做的确可以降低执行SWAP的概率,但并不意味着永远不会执行SWAP。

NUMA的诅咒

NUMAMySQL社区有很多讨论,这里不多说了,直击NUMA和SWAP的恩怨纠葛。

大概了解一下NUMA最核心的numactl命令:

shell> numactl --hardware
available: 2 nodes (0-1)
node 0 size: 16131 MB
node 0 free: 100 MB
node 1 size: 16160 MB
node 1 free: 10 MB
node distances:
node   0   1
  0:  10  20
  1:  20  10

可以看到系统有两个节点(其实就是两个物理CPU),它们各自分了16G内存,其中零号节点还剩100M内存,一号节点还剩10M内存。设想启动了一个需要11M内存的进程,系统把它分给了一号节点来执行,此时虽然系统总体的可用内存大于该进程需要的内存,但因为一号节点本身剩余的可用内存不足,所以仍然可能会触发SWAP行为。

需要说明的一点事,numactl命令中看到的各节点剩余内存中时不包括Cache内存的,实际上Cache也是可用的,如果需要知道,我们可以利用 drop_caches参数先释放它:

shell> sysctl vm.drop_caches=1

注:这步操作可能会引起系统负载的震荡。

另:如何确定一个进程的节点及内存分配情况?网络上有现成的 脚本

如果要规避NUMA对SWAP的影响,最简单的方法就是在启动进程的时候禁用它:

shell> echo 0 > /proc/sys/vm/zone_reclaim_mode
shell> numactl --interleave=all ...

另:网络上有一些关于MySQL和SWAP的讨论,对于理解SWAP有一定意义,推荐:

补:Memcached在启动的时候如果带上了k选项,就能避免使用SWAP,但要慎用。

早些年,YouTube曾经被SWAP问题困扰过,他们当时的解决方法很极端:删除SWAP!不得不说这真是艺高人胆大,可惜对芸芸众生的我们而言,这实在是太危险了,因为如此一来,一旦内存耗尽,由于没有SWAP的缓冲,系统会立即开始 OOM,结果可能会让问题变得更加复杂,所以大家还是安分守己做个老实人吧。

相关 [swap 罪与罚] 推荐:

SWAP的罪与罚

- - 火丁笔记
说个案例:一台Apache服务器,由于其MaxClients参数设置过大,并且恰好又碰到访问量激增,结果内存被耗光,从而引发SWAP,进而负载攀升,最终导致宕机. 正所谓:SWAP,性能之大事,死生之地,存亡之道,不可不察也. 最容易想到的就是free命令了,它指明了当前SWAP的使用情况:. 另一个常用的是sar命令,它能列出系统在各个时间的SWAP使用情况:.

NUMA 架构中 MySQL 的 “swap insanity” 问题

- khsing - [email protected]
翻译:王鑫、朱翊然、李凯、曾怀东、马少兵、林业. 在一台包括了2个4核CPU,64GB内存的服务器上,给 MySQL 配置了 48GB 之巨的 InnoDB 缓冲,随着时间的推移,尽管观察到的数据(见最后注1)表示并没有真正的内存压力,Linux 也会把大量的内存交换到磁盘上. 通过监控发现,配置的内存超过了实际所需,而且也不存在内存泄漏,mysqld的RSS占用正常且稳定.

[原]性能优化:Swap调优

- - tenfyguo的技术专栏
目标:解决大量Log写入占用大量的File Cache,内容利用不充分导致swap. 基本原则: 尽量使用内存,减少swap,同时,尽早flush到外存,早点释放内存给写cache使用. ---特别在持续的写入操作中,此优化非常有效. vm.swapiness :60 改成 10. vm.dirty_ratio:90 改成 10.

系统性能监控之 Swap Space

- - Darktea
对线上服务器进行性能监控时, 需要关注各种性能指标, 从各个方面来对系统性能进行监控. 例如, 系统负载, cpu 占用, 内存占用, 网络带宽等. 其中 Swap Space 的使用状况也是值得关注的一项, 本文对在 Linux 环境中监控 Swap Space 的相关内容进行了总结.. 一, 首先简单的介绍一下什么是 Swap Space.

SwAp Rebel 也跟着潮流,推出新一代手机腕表

- David Z - Engadget 中国版
售价约 300 美金,1900元人民币左右,官网 有更多图片. 引用来源 | 此文章网址 | 转寄此文章 | 回应.

Swap对响应时间敏感应用的影响

- - 互联网 - ITeye博客
源:http://blog.hesey.net/2014/05/swap-impact-on-rt-sensitive-apps.html. 最近排查的一个线上应用load高的问题,和GC以及Swap有关系. 现象是机器load突然升高,查看占用CPU的线程发现是JVM自己的线程. jstat发现一个奇怪的现象,Eden Gen到了100%之后会持续好几秒,但Old Gen没有明显增大,说明并不是Eden Gen不够用promote到Old Gen了,感觉似乎是Young GC出了问题.

找到MySQL服务器发生SWAP罪魁祸首

- - iMySQL
MySQL数据库服务器发生SWAP相信很多人都遇到过,如何找出元凶,又如何应对呢. 在昨晚的知数堂公开课中,其实用的就是本次的案例. 本次公开课的PPT、视频已上传到百度云盘,链接: https://pan.baidu.com/s/1eR53Qd8,欢迎转存及转发(扫描下方二维码识别). 知数堂培训全新MySQL DBA课程第九期和Python运维开发班第三期正在招生中,扫描下方二维码加入QQ群 529671799 (加群暗号:知数堂) 获得最新信息.

Linux性能:为什么你应该添加交换空间swap

- - myfreax
我们知道使用Linux交换空间而不是 RAM(内存)会严重降低性能. 那么,有人可能会问,既然我有足够多的可用内存,删除交换空间不是更好吗. 启用交换空间会带来性能优势,即使您有足够多的内存. 即使安装了足够多的服务器内存,您也会经常发现在长时间正常运行后会使用交换空间. 请参阅以下来自具有大约一个月正常运行时间的实时聊天服务器的示例:.

余额宝的“罪与罚”:或被套上”紧箍咒“

- - 创业邦
        余额宝被央视钮文新评论为”吸血鬼“,虽然其非是基金行业的人员,不过,钮文新央视背景引发注意,外界猜测类余额宝产品会受到更严格监管.   一向顺风顺水且快速做大的余额宝最近遭遇烦恼. 最近央视证券资讯频道执行总编辑兼首席新闻评论员钮文新猛烈抨击余额宝. 钮文新称,余额宝冲击的是整个中国经济安全,应该取缔,他还将余额宝贴上标签:是趴在银行身上的“吸血鬼”,典型“金融寄生虫”.

MySQL如何避免使用Linux的swap分区而提升读写性能

- timo - 服务器运维与网站架构|Linux运维|互联网研究
Linux有很多很好的内存、IO调度机制,但是并不会适用于所有场景. 对于DBA来说Linux比较让人头疼的一个地方是,它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上. 对于频繁进行读写操作的系统而言,数据看似在内存而实际上在磁盘是非常糟糕的,响应时间的增长很可能直接拖垮整个系统.