文档章节

SWAP的罪与罚

Jean
 Jean
发布于 2014/10/13 14:55
字数 1627
阅读 83
收藏 9

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

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

哪些工具可以监测SWAP

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

shell> free -m
             total       used       free
Swap:        34175      11374      22801

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

shell> sar -r
kbswpfree kbswpused  %swpused  kbswpcad
 23345644  11650572     33.29   4656908
 23346452  11649764     33.29   4656216
 23346556  11649660     33.29   4650308
 23346932  11649284     33.29   4649888
 23346992  11649224     33.29   4648848

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

shell> vmstat 1
-----------memory------------- ---swap--
  swpd   free   buff   cache     si   so
11647532 123664 305064 7193168    0    0
11647532 123672 305064 7193172    0    0
11647532 125728 305064 7193468    0    0
11647532 125376 305064 7193476    0    0
11647532 124508 305068 7193624    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内存的,如果需要知道,我们可以利用drop_caches参数先释放它:

shell> sysctl vm.drop_caches=1

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

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

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

shell> numactl --interleave=all ...

此外,内核参数zone_reclaim_mode通常也很重要,当某个节点可用内存不足时,如果为0的话,那么系统会倾向于从远程节点分配内存;如果为1的话,那么系统会倾向于从本地节点回收Cache内存。多数时候,Cache对性能很重要,所以0是一个更好的选择。

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

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

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

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

本文转载自:http://huoding.com/2012/11/08/198

上一篇: PHP之道
Jean
粉丝 12
博文 68
码字总数 11011
作品 0
浦东
部门经理
私信 提问
linux系统增加swap容量的方法

在安装linux系统时,初始设置的swap空间实际使用中不够用,需要增加swap空间; 下面所有的操作需要root用户权限; 增加swap容量步骤: 1、建立一个分区,使用dd命令 dd if=/dev/zero of=/ho...

模范生
2017/04/14
0
0
ubuntu设置swap区

如何添加swap? swap 一般都在一个专有的swap区里,这可能是因为在安装的时候系统会提示你创建一个swap区。但实际上任何文件都可以被用作swap(交换设备),无论是 一个分区或是一个简单的文件...

余二五
2017/11/22
0
0
实用技巧:为Linux系统手工添加SWAP空间

在SWAP空间不够用的情况下,如何手工添加SWAP空间 以下的操作都要在root用户下进行,首先先建立一个分区,采用dd命令比如 dd if=/dev/zero of=/home/swap bs=1024 count=512000 这样就会创建...

范堡
2009/05/24
170
0
新手看招 揭开Linux系统Swap交换区之谜

Swap,即交换区,除了安装Linux的时候,有多少人关心过它呢?其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。...

zt371
2009/05/07
360
0
谈一谈至关重要的Linux系统Swap交换区

Swap,即交换区,除了安装Linux的时候,有多少人关心过它呢?其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。...

zt371
2009/05/07
704
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
14分钟前
3
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
16分钟前
2
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部