一、      虚拟内存介绍

背景介绍

  Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存的造价是要高于磁盘的,且内存的断电丢失数据也是不能把所有数据和程序都保存在内存中的原因。

既然不能全部使用内存,那数据还有程序不可能一直霸占在内存中。当内存没有可用的,就必须要把内存中不经常运行的程序踢出去。但是踢到哪里去,这时候swap就出现了。

Swap全称为swap place,即交换分区。当内存不够的时候,被踢出的进程被暂时存储到交换区。当需要这条被踢出的进程时,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。

Swap介绍

  在详细介绍swap之前,需要知道的是计算机内存分为物理内存与虚拟内存(注意虚拟内存和虚拟地址空间的区别)。

  物理内存是计算机的实际内存大小,由RAM芯片组成。虚拟内存则是虚拟出来的、使用磁盘代替内存。虚拟内存的出现,让机器内存不够的情况得到部分解决。当程序运行起来由操作系统做具体虚拟内存到物理内存的替换和加载(相应的页与段的虚拟内存管理)。这里的虚拟内存即所谓的swap。

  当用户提交程序,然后产生进程在机器上运行。机器会判断当前物理内存是否还有空闲允许进程调入内存运行,如果有则直接调入内存进行;如果没有,则会根据优先级选择一个进程挂起,把该进程交换到swap中等待,然后把新的进程调入到内存中运行。根据这种换入和换出,实现了内存的循环利用,让用户感觉不到内存的限制。从这也可以看出swap扮演了一个非常重要的角色,就是暂存被换出的进程。

  内存与swap之间是按照内存页为单位来交换数据的,一般Linux中页的大小设置为4Kb。而内存与磁盘则是按照来交换数据的。

Swap的设置

  从上可以看出,当物理内存使用完或者达到一定比例之后,我们可以使用swap做临时的内存使用。当物理内存和swap都被使用完那么就会出错,如:out of memory。

  对于使用多大比例内存之后开始使用swap,在系统配置文件中可以通过调整参数进行修改。

 [root@localhost ~]# cat /proc/sys/vm/swappiness

  该参数范围为0-100。0就是最大限度使用内存,尽量不使用swap;100是积极使用swap。

  物理内存无法更改,所以swap大小的设置将会影响应用能否正常运行。swap大小的确定,根据Centos官网介绍可以得出如下公式:

1 M = Amount of RAM in GB, and S = Amount of swap in GB, then If M < 2, S = M *2 Else S = M + 2

   注意:最小不应小于32M。

  

  Swap分区的数量对性能也有很大的影响。因为swap毕竟还是以磁盘来伪装成内存,交换的操作是磁盘IO的操作而不是内存的ioad与store操作。如果有多个swap交换区,每个swap会有一定的优先级,该优先级也可以调整。swap空间的分配会以轮流的方式操作于所有的swap,这样会大大均衡IO的负载,加快swap交换的速度。

swap相关命令

1 [root@localhost ~]# swapon -s #查看当前swap的使用情况

2 Filename Type Size Used Priority

3 /dev/sda3 partition 2064376 0 -1

4 [root@localhost ~]# cat /proc/swaps #查看当前swap的使用情况

5 Filename Type Size Used Priority

6 /dev/sda3 partition 2064376 0 -1

7 [root@localhost ~]# swapoff /dev/sda3 #关闭相应的swap_disk_name

8 [root@localhost ~]# swapon -s

9 Filename Type Size Used Priority

10 [root@localhost ~]# swapon /dev/sda3 #启动相应的swap_disk_name

11 [root@localhost ~]# swapon -s

12 Filename Type Size Used Priority

13 /dev/sda3 partition 2064376 0 -1
 

二、      虚拟内存设置

1、检查 Swap 空间

在设置 Swap 文件之前,有必要先检查一下系统里有没有既存的 Swap 文件。

运行以下命令:

swapon -s

如果返回的信息概要是空的,则表示 Swap 文件不存在。

2、检查文件系统

