swap

swap ,内存交换空间,它是磁盘上的一块空间,主要作用是为了防止物理内存不足。
CPU 从内存中读取数据。当内存的空间不足时, CPU 难以读取到数据,导致程序无法正常工作。所以诞生了 swap 内存交换空间,系统将内存中不常用的程序和数据放到 swap 中,从而给内存腾出空间,使得内存可以读取更多的数据,保证程序的顺利运行。

swap 构建

构建 swap 步骤:
1. 创建磁盘分区;
2. mkswap 构建 swap;
3. swapon 启动 swap;
 
1. 创建磁盘分区
fdisk 命令创一个新分区:
[root@test test]# fdisk /dev/sdb

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.
Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them.
Be careful before using the write command. Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (2-4, default 2):
No free sectors available
显示分区创建失败,No free sectors available.
 
使用 101 介绍的 LVM 方式创一个 LV test:
[root@test test]# lvdisplay | grep test
LV Path /dev/lianhuasheng/test
LV Name test
 
2. mkswap 构建 swap:
[root@test test]# free
total used free shared buff/cache available
Mem: 65692228 56611752 631264 56492 8449212 7650528
Swap: 0 0 0 [root@test test]# mkswap /dev/lianhuasheng/test
mkswap: /dev/lianhuasheng/test: warning: wiping old ext4 signature.
Setting up swapspace version 1, size = 204796 KiB
no label, UUID=2ed9b70d-b267-4c26-9159-1bfb273c7d7c [root@test test]# free
total used free shared buff/cache available
Mem: 65692228 56359176 1139968 56492 8193084 7902468
Swap: 0 0 0
这里,构建 swap 是不需要 mount point 的,因为是系统自动将内存数据写入 swap 中的。
 
3. swapon 启动 swap:
[root@test test]# free -h
total used free shared buff/cache available
Mem: 62G 54G 511M 55M 7.9G 7.0G
Swap: 0B 0B 0B
[root@test test]# swapon /dev/lianhuasheng/test
[root@test test]# free -h
total used free shared buff/cache available
Mem: 62G 54G 941M 55M 7.7G 7.2G
Swap: 199M 0B 199M
swap 构建成功。
 
如果系统没有配置 LVM 并且磁盘分区也分不了的话,可以使用 dd 命令构建一个文件,然后对此文件构建 swap:
[root@test lianhuasheng]# dd if=/dev/zero of=/root/lianhuasheng/swap/lianhuasheng.swap bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 0.356955 s, 1.5 GB/s [root@test swap]# ll -h lianhuasheng.swap
-rw-r--r--. 1 root root 512M Apr 1 00:12 lianhuasheng.swap [root@test swap]# mkswap lianhuasheng.swap
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=510ba316-c6e5-4993-b616-e72969cd6322 [root@test swap]# free -h
total used free shared buff/cache available
Mem: 62G 53G 663M 47M 8.0G 7.3G
Swap: 199M 199M 16K [root@test swap]# swapon lianhuasheng.swap swapon: /root/lianhuasheng/swap/lianhuasheng.swap: insecure permissions 0644, 0600 suggested.
[root@test swap]# free -h
total used free shared buff/cache available
Mem: 62G 54G 304M 47M 8.1G 7.1G
Swap: 711M 200M 511M
 
使用 swapoff 命令卸载 swap:
[root@test swap]# swapoff /dev/lianhuashengl/test
[root@test swap]# free -h
total used free shared buff/cache available
Mem: 62G 53G 761M 54M 8.0G 7.4G
Swap: 511M 511M 60K [root@test swap]# swapoff lianhuasheng.swap [root@test swap]# free -h
total used free shared buff/cache available
Mem: 62G 54G 888M 55M 7.6G 7.1G
Swap: 0B 0B 0B
 

磁盘性能

前面使用 dd 构建 swap 时,出现以下提示信息:
[root@test lianhuasheng]# dd if=/dev/zero of=/root/lianhuasheng/swap/lianhuasheng.swap bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 0.356955 s, 1.5 GB/s
 
