Linux 仮想メモリ設定のチュートリアルと実践

Linux 仮想メモリ設定のチュートリアルと実践

仮想メモリとは何ですか?

まずはWikipediaからの紹介文をそのまま引用します。

仮想メモリは、コンピュータ システムのメモリ管理のためのテクノロジです。これにより、アプリケーションは連続した使用可能なメモリ (連続した完全なアドレス空間) を持っていると認識しますが、実際には通常、複数の物理メモリ フラグメントに分割され、その一部は必要に応じてデータ交換できるように外部ディスク ストレージに一時的に保存されます。

C 言語の変数の場合、& 演算子を使用してそのアドレスを取得できます。これは仮想アドレスなので、このアドレスは仮想であることを意味します。

仮想アドレス メカニズムは必要ありません。単純なマイクロコントローラでは、コードをコンパイルするときに物理的な RAM スペースの配分を指定する必要があります。仮想アドレスの概念はありません。アドレスは RAM 内の物理アドレスを参照します。

  • 仮想メモリ(システム内の論理メモリと物理メモリを相対的に表すため、仮想メモリと呼ばれます。論理メモリはプロセスの観点から見たメモリなので、プログラマーが気にするものです。物理メモリはプロセッサの観点から見たメモリで、オペレーティングシステムによって管理されます。仮想メモリは、この2つの異なるメモリの観点にマッピングするための技術的な手段と言えます。)テクノロジは、オペレーティングシステムによって引き継がれるオンデマンドの動的メモリ割り当て方法です。これにより、プログラムは実際の物理スペースのサイズよりも大きなストレージスペースを無意識のうちに使用できます(実際には、プログラムが必要とするストレージスペースを物理メモリとディスクにページの形式で保存します)。したがって、仮想メモリはプログラマーを完全に解放します。それ以降、プログラマーはプログラムのサイズと読み込みについてあまり心配する必要はありません。自由にプログラムを作成し、面倒なことはすべてオペレーティングシステムに任せることができます。
  • SWAP (「交換」、「物理的な交換」を意味する) パーティションは、Linux のスワップ パーティションです。その機能は、メモリが不足している場合、オペレーティング システムがまずメモリ内の一時的に使用されていないデータをハード ディスクのスワップ領域に保存し、他のプログラムが実行できるようにメモリを解放することです。要求されたデータがメモリ内にない場合、システムはページ割り込みを生成し、メモリ マネージャーが対応するメモリ ページをハード ディスクから物理メモリに転送します。 (メモリマップファイルとの違いに注意することが重要です。Linux の仮想メモリまたはスワップ パーティションは、ディスク上の指定された領域、つまりスワップです。) スワップ パーティションは実際にはディスク上に存在しますが、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 ビット サーバー VM 警告: INFO: os::commit_memory(0x000000008a660000, 1973026816, 0) が失敗しました。エラー = 'メモリを割り当てられません' (errno = 12)
#
# Java Runtime Environment を続行するにはメモリが不足しています。
# ネイティブ メモリ割り当て (mmap) は、予約済みメモリをコミットするための 1973026816 バイトのマップに失敗しました。
# 詳細情報を含むエラー レポート ファイルは次のように保存されます。
# ログ/hs_err_pid3228.log
[esyonghu@localhost elasticsearch-6.4.0]$

サーバーのメモリを確認し、free コマンドを使用します。サーバーのメモリが 1g であることがわかります。この時点で、問題を解決するには仮想メモリを変更する必要があります。

[esyonghu@localhost elasticsearch-6.4.0]$ 無料 -m
  キャッシュされた未使用の共有バッファの合計
会員番号: 980 582 397 2 23 245
-/+ バッファ/キャッシュ: 313 667
スワップ: 0 0 0
[esyonghu@localhost elasticsearch-6.4.0]$

スワップファイルの作成

/usrディレクトリに入る

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

スワップフォルダを作成して入力する

[root@localhost usr]# mkdir swap
[root@localhost usr]# cd swap/
[root@localhost swap]# pwd
スワップ
[root@localhost スワップ]#

スワップファイルを作成するには、コマンド 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]#

スワップファイルを表示

du -sh /usr/swap/swapfileコマンドを使用して、作成したスワップファイルが4gであることを確認します。

[root@localhost swap]# du -sh /usr/swap/swapfile
4.1G /usr/swap/スワップファイル
[root@localhost スワップ]#

ターゲットをスワップパーティションファイルに設定する

1. コマンド mkswap /usr/swap/swapfile を使用して、swapfile ファイルを swap パーティション ファイルとして設定します。

