Linux设置虚拟内存的教学与实战教程

什么是虚拟内存?

先直接摘抄一段 wikipedia 上的介绍。

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

对于 C 语言里面的变量,我们可以使用 & 运算符来获得其地址, 既然是虚拟地址,就是指这个地址是虚拟的。

虚拟地址机制不是必须的,在简单的单片机中,编写的代码编译时都需要指定物理 RAM 空间分布,不会有虚拟地址的概念,地址就是指在 RAM 中的物理地址。

  • 虚拟内存(之所以称为虚拟内存,是和系统中的逻辑内存和物理内存相对而言的,逻辑内存是站在进程角度看到的内存,因此是程序员关心的内容。而物理内存是站在处理器角度看到的内存,由操作系统负责管理。虚拟内存可以说是映射到这两种不同视角内存的一个技术手段。)技术就是一种由操作系统接管的按需动态内存分配的方法,它允许程序不知不觉中使用大于实际物理空间大小的存储空间(其实是将程序需要的存储空间以页的形式分散存储在物理内存和磁盘上),所以说虚拟内存彻底解放了程序员,从此程序员不用过分关心程序的大小和载入,可以自由编写程序了,繁琐的事情都交给操作系统去做吧。
  • SWAP(意思是“交换”、“实物交易”)分区是Linux的交换分区。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,当请求的数据不在内存中时,系统产生却页中断,内存管理器便将对应的内存页重新从硬盘调入物理内存。(需要严重注意的是它和内存映射文件的区别,linux虚拟内存或者说交换分区是在磁盘中有一个指定的区域即swap。)交换分区实际存在于磁盘中,不过Linux系统可以将它当作内存使用,当物理真实内存不足的时候交换分区就可以和真实内存进行数据交换。简单地说就是从磁盘里拿出一块空间当作内存的储备区。虽说磁盘被拿来当作内存使用,但是速度还是磁盘的速度。

介绍

在我们自己的购买的服务器环境中,一般是买的1g的内存,但是当服务器里面的东西装的比较多的时候就会导致内存不够用了,本文将模拟一个真实的内存不够用的情况下,如何通过修改虚拟内存来让系统正常运行,我们这里的环境是搭建一个ElasticSearch搜索的环境,但是我们的服务器内存只有1g,下面将演示如何在将1g的虚拟内存修改为4G。

搭建ElasticSearch环境

现在我们的服务器环境是空的,什么都没有,我们这里先将ElasticSearch上传到服务器,然后将jdk和ElasticSearch安装好。

安装jdk

安装教程后面更新(该文章主要介绍设置虚拟内存,安装这些东西主要是模拟一个内存不够的状态)

安装ElasticSearch

安装链接后面更新(该文章主要介绍设置虚拟内存,安装这些东西主要是模拟一个内存不够的状态)

启动ElasticSearch

启动ElasticSearch,会发现启动的时候报错了,原因是我们的服务器现在的内存并不能满足ElasticSearch需要的内存。

[esyonghu@localhost elasticsearch-6.4.0]$ ./bin/elasticsearch
[1] 3228
[esyonghu@localhost elasticsearch-6.4.0]$ Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x000000008a660000, 1973026816, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1973026816 bytes for committing reserved memory.
# An error report file with more information is saved as:
# logs/hs_err_pid3228.log
[esyonghu@localhost elasticsearch-6.4.0]$ 

查看我们的服务器的内存,使用命令 free,可以看到我们服务器的内存是1g, 这个时候就需要我们修改虚拟内存来解决该问题了。

[esyonghu@localhost elasticsearch-6.4.0]$ free -m
  total used free shared buffers cached
Mem:  980 582 397  2  23 245
-/+ buffers/cache: 313 667
Swap:  0  0  0
[esyonghu@localhost elasticsearch-6.4.0]$ 

创建swap文件

进入/usr目录

[root@localhost usr]$ pwd
/usr
[root@localhost usr]$ 

创建swap文件夹,并进入该文件夹