有必要重点介绍这段,这是 dd 在写入文件到磁盘。
其中,/dev/zero 是伪设备,它会产生空字符流,不会有 IO,然后将空字符写到 of 指定的文件中,在这时会有 IO。所以这个命令可用来测试磁盘的写能力。即,上面打印信息的意思是每秒写入 1.5GB 的数据到磁盘中。
 
既然有测试磁盘写能力的,就有测试磁盘读能力的 dd。
/dev/null 可以被用来测试磁盘的读能力。它是一个回收站,文件放到这里不产生 IO。例如:
[root@test swap]# dd if=lianhuasheng.swap of=/dev/null bs=1M
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 1.07563 s, 499 MB/s
系统每秒读 499MB 的数据到 /dev/null 中,总共花了 1.07563s。
 
如果将 if 指定为磁盘,of 指定为文件,就可以测试磁盘的读写性能。例如:
[root@test swap]# dd if=/dev/sda2 of=disk bs=1K
^C2729809+0 records in
2729808+0 records out
2795323392 bytes (2.8 GB) copied, 11.4058 s, 245 MB/s
系统每秒从 sda2 中读写 245MB 数据到文件 disk 。
 
 
这里测试的磁盘读写性能都是有内存缓存的,即数据并不完全从磁盘中读写,也有部分数据是从内存中读写的。指定 dd 的 oflag 为 direct模式可在读数据的时候跳过内存缓存,指定 iflag 为 direct 模式将写请求封装成 I/O 指令直接发到磁盘,而非 direct 模式是把数据写入到系统缓存就认为 I/O 成功了。
 
测试磁盘纯读性能:
[root@test swap]# dd if=lianhuasheng.swap of=/dev/null bs=1M iflag=direct
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 1.7492 s, 307 MB/s
 
测试磁盘纯写性能:
[root@test swap]# dd if=/dev/zero of=lianhuasheng.swap bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.5872 s, 415 MB/s
 
测试磁盘纯读写性能:
[root@test swap]# dd if=/dev/sda2 of=disk bs=1K iflag=direct oflag=direct
^C328136+0 records in
328135+0 records out
336010240 bytes (336 MB) copied, 93.313 s, 3.6 MB/s
 
 
在使用 direct 模式之前,可先清除内存缓存:
sync && echo 3 > /proc/sys/vm/drop_caches
其中,命令 sync 用于数据同步。系统在写入数据到磁盘时,会先写到内存的 buffer 中。通过 sync 命令将 buffer 中的数据强制写入到磁盘中。
echo 3 表示清除内存中的页面缓存(page cache),目录项和 inode 节点。类似的还有 echo 1 表示清除页面缓存,echo 2 表示清除目录项和 inode。
 
清除内存缓存,测试文件的读性能:
[root@test swap]# free -h
total used free shared buff/cache available
Mem: 62G 56G 1.0G 55M 5.0G 4.8G
Swap: 0B 0B 0B [root@test swap]# sync && echo 3 > /proc/sys/vm/drop_caches [root@test swap]# free -h
total used free shared buff/cache available
Mem: 62G 54G 7.3G 55M 901M 7.2G
Swap: 0B 0B 0B [root@test swap]# dd if=lianhuasheng.swap of=/dev/null bs=1M iflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 3.54052 s, 303 MB/s [root@test swap]# dd if=lianhuasheng.swap of=/dev/null bs=1M iflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 3.49309 s, 307 MB/s
 
根据上面的测试结果给磁盘的读写速度排个序: 磁盘读写速度 > 磁盘纯读写速度 ~= 清除内存缓存的纯读写速度。
 
使用 dd 命令测试磁盘读写性能比较通用,但不专业。专业的测试磁盘工具是 hdparm , 它被用来测试磁盘的读取性能。例如:
[root@test test]# hdparm -t /dev/sda2

