介紹
在我們自己的購買的伺服器環境中,一般是買的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分割槽檔案
- 使用命令
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
檔案中加入如下命令
-
使用vim編輯器開啟/etc/fstab檔案
-
在檔案中加入如下內容
/usr/swap/swapfile swap swap defaults 0 0
複製程式碼
使用reboot命令重啟伺服器
- 輸入
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.
[程式已完成]
複製程式碼
- 重啟完成過後使用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看看是否還會報記憶體不足的錯誤
- 還是切換到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]] ...]).
複製程式碼
- 現在使用
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]$
複製程式碼