Linux - Swap

swap简介

swap是啥

首先,swap是硬盘上的一块空间。

其次,当内存没有多余空间的时候,可以将一部分数据交换到swap空间。也就是将内存中的一部分数据放到硬盘中,并释放内存空间。这样,释放出的内存空间就又可以被利用来存储其他数据了。

这样,本来只有4G的内存,如果swap有2G的话,可使用的内存可以认为是6G。

但是,硬盘的速度比内存慢太多太多了。因此swap只是对内存的一种补充,是在内存不足时对内存的扩充,但是不能代替内存使用。

swap与内存的交换策略

内存不足时,操作系统会选择最久没被使用的内存数据,交换到swap空间。

注意,交换操作是由操作系统来进行的。

什么时候使用swap

系统在什么情况或条件下才会使用Swap分区的空间呢? 其实是Linux通过一个参数swappiness来控制的。当然还涉及到复杂的算法。

这个参数值可为 0-100,控制系统 swap 的使用程度。

0告诉内核尽可能的不要将内存数据移到swap中,也即只有在迫不得已的情况下才这么做,而100告诉内核只要有可能,尽量的将内存中不常访问的数据移到swap中。默认值为 60。注意:这个只是一个权值,不是一个百分比值,涉及到系统内核复杂的算法

查看当前系统中swappiness的值

cat /proc/sys/vm/swappiness

修改当前系统中swappiness的值

sudo sysctl vm.swappiness=10

上面通过sysctl修改的swappiness值在系统重启后会失效,要想重启后继续生效,需要修改配置文件/etc/sysctl.conf,将下面这行修改成10,如果文件中找不到这行的话,在文件末位加上这行就可以了

vm.swappiness=10

swap设置

swap大小

既然配置swap对桌面系统有帮助,那么配置多少大小的swap比较合适呢?下面是ubuntu给出的建议:

  • 当物理内存小于1G且不需要休眠时,设置和内存同样大小的swap空间即可;当需要休眠时,建议配置两倍物理内存的大小,但最大值不要超过两倍内存大小
  • 当物理内存大于1G且不需要休眠时,建议大小为round(sqrt(RAM)),其中RAM为物理内存大小;当需要休眠时,建议大小是RAM+round(sqrt(RAM)),但最大值不要超过两倍内存大小
  • 如果两倍物理内存大小的swap空间还不够用,建议增加内存而不是增加swap

开启/关闭swap

Linux下有两种类型的swap空间,swap分区和swap文件,他们有各自的特点:

swap分区上面由于没有文件系统,所以相当于内核直接访问连续的磁盘空间,效率相对要高点,但由于swap分区一般安装系统时就分配好了了,后期要缩减空间和扩容都很不方便。

swap文件放在指定分区的文件系统里面,所以有可能受文件系统性能的影响,但据说2.6版本以后的内核可以直接访问swap文件对应的物理磁盘地址,相当于跳过了文件系统直接访问磁盘,不过如果swap文件在磁盘上的物理位置不连续时,还是会对性能产生不利影响,但其优点就是灵活,随时可以增加和移除swap文件。

查看系统中已经配置的swap

dev@dev:~$ swapon -s
Filename                Type        Size    Used    Priority
/dev/dm-1               partition   524284  0       -1

#注:如果没有任何输出的话,说明没有swap

如果配置有多个swap分区或者文件的话,这里将会有多行,每行代表一个正在被系统使用的swap分区或文件,下面是每个字段的意思:

  • Filename:如果swap类型是分区,这里将是分区的路径,如果swap类型是文件,这里将是文件的路径
  • Type:swap的类型,partition代表这是一个swap分区,file代表这是一个swap文件
  • Size:swap的大小,单位是k,这里524284表示的差不多是512M
  • Used:已经被使用的大小,这里0表示还没有被使用到
  • Priority:优先级,优先级高的swap将会被优先使用,同等优先级的swap将会被均匀的使用(round-robin算法),优先级可以通过“swapon -p”命令来设置

查看系统中swap in/out的情况

并不是swap空间占用多就一定性能下降,真正影响性能是swap in和out的频率,频率越高,对系统的性能影响越大,我们可以通过vmstat命令来查看swap in/out的频率

#参数2表示每两秒统计一次,si和so两列就是每秒swap in和out的次数
dev@ubuntu:~$ vmstat 2
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    70232 75620 7940 209476     0  0    0  0    111 180     0  1  99 0  0
 0 0    70232 75620 7940 209476     0  0    0  0    116 186     1  1  99 0  0
 0 0    70228 75620 7940 209476     2  0    2  0    120 193     1  1  98 1  0
 0 0    70228 75620 7940 209476     0  0    0  0    117 186     0  0  100 0 0
 0 0    70228 75620 7940 209476     0  0    0  0    113 184     0  1  99 0  0

添加swap分区

在添加swap分区前,首先得有一个空闲的分区,如果是一块新的磁盘,可以用fdisk来创建一个新的分区用于swap。

注意:磁盘分区操作一定要小心,弄不好就会造成数据丢失、系统挂掉的后果。磁盘分区操作不是本篇要介绍的内容,所以这里不会讨论fdisk怎么用。