/dev/sda2:
Timing buffered disk reads: 1334 MB in 3.00 seconds = 444.43 MB/sec
[root@test test]# hdparm -T /dev/sda2 /dev/sda2:
Timing cached reads: 17748 MB in 2.00 seconds = 8888.37 MB/sec
 上面的命令中,-t 表示读取磁盘数据,-T 表示读取内存缓存数据。
 

内存和磁盘| buffer cache 和 page cache

测试磁盘性能的结果表明:数据读写到磁盘和读写到内存的速度是不一样的。
由于不同硬件的规格,性能的限制,导致硬件的读写速率不一样。数据读写到内存要比读写到磁盘快的多,如果数据直接在内存和磁盘间传输将会慢很多。
想象一下,内存要读 100M 数据,内存的读写速度是 100M/s,而磁盘的读写速度是 50M/s,这时候内存读取 100M 数据将花费 2s 的时间。因为数据传递是连续的,在硬盘向内存传递数据的过程中,内存是不能做其它事情的,只能等待,即原本内存 1s 就能读完的数据却要多花 1s 去等。同样的,在写数据到磁盘时,内存 1s 就能将数据传给磁盘,而磁盘却需要 2s 去写入,内存又要浪费 1s 去等待磁盘写入。因此,这种方式很不合理,为了改善这种情况,buffer cache 和 page cache 的概念就被引入进来。
 
buff cache:当内存写数据到磁盘时,一部分数据被放到内存中的 buffer cache 里,当系统空间或者 buffer cache 达到一定值时再写入到磁盘。这样内存就可以以很快的速度写数据到 buffer cache,磁盘也可以以较慢的速度从 buffer cache 中读数据。要注意,buffer cache 中的数据并不是即时的,并且缓存在 buffer cache 中的数据遇系统故障或者断电时很有可能会丢失,这时候执行 sync 命令就很有必要了,它会把 buffer cache 中的数据写入到磁盘。
page cache:当数据从磁盘读到内存时,一部分数据会被放到内存中的 page cache 里,这样内存就可以以很快的速度从 page cache 里读数据了,磁盘也可以以较慢的速度往 page cache 里写数据。
 
buff cache 和 page cache 的示意图如下所示:
注意,buff cache 和 page cache 是内存中的缓冲和缓存,它们和 CPU 内部的 L1/L2 cache 是不一样的!
 
使用 free 命令查看 buff 和 cache:
[root@test test]# free -wh
total used free shared buffers cache available
Mem: 31G 8.9G 10G 1.6G 326M 11G 20G
Swap: 511M 371M 140M
 
total 表示总内存;
used 表示已经使用的内存;
free 表示空间内存;
shared 表示进程间的共享内存;
buffers 表示 buffer 缓冲的内存;
cache 表示缓存的内存;
available 表示应用程序可以使用的内存,它包括缓存在内。
 
公式: total = used + free + buffers + cache。
 
 
如果进一步查看 free 的 man 文档会发现文档里有大量的 /proc/meminfo 字段,如:
buffers
Memory used by kernel buffers (Buffers in /proc/meminfo) cache
Memory used by the page cache and slabs (Cached and Slab in /proc/meminfo)
 
Liunx 中一切皆文件,/proc 是一个伪文件系统,它是内核状态和统计信息的接口,它有一个配置接口 /proc/sys,可指定一个值更改到该文件系统下的某个文件来修改内核的某个功能或配置。
有两种即时修改 /proc/sys 文件配置的方式:
1. sysctl: sysctl -w var=value,将内核参数 var 修改为给定值 value;
2. echo "value" > /proc/sys/.../...;将给定值 value 写入到文件 /proc/sys/.../... 中。
 
前面将值 3 写入到文件 /proc/sys/vm/drop_caches 就是用的第二种内核配置文件修改方式来实现清除内存缓存功能的。
 
 
 
(完)
 