[root@localhost swap]# mkswap /usr/swap/swapfile
mkswap: /usr/swap/swapfile: 警告: ブートビットセクターを消去しないでください
 ディスク全体。強制するには -f を使用します。
スワップスペース バージョン 1 を設定しています。サイズ = 4194300 KiB
ラベルなし、UUID=5bd241ff-5375-449d-9975-5fdd429df784
[root@localhost スワップ]#

スワップ領域をアクティブにして、スワップ領域ファイルをすぐに有効にします

swapon /usr/swap/swapfileコマンドを使用する

[root@localhost swap]# swapon /usr/swap/swapfile
[root@localhost スワップ]#

現在のメモリを確認するには、free -m コマンドを使用します。スワップ パーティションが 4095M になっていることがわかります。これは 4G のメモリを意味します。

[root@localhost swap]# free -m
  キャッシュされた未使用の共有バッファの合計
会員番号: 980 910 70 3 8 575
-/+ バッファ/キャッシュ: 326 654
スワップ: 4095 0 4095
[root@localhost スワップ]#

起動時に仮想メモリが自動的に有効になるように設定し、etc/fstabファイルに次のコマンドを追加します。

1. vimエディタを使用して/etc/fstabファイルを開きます

2. ファイルに次の内容を追加します

/usr/swap/swapfile2 swap スワップ デフォルト 0 0

再起動コマンドを使用してサーバーを再起動します

1.再起動コマンドを入力して再起動します

	[root@localhost swap]# 再起動

	liaocheng@localhost.localdomain からのブロードキャストメッセージ
		(/dev/pts/1) 3:56 ...

	システムはただいま再起動のためダウンしています。
	[root@localhost swap]# 192.168.136.142 への接続がリモート ホストによって閉じられました。
	192.168.136.142 への接続が閉じられました。
	[処理完了]

2. 再起動が完了したら、free -m コマンドを使用して、現在のメモリがハングしていないかどうかを確認します。

[root@localhost swap]# free -m
    キャッシュされた未使用の共有バッファの合計
