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@localhostelasticsearch-6.4.0]$./bin/elasticsearch [1]3228 [esyonghu@localhostelasticsearch-6.4.0]$JavaHotSpot(TM)64-BitServerVMwarning:INFO:os::commit_memory(0x000000008a660000,1973026816,0)failed;error='Cannotallocatememory'(errno=12) # #ThereisinsufficientmemoryfortheJavaRuntimeEnvironmenttocontinue. #Nativememoryallocation(mmap)failedtomap1973026816bytesforcommittingreservedmemory. #Anerrorreportfilewithmoreinformationissavedas: #logs/hs_err_pid3228.log [esyonghu@localhostelasticsearch-6.4.0]$
查看我们的服务器的内存,使用命令free,可以看到我们服务器的内存是1g,这个时候就需要我们修改虚拟内存来解决该问题了。
[esyonghu@localhostelasticsearch-6.4.0]$free-m totalusedfreesharedbufferscached Mem:980582397223245 -/+buffers/cache:313667 Swap:000 [esyonghu@localhostelasticsearch-6.4.0]$
创建swap文件
进入/usr目录
[root@localhostusr]$pwd /usr [root@localhostusr]$
创建swap文件夹,并进入该文件夹
[root@localhostusr]#mkdirswap [root@localhostusr]#cdswap/ [root@localhostswap]#pwd /usr/swap [root@localhostswap]#
创建swapfile文件,使用命令ddif=/dev/zeroof=/usr/swap/swapfilebs=1Mcount=4096
[root@localhostswap]#ddif=/dev/zeroof=/usr/swap/swapfilebs=1Mcount=4096 记录了4096+0的读入 记录了4096+0的写出 4294967296字节(4.3GB)已复制,15.7479秒,273MB/秒 [root@localhostswap]#
查看swap文件
使用命令du-sh/usr/swap/swapfile,可以看到我们创建的这个swap文件为4g
[root@localhostswap]#du-sh/usr/swap/swapfile 4.1G /usr/swap/swapfile [root@localhostswap]#
将目标设置为swap分区文件
1、使用命令mkswap/usr/swap/swapfile将swapfile文件设置为swap分区文件
[root@localhostswap]#mkswap/usr/swap/swapfile mkswap:/usr/swap/swapfile:warning:don'terasebootbitssectors onwholedisk.Use-ftoforce. Settingupswapspaceversion1,size=4194300KiB nolabel,UUID=5bd241ff-5375-449d-9975-5fdd429df784 [root@localhostswap]#
激活swap区,并立即启用交换区文件
使用命令swapon/usr/swap/swapfile
[root@localhostswap]#swapon/usr/swap/swapfile [root@localhostswap]#
使用命令free-m来查看现在的内存,可以看到里面的Swap分区变成了4095M,也就是4G内存。
[root@localhostswap]#free-m totalusedfreesharedbufferscached Mem:9809107038575 -/+buffers/cache:326654 Swap:409504095 [root@localhostswap]#
设置开机自动启用虚拟内存,在etc/fstab文件中加入如下命令
1、使用vim编辑器打开/etc/fstab文件
2、在文件中加入如下内容
/usr/swap/swapfile2swapswapdefaults00
使用reboot命令重启服务器
1、输入reboot命令来重启
[root@localhostswap]#reboot Broadcastmessagefromliaocheng@localhost.localdomain (/dev/pts/1)at3:56... ThesystemisgoingdownforrebootNOW! [root@localhostswap]#Connectionto192.168.136.142closedbyremotehost. Connectionto192.168.136.142closed. [进程已完成]
2、重启完成过后使用free-m命令来查看现在的内存是否挂在上了。
[root@localhostswap]#free-m totalusedfreesharedbufferscached Mem:9809107038575 -/+buffers/cache:326654 Swap:409504095
再次启动ElasticSearch看看是否还会报内存不足的错误
1、还是切换到esyonghu去启动(这里为什么要使用es用户启动就先不介绍了,这是elasticsearch里面的知识,这里只是用elasticsearch来模拟内存不足的情况),可以看到已经不会有内存不足的问题了。
[esyonghu@localhostelasticsearch-6.4.0]$./bin/elasticsearch& [1]2898 [esyonghu@localhostelasticsearch-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]datapaths,mounts[[/(rootfs)]],netusable_space[7.6gb],nettotal_space[17.3gb],types[rootfs] [2019-03-06T04:00:24,928][INFO][o.e.e.NodeEnvironment][dMy5nR5]heapsize[1.9gb],compressedordinaryobjectpointers[true] [2019-03-06T04:00:25,018][INFO][o.e.n.Node][dMy5nR5]nodenamederivedfromnodeID[dMy5nR5fThaBb-Q2T0txdA];set[node.name]tooverride [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[OracleCorporation/JavaHotSpot(TM)64-BitServerVM/1.8.0_181/25.181-b13] [2019-03-06T04:00:25,018][INFO][o.e.n.Node][dMy5nR5]JVMarguments[-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]loadedmodule[aggs-matrix-stats] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[analysis-common] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[ingest-common] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[lang-expression] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[lang-mustache] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[lang-painless] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[mapper-extras] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[parent-join] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[percolator] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[rank-eval] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[reindex] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[repository-url] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[transport-netty4] [2019-03-06T04:00:28,023][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[tribe] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-core] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-deprecation] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-graph] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-logstash] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-ml] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-monitoring] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-rollup] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-security] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-sql] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-upgrade] [2019-03-06T04:00:28,024][INFO][o.e.p.PluginsService][dMy5nR5]loadedmodule[x-pack-watcher] [2019-03-06T04:00:28,025][INFO][o.e.p.PluginsService][dMy5nR5]loadedplugin[analysis-ik] [2019-03-06T04:00:28,025][INFO][o.e.p.PluginsService][dMy5nR5]loadedplugin[analysis-pinyin] [2019-03-06T04:00:31,315][INFO][o.e.x.s.a.s.FileRolesStore][dMy5nR5]parsed[0]rolesfromfile[/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(64bit):Version6.4.0(Buildcf8246175efff5)Copyright(c)2018ElasticsearchBV [2019-03-06T04:00:32,495][DEBUG][o.e.a.ActionModule]UsingRESTwrapperfrompluginorg.elasticsearch.xpack.security.Security [2019-03-06T04:00:32,768][INFO][o.e.d.DiscoveryModule][dMy5nR5]usingdiscoverytype[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]boundorpublishingtoanon-loopbackaddress,enforcingbootstrapchecks [2019-03-06T04:00:36,995][INFO][o.e.c.s.MasterService][dMy5nR5]zen-disco-elected-as-master([0]nodesjoined)[,],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:applyclusterstate(frommaster[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}committedversion[1]source[zen-disco-elected-as-master([0]nodesjoined)[,]]]) [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]tryloadconfigfrom/home/esyonghu/elasticsearch-6.4.0/config/analysis-ik/IKAnalyzer.cfg.xml [2019-03-06T04:00:37,179][INFO][o.w.a.d.Monitor]tryloadconfigfrom/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]collectinginthelast[1.2s] [2019-03-06T04:00:38,435][WARN][o.e.x.s.a.s.m.NativeRoleMappingStore][dMy5nR5]Failedtoclearcacheforrealms[[]] [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]indicesintocluster_state [2019-03-06T04:00:38,902][WARN][o.e.x.s.a.s.m.NativeRoleMappingStore][dMy5nR5]Failedtoclearcacheforrealms[[]] [2019-03-06T04:00:39,106][INFO][o.e.c.r.a.AllocationService][dMy5nR5]Clusterhealthstatuschangedfrom[RED]to[YELLOW](reason:[shardsstarted[[mynote2][2]]...]).
2、现在使用free-m来查看内存使用情况,可以看到swap已经被使用了1.7G
[esyonghu@localhostelasticsearch-6.4.0]$free-m totalusedfreesharedbufferscached Mem:980916640333 -/+buffers/cache:880100 Swap:409517352360 [esyonghu@localhostelasticsearch-6.4.0]$
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。