每天学五分钟 Liunx 0001 | 存储篇:swap的更多相关文章

  1. 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange

    如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...

  2. 五分钟学Java:如何才能学好Java Web里这么多的技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  3. 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画

    原文:零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形 ...

  4. 《sed的流艺术之一》-linux命令五分钟系列之二十一

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  5. GC算法精解(五分钟让你彻底明白标记/清除算法)

    GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底 ...

  6. zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》

    本篇文章阅读时间5分钟左右 点击看<每日五分钟搞定大数据>完整思维导图   zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同 ...

  7. 「每日五分钟,玩转JVM」:线程共享区

    前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计 ...

  8. 五分钟搭建一个基于BERT的NER模型

    BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义.预训练的(pre-train)的语言模型通过无监督的学 ...

  9. Python专题——五分钟带你了解map、reduce和filter

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题第6篇文章,给大家介绍的是Python当中三个非常神奇的方法:map.reduce和filter. 不知道大家看到ma ...

  10. 一门能让你五分钟学会的语言-Brainfuck

    看到标题,不出意外的话,你肯定开始骂我了:**标题党,什么编程语言五分钟就能学会? 其实我本来也是不相信的,但是学过了才知道这是真的. 1.Brainfuck 看到这个小标题,不要误会,我没有骂人. ...

随机推荐

  1. 组合式api-跨层级组件通信provide和inject

    vue2的provide和inject:https://v2.cn.vuejs.org/v2/api/#provide-inject 主要作用: 跨层级传递数据(响应和非相应数据都可以).方法(函数) ...

  2. Java线程池ThreadPoolExecutor源码解析

    Java线程池ThreadPoolExecutor源码解析 1.ThreadPoolExecutor的构造实现 以jdk8为准,常说线程池有七大参数,通常而言,有四个参数是比较重要的 public T ...

  3. 【李南江】从零玩转TypeScript

    前言 老套路肯定是 需要知道TS是干啥用的啦. 1.什么是TypeScript(TS)? TypeScript简称TS TS和JS之间的关系其实就是Less/Sass和CSS之间的关系 就像Less/ ...

  4. cp {,bak}用法(转载)

    cp filename{,bak} cp filename{,.bak} 这个命令是用来把filename备份成filename.bak的 等同于命令 cp filename filename.bak ...

  5. 用Python写一个简单的TCP客户端和服务端

    在渗透测试过程中,经常需要创建一个TCP客户端,用来测试服务.发送数据.进行 fuzz 等等.如果黑客潜伏在某大型企业的内网环境中,则不太可能直接获取网络工具或编译器,有时甚至连复制/粘贴或者连接外网 ...

  6. GDAL从二进制数据流中构造数据集

    目录 1. 概述 2. 实现 1. 概述 参看<从二进制数据流中构造GDAL可以读取的图像数据>这篇文章.这个问题的内涵在于,处理图像时都会将其读取成宽X高X波段的三维数组的内存Buffe ...

  7. 玩转Sermant开发,开发者能力机制解析

    本文分享自华为云社区<开发者能力机制解析,玩转Sermant开发>,作者:华为云开源 . 前言: 在<Sermant框架下的服务治理插件快速开发及使用指南>中带大家一起体验了S ...

  8. 容器、Docker、虚拟机,别再傻傻分不清

    摘要:容器技术起源于Linux,是一种内核虚拟化技术,提供轻量级的虚拟化,以便隔离进程和资源.尽管容器技术已经出现很久,却是随着Docker的出现而变得广为人知. 容器技术起源于Linux,是一种内核 ...

  9. 云小课|GaussDB如何进行性能调优

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:GaussDB性能 ...

  10. 详解CNN实现中文文本分类过程

    摘要:本文主要讲解CNN实现中文文本分类的过程,并与贝叶斯.决策树.逻辑回归.随机森林.KNN.SVM等分类算法进行对比. 本文分享自华为云社区<[Python人工智能] 二十一.Word2Ve ...