会員番号: 980 910 70 3 8 575
-/+ バッファ/キャッシュ: 326 654
スワップ: 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 ][oenNode ][] 初期化しています...
[2019-03-06T04:00:24,928][INFO ][oeeNodeEnvironment ] [dMy5nR5] 使用 [1] データパス、マウント [[/ (rootfs)]]、ネット使用可能領域 [7.6gb]、ネット合計領域 [17.3gb]、タイプ [rootfs]
[2019-03-06T04:00:24,928][INFO ][oeeNodeEnvironment ] [dMy5nR5] ヒープサイズ [1.9gb]、圧縮された通常のオブジェクトポインター [true]
[2019-03-06T04:00:25,018][INFO ][oenNode ] [dMy5nR5] ノード名はノードID [dMy5nR5fThaBb-Q2T0txdA] から派生しました。[node.name] を上書きするように設定しました
[2019-03-06T04:00:25,018][INFO ][oenNode ] [dMy5nR5] バージョン[6.4.0]、pid[2898]、ビルド[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] [oendode] [dmy5nr5] JVM引数[-xmx2g、-xx:+useconcweepgc、-xx:cmsinitiatingoccupcance = 75、-xx:+usecupcant s1m、-djava.awt.headless = true、-dfile.encoding = utf -8、-djna.nosys = true、-xx:-omitstacktraceinfastthrow、-dio.netty.nounsafe = true、-dio.netty.nokeysetoptimizati shutdownhookenabled = false、-dlog4j2.disable.jmx = true、-djava.io.tmpdir =/tmp/elasticsearch.24q3s9ae、-xx:+heapdumponoutofmemoryerror、-xx:heapdumppath = data、-xx:errifilefide = logids/hscdids/prints/hapdumppath = ails、-xx:+printgcdateStamps、-xx:+printtenuringdistribution、-xx:+printgcapplicationstoppedtime、-xloggc:logs/gc.log、-xx:+usegclogfilerotation、-xx:numberofgclogfiles elasticsearch -6.4.0、-des.path.conf =/home/esyonghu/elasticsearch -6.4.0/config、-des.distribution.flavor = default、-des.distribution.thepe = tar]
[2019-03-06T04:00:28,022][INFO ][oepPluginsService ] [dMy5nR5] モジュール [aggs-matrix-stats] をロードしました
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュール [analysis-common] をロードしました
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュール [ingest-common] をロードしました
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュール [lang-expression] がロードされました
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュール [lang-mustache] をロードしました
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュール [lang-painless] をロードしました
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュール [mapper-extras] をロードしました
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュールをロードしました [parent-join]
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュール [percolator] をロードしました
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュールをロードしました [rank-eval]
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュールをロードしました [再インデックス]
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュール [repository-url] がロードされました
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュール [transport-netty4] をロードしました
[2019-03-06T04:00:28,023][INFO ][oepPluginsService ] [dMy5nR5] モジュール [tribe] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-core] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-deprecation] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-graph] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-logstash] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-ml] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-monitoring] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-rollup] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-security] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-sql] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-upgrade] をロードしました
[2019-03-06T04:00:28,024][INFO ][oepPluginsService ] [dMy5nR5] モジュール [x-pack-watcher] をロードしました
[2019-03-06T04:00:28,025][INFO ][oepPluginsService ] [dMy5nR5] プラグイン [analysis-ik] をロードしました
[2019-03-06T04:00:28,025][INFO ][oepPluginsService ] [dMy5nR5] プラグインをロードしました [analysis-pinyin]
[2019-03-06T04:00:31,315][INFO ][oexsasFileRolesStore] [dMy5nR5] はファイル [/home/esyonghu/elasticsearch-6.4.0/config/roles.yml] から [0] 個のロールを解析しました
[2019-03-06T04:00:32,017][INFO ][oexmjplCppLogMessageHandler] [controller/2947] [Main.cc@109] コントローラー (64 ビット): バージョン 6.4.0 (ビルド cf8246175efff5) Copyright (c) 2018 Elasticsearch BV
[2019-03-06T04:00:32,495][DEBUG][oeaActionModule ] プラグイン org.elasticsearch.xpack.security.Security からの REST ラッパーを使用しています
[2019-03-06T04:00:32,768][INFO ][oedDiscoveryModule ] [dMy5nR5] 検出タイプ [zen] を使用
[2019-03-06T04:00:33,628][INFO][oenNode] [dMy5nR5] 初期化されました
[2019-03-06T04:00:33,628][INFO ][oenNode ] [dMy5nR5] 開始しています...
[2019-03-06T04:00:33,860][INFO][oetTransportService] [dMy5nR5] 公開アドレス {192.168.136.142:9300}、バインドされたアドレス {[::]:9300}
[2019-03-06T04:00:33,884][INFO ][oebBootstrapChecks ] [dMy5nR5] 非ループバックアドレスにバインドまたは公開し、ブートストラップチェックを実施しています
[2019-03-06T04:00:36,995][INFO ][oecsMasterService ] [dMy5nR5] zen-disco がマスターとして選出されました ([0] ノードが参加しました)[, ], 理由: 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] [oecsclusterApplierservice] [dmy5nr5] new_master {dmy5nr5} {dmy5nr5 {dmy5nr5fthabb-q2t0txda} {ldgtz1xzsfopda9up4tree} {192.168.136.142:9300} {ml.machine_memory=1028210688、xpack.installed = true、ml.max_open_jobs = 20、ml。 {ldgtz1xzsfopda9up4trea} {192.168.136.142} {192.168.136.142:9300} {ml.machine_memory = 1028210688、xpack.installed = ml.max_pen_jobs ]ソース[Zen-Disco-Elected-As-Master([0]ノードが結合)[、]]])
[2019-03-06T04:00:37,058][INFO][oexstnSecurityNetty4HttpServerTransport] [dMy5nR5] 公開アドレス {192.168.136.142:9200}、バインドされたアドレス {[::]:9200}
[2019-03-06T04:00:37,058][INFO][oenNode] [dMy5nR5] が開始しました
[2019-03-06T04:00:37,177][INFO ][owadMonitor ] /home/esyonghu/elasticsearch-6.4.0/config/analysis-ik/IKAnalyzer.cfg.xml から設定をロードしてみてください
[2019-03-06T04:00:37,179][INFO ][owadMonitor ] /home/esyonghu/elasticsearch-6.4.0/plugins/ik/config/IKAnalyzer.cfg.xml から設定をロードしてみてください
[2019-03-06T04:00:37,888][INFO ][oemjJvmGcMonitorService] [dMy5nR5] [gc][4] オーバーヘッド、最後の [1.2s] の収集に [486ms] を費やしました
[2019-03-06T04:00:38,435][WARN ][oexsasmNativeRoleMappingStore] [dMy5nR5] レルムのキャッシュをクリアできませんでした [[]]
[2019-03-06T04:00:38,469][INFO ][oelLicenseService ] [dMy5nR5] ライセンス [c91cae39-79d7-4a0e-b40b-b1918a45f80c] モード [トライアル] - 有効
[2019-03-06T04:00:38,477][INFO ][oegGatewayService ] [dMy5nR5] は [5] 個のインデックスを cluster_state に回復しました
[2019-03-06T04:00:38,902][WARN ][oexsasmNativeRoleMappingStore] [dMy5nR5] レルムのキャッシュをクリアできませんでした [[]]
[2019-03-06T04:00:39,106][INFO ][oecraAllocationService] [dMy5nR5] クラスターのヘルス ステータスが [RED] から [YELLOW] に変更されました (理由: [shards started [[mynote2][2]] ...])。