在设置 Swap 文件之前,同样有必要检查一下文件系统,看看是否有足够的硬盘空间来设置 Swap 。运行以下命令:

df -hal

检查返回的信息,还剩余足够的硬盘空间即可。

3、创建并允许 Swap 文件

下面使用 dd 命令来创建 Swap 文件。

dd if=/dev/zero of=/tmp/swapfile bs= count=1024k

这样就建立一个/tmp/swapfile的分区文件,大小为1G。

参数解读:

if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >

of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >

bs=bytes:同时设置读入/输出的块大小为bytes个字节

count=blocks:仅拷贝blocks个块,块大小等于bs指定的字节数。

4、格式化并激活 Swap 文件

上面已经创建好 Swap 文件,还需要格式化后才能使用。运行命令:

dd if=/dev/zero of=/tmp/swapfile bs= count=1024k

激活 Swap ,运行命令:

swapon /tmp/swapfile

以上步骤做完,再次运行命令:

swapon -s

你会发现返回的信息概要:

Filename Type Size Used Priority

/tmp/swapfile file   -

如果要机器重启的时候自动挂载 Swap ,那么还需要修改 fstab 配置。

用 vim 打开 /etc/fstab 文件,在其最后添加如下一行:

/tmp/swapfile           swap                    swap    defaults         

最后,赋予 Swap 文件适当的权限:

chown root:root /tmp/swapfile

chmod  /tmp/swapfile

同时,我们还可以修改 Linux Swap 空间的 swappiness ,降低对硬盘的缓存。

Linux 会使用硬盘的一部分做为 Swap 分区,用来进行进程调度–进程是正在运行的程序–把当前不用的进程调成‘等待(standby)’,甚至‘睡眠(sleep)’,一旦要用,再调成‘活动(active)’,睡眠的进程就会在 Swap 分区,把内存空出来让给‘活动’的进程。

如果内存够大,应当告诉 Linux 不必太多的使用 Swap 分区,可以通过修改 swappiness 的参数来设置。swappiness=0 的时候表示最大限度使用物理内存,然后才是 Swap 空间,swappiness=100 的时候表示积极的使用 Swap 分区,并且把内存上的数据及时的搬运到 Swap 空间里面。

在 CentOS 中,swappiness 的默认值是60。

通过以下命令可以看到:

cat /proc/sys/vm/swappiness

返回值60

我们可以调整 swappiness 的值到一个合适的参数,从而达到最优化使用 Swap 的目的。这里我们将其设为10。这样你就将值由60改为10,这可以大大降低系统对于swap的写入,建议内存为512M或更多的朋友采用此方法。如你你发现你对于swap的使用极少,可以将值设为0。这并不会禁止你对swap的使用,而是使你的系统对于swap的写入尽可能的少,同时尽可能多的使用你的实际内存。这对于你在切换应用程序时有着巨大的作用,因为这样的话它们是在物理内存而非swap分区中。

使用 sysctl 命令:

sysctl vm.swappiness=

但是这只是临时性的修改,在你重启系统后会恢复默认的60,要永久设置,还需要在 vim 中修改sysctl.conf:

vi /etc/sysctl.conf

在这个文档的最后加上这样一行:

# Search for the vm.swappiness setting. Uncomment and change it as necessary.

vm.swappiness=

输入:x,保存退出 vim 。

这样一来,Swap 分区重启后都会生效了。

参考: https://www.cnblogs.com/004x/p/6651600.html

https://blog.csdn.net/shinaiqing/article/details/70132424

