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 ][Node    ] [] initializing ...
[2019-03-06T04:00:24,928][INFO ][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 ][NodeEnvironment ] [dMy5nR5] heap size [1.9gb], compressed ordinary object pointers [true]
[2019-03-06T04:00:25,018][INFO ][Node    ] [dMy5nR5] node name derived from node ID [dMy5nR5fThaBb-Q2T0txdA]; set [node.name] to override
[2019-03-06T04:00:25,018][INFO ][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/2 [2019-03-06T04:00:25,018][INFO ][Node    ] [dMy5nR5] JVM arguments [-Xms2g, -Xmx2g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.hea [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 ][s.a.s.FileRolesStore] [dMy5nR5] parsed [0] roles from file [/home/esyonghu/elasticsearch-6.4.0/l]
java安装完整教程[2019-03-06T04:00:32,017][INFO ][j.p.l.CppLogMessageHandler] [controller/2947] [@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 ][Node    ] [dMy5nR5] initialized
[2019-03-06T04:00:33,628][INFO ][Node    ] [dMy5nR5] starting ...
[2019-03-06T04:00:33,860][INFO ][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 ][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.mac [2019-03-06T04:00:37,003][INFO ][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 [2019-03-06T04:00:37,058][INFO ][SecurityNetty4HttpServerTransport] [dMy5nR5] publish_address {192.168.136.142:9200}, bound_addresses {[::]:9200}
[2019-03-06T04:00:37,058][INFO ][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/l
[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/l
[2019-03-06T04:00:37,888][INFO ][j.JvmGcMonitorService] [dMy5nR5] [gc][4] overhead, spent [486ms] collecting in the last [1.2s]
[2019-03-06T04:00:38,435][WARN ][s.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 ][GatewayService  ] [dMy5nR5] recovered [5] indices into cluster_state
[2019-03-06T04:00:38,902][WARN ][s.NativeRoleMappingStore] [dMy5nR5] Failed to clear cache for realms [[]]
[2019-03-06T04:00:39,106][INFO ][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]$
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。