[root@localhost usr]# mkdir swap
[root@localhost usr]# cd swap/
[root@localhost swap]# pwd
/usr/swap
[root@localhost swap]# 

创建swapfile文件,使用命令dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=4096

[root@localhost swap]# dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=4096
记录了4096+0 的读入
记录了4096+0 的写出
4294967296字节(4.3 GB)已复制,15.7479 秒,273 MB/秒
[root@localhost swap]#

查看swap文件

使用命令du -sh /usr/swap/swapfile,可以看到我们创建的这个swap文件为4g

[root@localhost swap]# du -sh /usr/swap/swapfile
4.1G	/usr/swap/swapfile
[root@localhost swap]# 

将目标设置为swap分区文件

1、使用命令mkswap /usr/swap/swapfile将swapfile文件设置为swap分区文件

[root@localhost swap]# mkswap /usr/swap/swapfile
mkswap: /usr/swap/swapfile: warning: don't erase bootbits sectors
 on whole disk. Use -f to force.
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=5bd241ff-5375-449d-9975-5fdd429df784
[root@localhost swap]#

激活swap区,并立即启用交换区文件

使用命令swapon /usr/swap/swapfile

[root@localhost swap]# swapon /usr/swap/swapfile
[root@localhost swap]#

使用命令free -m 来查看现在的内存,可以看到里面的Swap分区变成了4095M,也就是4G内存。

[root@localhost swap]# free -m
  total used free shared buffers cached
Mem:  980 910  70  3  8 575
-/+ buffers/cache: 326 654
Swap:  4095  0 4095
[root@localhost swap]#

设置开机自动启用虚拟内存,在etc/fstab文件中加入如下命令

1、使用vim编辑器打开/etc/fstab文件

2、在文件中加入如下内容

/usr/swap/swapfile2 swap swap defaults 0 0

使用reboot命令重启服务器

1、输入reboot 命令来重启

	[root@localhost swap]# reboot

	Broadcast message from liaocheng@localhost.localdomain
		(/dev/pts/1) at 3:56 ...

	The system is going down for reboot NOW!
	[root@localhost swap]# Connection to 192.168.136.142 closed by remote host.
	Connection to 192.168.136.142 closed.
	[进程已完成]

2、重启完成过后使用free -m 命令来查看现在的内存是否挂在上了。

[root@localhost swap]# free -m
    total  used  free  shared buffers  cached
Mem:   980  910   70   3   8  575
-/+ buffers/cache:  326  654
Swap:   4095   0  4095

再次启动ElasticSearch看看是否还会报内存不足的错误

1、还是切换到esyonghu去启动(这里为什么要使用es用户启动就先不介绍了,这是elasticsearch里面的知识,这里只是用elasticsearch来模拟内存不足的情况),可以看到已经不会有内存不足的问题了。

