一、      虚拟内存介绍

背景介绍

  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. jboss安全配置规范

    https://wenku.baidu.com/view/aad157a4f242336c1fb95ed5.html https://wenku.baidu.com/view/ac227281ec3a ...

  2. centos开启IPV6配置方法

    目前国内大部分服务器和PC不支持IPV6地址的,但是服务器上本身是可以正常开启IPV6服务,有部分程序在服务器上运行的时候,需要服务器能监听一个ipv6地址才行,因此本文档指导如何在centos服务器 ...

  3. create-react-app 打包后文件路径问题

    在package.json 加入 "homepage": "需要的路径",

  4. log4go的一些改进设想

    log4go 的 4.0.2 版本(https://github.com/ccpaging/log4go/tree/4.0.2)发布以后, 看了看别的 go 语言日志文件设计.发现了一篇好文: log ...

  5. 随tomcat启动的Servlet程序

    由于需要做一定定时轮询程序,自己写了一个Servlet小程序,在Servlet里面的Init函数中做一个Timer,定时执行程序. 代码如下: public class MailStartup  ex ...

  6. May 16th 2017 Week 20th Tuesday

    The most fearful enemy is not having a firm conviction. 最可怕的敌人,就是没有坚强的信念. A firm conviction or belie ...

  7. March 19 2017 Week 12 Sunday

    If you want it, work for it. It's that simple. 很简单,想要什么,就为之努力吧. Yes, it is very simple. Many of us j ...

  8. 深入浅出C/C++中的正则表达式库

    写在前面: 本文是面向有正则表达式基础的读者朋友的,如果你还不知道正则表达式是什么,请先到这里学习一下  :http://en.wikipedia.org/wiki/Regular_expressio ...

  9. WPF产生不重复的随机数

    WPF产生不重复的随机数 在给定的区间范围(比如[50,99]),产生给定数量的随机数(不如10个),要求产生的随机数不重复首先给定变量min=50;max=99+1;//习惯与程序规定的编码不同所致 ...

  10. Hive创建外部表以及分区

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sheismylife/article/details/27874943 创建带分区的外部表 创建外部 ...