2. 次に、free -m を使用してメモリ使用量を確認します。1.7G のスワップが使用されていることがわかります。

[esyonghu@localhost elasticsearch-6.4.0]$ 無料 -m
    キャッシュされた未使用の共有バッファの合計
会員番号: 980 916 64 0 3 33
-/+ バッファ/キャッシュ: 880 100
スワップ: 4095 1735 2360
[esyonghu@localhost elasticsearch-6.4.0]$

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • Linux システム診断: メモリの基礎を詳しく解説
  • Linux でメモリ使用量を確認する方法
  • Linux システムはなぜ「メモリ」を消費するのでしょうか?
  • Linux システム v の共有メモリ問題を解決する
  • CPU、マシンモデル、メモリなどの情報を表示するLinuxシステム
  • Linux カーネル デバイス ドライバーのメモリ管理に関する注意事項
  • Linux で大容量メモリ ページを持つ Oracle データベースを最適化する方法
  • Linux仮想メモリについての簡単な説明

<<:  CocosCreator スケルトンアニメーション ドラゴンボーン

>>:  MySQL準備原理の詳細な説明

推薦する

サイト全体を灰色にするCSSコードのまとめ

国務院は本日、新型コロナウイルス感染症との闘いで殉教した方々と犠牲者に対し、全国各民族人民の深い哀悼...

Dockerfileの指示と基本構造の説明

Dockerfile を使用すると、ユーザーはカスタム イメージを作成できます。基本構造Docker...

Vueの自己ネストツリーコンポーネントの使い方の詳細な説明

この記事では、Vueの自己ネストツリーコンポーネントの使い方を参考までに紹介します。具体的な内容は次...

JS におけるメモリと変数の保存についての詳細な説明

目次序文JSマジックナンバー数値の保存バイナリ変換方法なぜ 0.1 + 0.2 !== 0.3 なの...

Linux サーバー上のローカル静的リソースにアクセスするために nginx を使用する方法

1. ポート 80 が占有されているかどうかを確認します。通常、ポート 80 は Apache サー...

Vue でインデックスをキー属性値として使用することが推奨されないのはなぜですか?

目次序文キーの役割差分アルゴリズムにおけるキーの役割ヘッドノードを同期するテールノードを同期する新し...

Dockerプライベートウェアハウスレジストリの導入

使用される Docker イメージが増えるにつれて、イメージを保存する場所、つまりウェアハウスが必要...

Nginx で 403 forbidden を解決するための完全な手順

ウェブページに403 Forbiddenと表示されるNginx (yum インストール ログは通常 ...

JavaScriptアップロードファイル制限パラメータケースの詳細な説明

プロジェクトシナリオ: 1. アップロードファイルの制限関数: 1. フロントエンド操作による異常な...

シンプルな HTML ビデオ プレーヤーを実装する方法

この記事では、シンプルな HTML ビデオ プレーヤーを実装する方法を紹介し、皆さんと共有します。詳...

アイデア展開Tomcatサービス実装プロセス図

まずプロジェクトの成果物を構成するスタートアップ項目の設定 Tomcatサービスを作成する開始したい...

Nginx でバージョン番号を隠す方法

Nginx はバージョン番号を非表示にする実稼働環境では、セキュリティ上の脆弱性の漏洩を避けるために...

Mysql InnoDBとMyISAMの違いの分析

MySQL は、myisam、innodb、memory、archive、example など、多く...

JS を使用して配列内の要素の存在を 10 分で判断する

序文フロントエンド開発では、配列内に要素が存在するかどうかを判断する必要があることがよくあります。実...

Vueはシンプルなスライダー検証を実装する

この記事の例では、Vueスライダー検証の実装を共有しています。コードは次のとおりです。 <テン...