#本篇使用的测试环境是虚拟机,/dev/sdb是一块新加的硬盘并且已经用fdisk创建好了一个分区
#本例中将使用/dev/sdb1这个分区
dev@dev:~$ sudo fdisk -l /dev/sdb
Device     Boot Start     End Sectors Size Id Type
/dev/sdb1        2048 4194303 4192256   2G 83 Linux

#创建swap分区
dev@dev:~$ sudo mkswap /dev/sdb1
Setting up swapspace version 1, size = 2 GiB (2146430976 bytes)
no label, UUID=d69621de-618a-4bea-9a96-b8e8b0d0ea40

#查看系统中现在正在使用的swap,以便于和添加后做比较
dev@dev:~$ swapon -s
Filename                Type        Size    Used    Priority
/dev/dm-1                               partition   524284  0   -1

#将新的分区加入到系统中
dev@dev:~$ sudo swapon /dev/sdb1

#这时候可以看到新的swap分区已经被加入到系统中了,并且优先级比原来的要低
dev@dev:~$ swapon -s
Filename                Type        Size    Used    Priority
/dev/dm-1               partition   524284  0       -1
/dev/sdb1               partition   2096124 0       -2

#为了保证系统重启后会自动加载我们新的swap分区,需要修改/etc/fstab文件
dev@dev:~$ sudo sh -c 'echo "/dev/sdb1 none  swap    sw   0    0" >> /etc/fstab'
#查看一下,确保写入成功,这里的第一条是原来的系统的swap分区,第二条是我们刚添加的
dev@dev:~$ grep swap /etc/fstab
/dev/mapper/dev--vg-swap_1 none            swap    sw              0       0
/dev/sdb1 none  swap    sw   0    0

添加swap文件

添加swap文件就简单多了,也没有分区操作那么有风险。

#先创建一个新的512M的文件,用来作为swap文件,文件路径可以随便
#fallocate这个命令依赖于文件系统,有些老的文件系统不支持这个命令,比如ext2,
#这种情况下可以用dd来实现同样的效果:
#sudo dd if=/dev/zero of=/mnt/512MiB.swap bs=1024 count=524288
#fallocate和dd的区别在于:
#fallocate是先声明这么多,然后在具体用到的时候文件系统才分配真正的物理磁盘空间,就是用一点分配一点,
#而dd是一开始就实实在在的写了512m的数据到物理磁盘空间。
#所以作为测试来说fallocate方便些,因为刚开始不用写任何数据,要快
dev@dev:~$ sudo fallocate -l 512m /mnt/512MiB.swap

#修改文件的权限,避免其他用户对这个文件进行误操作
dev@dev:~$ sudo chmod 600 /mnt/512MiB.swap

#格式化为swap文件
dev@dev:~$ sudo mkswap /mnt/512MiB.swap

#将新的文件加入到系统中
dev@dev:~$ sudo swapon /mnt/512MiB.swap

#这时候可以看到新的swap文件已经被加入到系统中了,类型为file
#这里可以看到由于优先级最高,第一个swap分区/dev/dm-1已经被使用了24K
dev@dev:~$ swapon -s
Filename                Type        Size    Used    Priority
/dev/dm-1               partition   524284  24      -1
/dev/sdb1               partition   2096124 0       -2
/mnt/512MiB.swap        file        524284  0       -3

#从free命令的输出可以看到,经过前面两轮添加swap分区和文件,
#现在系统的交换空间已经变成3G(3144692K)了
dev@dev:~$ free
              total        used        free      shared  buff/cache   available
Mem:         500192       39112        9564        1996      451516      430820
Swap:       3144692          24     3144668

#同样为了保证系统重启后会自动加载我们新的swap文件,需要修改/etc/fstab文件
dev@dev:~$ sudo sh -c 'echo "/mnt/512MiB.swap none  swap    sw   0    0" >> /etc/fstab'

关闭swap

#停掉所有系统正在使用的swap
dev@dev:~$ sudo swapoff -a

#swapon -s命令没有任何输出,free命令显示swap空间为0,说明swapoff成功
dev@dev:~$ swapon -s
dev@dev:~$ free
              total        used        free      shared  buff/cache   available
Mem:         500192       35924      348888        2004      115380      433924
Swap:             0           0           0

#当然我们还需要修改/etc/fstab,否则下次重启后,系统又会重新挂载相应的swap分区和文件
#使用自己喜欢的编辑器,将/etc/fstab中跟swap相关的三行删掉即可(本例中是三行,请根据实际情况调整)

如何查哪些进程使用了Swap

通过如下命令,能查看所有进程的使用swap情况

cat /proc/$(pid)/smaps

查看某个进程swap占用内存大小脚本:

grep "Swap" /proc/$pid/smaps | awk -F':' '{print $2}' | awk -F' ' 'BEGIN{sum=0}{if($1>0)sum+=$1} END{print sum}'

查看所有进程使用swap情况脚本:

pids=$(cd /proc; ls | grep "^[0-9]")
for pid in $pids;
do
    if [[ $pid -lt 100 ]];then
        continue
    fi
    echo -n "pid=$pid====="
    grep "Swap" /proc/$pid/smaps | awk -F':' '{print $2}' | awk -F' ' 'BEGIN{sum=0}{if($1>0)sum+=$1} END{print sum}'
done

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容