虚拟内存设置(解决linux内存不够情况)的更多相关文章

  1. 精确报告Linux内存使用情况实用脚本:ps_mem

    精确报告Linux内存使用情况实用脚本:ps_mem 2019-09-06 12:45 ps_mem内存工具 ps_mem 是一个可以帮助我们精确获取 Linux 中各个程序核心内存使用情况的简单 p ...

  2. Linux内存使用情况以及内存泄露情况

    1. 内存使用情况分析 http://www.360doc.com/content/15/1118/13/17283_514054063.shtml https://www.linuxidc.com/ ...

  3. Linux内存使用情况以及内存泄露分析之工具与方法

    <Linux C/C++ Memory Leak Detection Tool> 1. 内存使用情况分析 1.1 系统总内存分析 通过cat /proc/meminfo,可用的物理内存=M ...

  4. LINUX 内存使用情况

    # free 显示结果如下: Mem:表示物理内存统计 total 内存总数 8057964KBused 已使用的内存 7852484KBfree 空闲的内存数 205480KBshared 当前已经 ...

  5. 查看linux内存使用情况

    查看内存使用情况 free -m total used free shared buffers cached Mem: -/+ buffers/cache: Swap: used=total-free ...

  6. 监控Linux内存使用情况

    cat mem.sh#!/bin/bashIP=`ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk -F ' ' '{print $2}'| aw ...

  7. 关于linux内存使用情况

    从操作系统角度看: 系统物理内存7.5g 目前已使用7.4g(包含14m的buffer和1.6g的cache) 剩余可用内存128m 从应用程序角度看: 目前已使用5.8g 剩余可用内存1.7g(因为 ...

  8. linux 内存使用情况详解

    一:首先是先登录 二:查看当前目录 命令:df -h 三:查看具体文件夹占用情况 命令:du --max-depth=1 -h  /data/ 或者:为了快算显示,同时也只是想查看目录整体占用大小 命 ...

  9. 可以用软连接的方式解决linux内存空间不足的问题

    突然提示说/var空间满了,然后接着系统卡死,最后彻底没辙,重启试试,没想到提示什么系统错误,请联系管理员之类的提示语,也进不去登陆界面啥了.之后用其他电脑连接SSH用root账号访问. # cd / ...

随机推荐

  1. java常用API之基本类型包装类

    基本类型包装类概述: 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的. 而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型. 想实现字符串与基本数据之间转换,需 ...

  2. Android 马甲包制作流程

    一.马甲包的制作流程 1.配置马甲包的applicationId以及应用名称 在app的build.gradle文件中添加马甲包的配置 android { signingConfigs { confi ...

  3. 每天一个linux命令-uname,输出操作系统信息(内核版本、硬件架构32位/64位等)

      uname命令:主要用于输出一组操作系统的信息. 这个命令比较简单也比较有意思.为什么这么说呢?输入--help后看看效果,一目了然,简单吧: 首先输出完整信息: 我们再依次来输出一下: 最后,我 ...

  4. Windows平台字符串完全指南

    The Complete Guide to C++ Strings : The Complete Guide to C++ Strings, Part I - Win32 Character Enco ...

  5. ARM 虚拟机使用同一个公共 IP 访问公网的解决方案

    ARM 虚拟机使用同一个公共 IP 访问公网的解决方案 2017-2-21 作者 Azure 目前有两种部署模型:资源管理器 ARM 和经典部署模型 ASM.ASM 的虚拟机默认公用云服务的 VIP ...

  6. day011-网络编程

    1. 网络编程概述 1.1  网络编程三要素 地址.端口.协议 1.1.1 IP地址:网络中设备的唯一标识. IPV4格式:xxx.xxx.xxx.xxx由四段数字组成,每一段数字由八位二进制数字组成 ...

  7. t d x 示例z

    using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...

  8. github 专案介绍 – Python 范例:透过互动式的 Jupyter 和数学解释流行的机器学习演算法

    对于机器学习有兴趣,不少人应该会先从 Andrew Ng ( 吴恩达 ) 的机器学习课程开始,但是吴恩达的课程是使用 octave 这个工具当作练习.这个 github 项目包含使用 Python 实 ...

  9. Java程序员面试题集2

    51.类ExampleA 继承Exception,类ExampleB 继承ExampleA. 有如下代码片断: try{ throw new ExampleB("b") }catc ...

  10. 每天一个linux命令:du 命令

    Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...