[esyonghu@localhost elasticsearch-6.4.0]$ ./bin/elasticsearch &
[1] 2898
[esyonghu@localhost elasticsearch-6.4.0]$ [2019-03-06T04:00:24,841][INFO ][o.e.n.Node    ] [] initializing ...
[2019-03-06T04:00:24,928][INFO ][o.e.e.NodeEnvironment ] [dMy5nR5] using [1] data paths, mounts [[/ (rootfs)]], net usable_space [7.6gb], net total_space [17.3gb], types [rootfs]
[2019-03-06T04:00:24,928][INFO ][o.e.e.NodeEnvironment ] [dMy5nR5] heap size [1.9gb], compressed ordinary object pointers [true]
[2019-03-06T04:00:25,018][INFO ][o.e.n.Node    ] [dMy5nR5] node name derived from node ID [dMy5nR5fThaBb-Q2T0txdA]; set [node.name] to override
[2019-03-06T04:00:25,018][INFO ][o.e.n.Node    ] [dMy5nR5] version[6.4.0], pid[2898], build[default/tar/595516e/2018-08-17T23:18:47.308994Z], OS[Linux/2.6.32-696.el6.x86_64/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_181/25.181-b13]
[2019-03-06T04:00:25,018][INFO ][o.e.n.Node    ] [dMy5nR5] JVM arguments [-Xms2g, -Xmx2g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=/tmp/elasticsearch.24Q3S9AE, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -Xloggc:logs/gc.log, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=32, -XX:GCLogFileSize=64m, -Des.path.home=/home/esyonghu/elasticsearch-6.4.0, -Des.path.conf=/home/esyonghu/elasticsearch-6.4.0/config, -Des.distribution.flavor=default, -Des.distribution.type=tar]
[2019-03-06T04:00:28,022][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [aggs-matrix-stats]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [analysis-common]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [ingest-common]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [lang-expression]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [lang-mustache]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [lang-painless]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [mapper-extras]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [parent-join]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [percolator]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [rank-eval]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [reindex]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [repository-url]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [transport-netty4]
[2019-03-06T04:00:28,023][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [tribe]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-core]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-deprecation]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-graph]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-logstash]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-ml]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-monitoring]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-rollup]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-security]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-sql]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-upgrade]
[2019-03-06T04:00:28,024][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded module [x-pack-watcher]
[2019-03-06T04:00:28,025][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded plugin [analysis-ik]
[2019-03-06T04:00:28,025][INFO ][o.e.p.PluginsService  ] [dMy5nR5] loaded plugin [analysis-pinyin]
[2019-03-06T04:00:31,315][INFO ][o.e.x.s.a.s.FileRolesStore] [dMy5nR5] parsed [0] roles from file [/home/esyonghu/elasticsearch-6.4.0/config/roles.yml]
[2019-03-06T04:00:32,017][INFO ][o.e.x.m.j.p.l.CppLogMessageHandler] [controller/2947] [Main.cc@109] controller (64 bit): Version 6.4.0 (Build cf8246175efff5) Copyright (c) 2018 Elasticsearch BV
[2019-03-06T04:00:32,495][DEBUG][o.e.a.ActionModule  ] Using REST wrapper from plugin org.elasticsearch.xpack.security.Security
[2019-03-06T04:00:32,768][INFO ][o.e.d.DiscoveryModule ] [dMy5nR5] using discovery type [zen]
[2019-03-06T04:00:33,628][INFO ][o.e.n.Node    ] [dMy5nR5] initialized
[2019-03-06T04:00:33,628][INFO ][o.e.n.Node    ] [dMy5nR5] starting ...
[2019-03-06T04:00:33,860][INFO ][o.e.t.TransportService ] [dMy5nR5] publish_address {192.168.136.142:9300}, bound_addresses {[::]:9300}
[2019-03-06T04:00:33,884][INFO ][o.e.b.BootstrapChecks ] [dMy5nR5] bound or publishing to a non-loopback address, enforcing bootstrap checks
[2019-03-06T04:00:36,995][INFO ][o.e.c.s.MasterService ] [dMy5nR5] zen-disco-elected-as-master ([0] nodes joined)[, ], reason: new_master {dMy5nR5}{dMy5nR5fThaBb-Q2T0txdA}{ldgTZ1XZSfOpda9uP4treA}{192.168.136.142}{192.168.136.142:9300}{ml.machine_memory=1028210688, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}
[2019-03-06T04:00:37,003][INFO ][o.e.c.s.ClusterApplierService] [dMy5nR5] new_master {dMy5nR5}{dMy5nR5fThaBb-Q2T0txdA}{ldgTZ1XZSfOpda9uP4treA}{192.168.136.142}{192.168.136.142:9300}{ml.machine_memory=1028210688, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}, reason: apply cluster state (from master [master {dMy5nR5}{dMy5nR5fThaBb-Q2T0txdA}{ldgTZ1XZSfOpda9uP4treA}{192.168.136.142}{192.168.136.142:9300}{ml.machine_memory=1028210688, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true} committed version [1] source [zen-disco-elected-as-master ([0] nodes joined)[, ]]])
[2019-03-06T04:00:37,058][INFO ][o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [dMy5nR5] publish_address {192.168.136.142:9200}, bound_addresses {[::]:9200}
[2019-03-06T04:00:37,058][INFO ][o.e.n.Node    ] [dMy5nR5] started
[2019-03-06T04:00:37,177][INFO ][o.w.a.d.Monitor   ] try load config from /home/esyonghu/elasticsearch-6.4.0/config/analysis-ik/IKAnalyzer.cfg.xml
[2019-03-06T04:00:37,179][INFO ][o.w.a.d.Monitor   ] try load config from /home/esyonghu/elasticsearch-6.4.0/plugins/ik/config/IKAnalyzer.cfg.xml
[2019-03-06T04:00:37,888][INFO ][o.e.m.j.JvmGcMonitorService] [dMy5nR5] [gc][4] overhead, spent [486ms] collecting in the last [1.2s]
[2019-03-06T04:00:38,435][WARN ][o.e.x.s.a.s.m.NativeRoleMappingStore] [dMy5nR5] Failed to clear cache for realms [[]]
[2019-03-06T04:00:38,469][INFO ][o.e.l.LicenseService  ] [dMy5nR5] license [c91cae39-79d7-4a0e-b40b-b1918a45f80c] mode [trial] - valid
[2019-03-06T04:00:38,477][INFO ][o.e.g.GatewayService  ] [dMy5nR5] recovered [5] indices into cluster_state
[2019-03-06T04:00:38,902][WARN ][o.e.x.s.a.s.m.NativeRoleMappingStore] [dMy5nR5] Failed to clear cache for realms [[]]
[2019-03-06T04:00:39,106][INFO ][o.e.c.r.a.AllocationService] [dMy5nR5] Cluster health status changed from [RED] to [YELLOW] (reason: [shards started [[mynote2][2]] ...]).

2、现在使用free -m来查看内存使用情况, 可以看到swap已经被使用了1.7G

[esyonghu@localhost elasticsearch-6.4.0]$ free -m
    total  used  free  shared buffers  cached
Mem:   980  916   64   0   3   33
-/+ buffers/cache:  880  100
Swap:   4095  1735  2360
[esyonghu@localhost elasticsearch-6.4.0]$

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Linux上通过SSH挂载远程文件系统方法详解

    SSHFS的特点: 基于FUSE(Linux的最佳用户空间文件系统框架) 多线程:在服务器上可以有多个请求 允许大读取(最大64k) 缓存目录内容 步骤1:安装fuse-sshfs 对于centos/rhel用户,fuse sshfs在epel repository下可用,因此请确保在系统中安装了epel repository.现在执行以下命令安装它 在CENTOS/RHELL上: #yum install fuse-sshfs 在Ubuntu和Dabian上: $ sudo apt-get u

  • Linux中使用命令more,less,cat查看文件内容

    Linux中命令cat.more.less均可用来查看文件内容:cat是一次性显示整个文件的内容,还可以将多个文件连接起来显示,它常与重定向符号配合使用,适用于文件内容少的情况:more和less一般用于显示文件内容超过一屏的内容,并且提供翻页的功能.less比more更强大,提供翻页,跳转,查找等命令. 众所周知Linux中命令cat.more.less均可用来查看文件内容,主要区别有: cat是一次性显示整个文件的内容,还可以将多个文件连接起来显示,它常与重定向符号配合使用,适用于文件内容少

  • Linux获取当前脚本真实路径的方法

    1.获取当前脚本的真实路径: #!/bin/bash if [[ $0 =~ ^\/.* ]] #判断当前脚本是否为绝对路径,匹配以/开头下的所有 then script=$0 else script=$(pwd)/$0 fi script=`readlink -f $script` #获取文件的真实路径 script_path=${script%/*} #获取文件所在的目录 realpath=$(readlink -f $script_path) #获取文件所在目录的真实路径 echo $sc

  • 一道题理解Linux中sort命令的多个参数

    sort命令很常用,但参数也很多,比如: -o, -n, -u, -r一时也未必能想起如何使用. 这里有一道题,可以很好的结合使用上面的参数,达到很好记忆的效果. 题目: 数据文件data中含以下数据: 4 1 3 5 1001 2 4 5 请用一条命令反向排序,去重并将这些数据同样保存在data文件中.最终输出结果: 1001 5 4 3 2 1 要达到上面的三条要求,就要同时借助于上面的几个参数,具体命令如下: [root@localhost ~]# cat data | sort -nur

  • 高并发nginx服务器的linux内核优化配置讲解

    由于默认的linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,是的Nginx可以拥有更高的性能: 在优化内核时,可以做的事情很多,不过,我们通常会根据业务特点来进行调整,当Nginx作为静态web内容服务器.反向代理或者提供压缩服务器的服务器时,期内核参数的调整都是不同的,这里针对最通用的.使Nginx支持更多并发请求的TCP网络参数做简单的配置: 以下linux 系统内核优化配置均经在线业务系统测试,并发10万左右服务器运行

  • Linux下升级python和安装pip的详解

    Linux版本升级: 1.首先确认Linux操作系统中自带的python 版本时候与自己所需要的版本一致 所有的python版本都在https://www.python.org/ftp/python/ 选择下载 2. wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz 进行下载 3.解压 tar -zxvf Python-2.7.11.tgz 进入Python-2.7.11目录  输入 ./configure make

  • Linux中修改mysql默认编码的方法步骤

    在开发过程中,如果还原MySQL数据库后,数据库数据出现乱码,可以通过修改数据库默认编码来解决. 以下以把MySQL默认编码修改为UTF-8作为例子演示修改流程: 1.先查看mysql的信息 # 查看数据库安装位置 whereis mysql # 登录数据库 mysql -u root -p 按提示输入密码 # 查看mysql状态 mysql>status 2.修改my.cnf 文件 目录为/etc/my.cnf 如果系统中没有my.cnf文件.则需要创建此文件,具体步骤请看3,如果存在,直接跳

  • Linux下删除乱码或特殊字符文件的方法讲解

    由于编码原因,在linux服务器上上传.创建中文文件或目录时,会产生乱码,如果想删除它,用rm命令是删除不了的,这种情况下,用find命令可以删除乱码的文件或目录. 在linux文件系统中,每个文件都有一个i节点号,可以通过i节点号来管理文件.首先进入乱码文件或目录所在的目录 使用ls -i命令找到文件或目录的inode, 文件或目录前面的数字字符串就是inode,接下来使用find命令查询并且删除此文件或目录. 注意:此方法只适用于删除文件或空的文件夹. 非空文件夹怎么删除呢? 首先也是先查i

  • Linux关于透明大页的使用与禁用介绍

    引言 随着计算需求规模的不断增大,应用程序对内存的需求也越来越大.为了实现虚拟内存管理机制,操作系统对内存实行分页管理.自内存"分页机制"提出之始,内存页面的默认大小便被设置为 4096 字节(4KB),虽然原则上内存页面大小是可配置的,但绝大多数的操作系统实现中仍然采用默认的 4KB 页面. 4KB 大小的页面在"分页机制"提出的时候是合理的,因为当时的内存大小不过几十兆字节,然而当物理内存容量增长到几 G 甚至几十 G 的时候,操作系统仍然以 4KB 大小为页面

  • Linux Shell在目录下使用for循环结合if查找文件的巧用

    1.for循环对目录做遍历,if判断文件是否为要查找的文件. 示例1: #!/bin/bash if [ $# -lt 1 ];then echo "Usage:$0 + filepath" exit fi #判断用户是否输入了参数 match=$1 #将要查的文件赋值给变量match found=0 #定义一个初始变量作为发生条件,当文件找到时对此变量重新赋值 for file in /etc/* #对目录进行遍历 do if [ $file == $match ];then #判断

随机推荐