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]# 再起動

	[email protected] からのブロードキャストメッセージ
		(/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準備原理の詳細な説明

推薦する

Hタグの定義と注意事項について簡単に説明します

結果から判断すると、タイトルを定義するための固定パターンはなく、すべてむしろランダムな感じがします。...

Ubuntu ベースのディストリビューションに Microsoft TrueType フォントをインストールするチュートリアル

Linux 上の LibreOffice で Microsoft ドキュメントを開くと、フォントが少...

JS でパブリッシュ サブスクライブ モデルを作成する

目次1. シーン紹介2 コードの最適化2.1 ファンを増やす問題を解決する2.2 作品追加の問題を解...

Linx awk入門チュートリアルの詳細な説明

Awk はテキスト ファイルを処理するためのアプリケーションであり、ほぼすべての Linux システ...

MySQLテーブルの内容の変更を監視し、MySQL binlogを有効にする

序文binlog は、MySQL のすべての追加、削除、および変更ステートメントを記録するバイナリ ...

jQuery+h5 で 9 マス抽選特殊効果を実現 (フロントエンドとバックエンドのコード)

序文:フロントエンド: jq+h5 で 9 グリッドのダイナミック効果を実現バックエンド: thin...

JavaScript デザインパターンの学習 アダプタパターン

目次概要コードの実装要約する概要アダプタ パターンは、デザイン パターンの動作パターンのパターンです...

@media レスポンシブ CSS を使用してさまざまな画面に適応する例

定義と使用@media クエリを使用すると、さまざまなメディア タイプに異なるスタイルを定義できます...

MySQLのマスタースレーブ構成を使用して、読み取りと書き込みの分離を実現し、データベースの負荷を軽減します。

大規模な Web サイトでは、多数の同時アクセスを処理するために、Web サイト上の分散負荷分散以上...

Vueは製品の拡大鏡効果を実現します

この記事の例では、製品の拡大鏡効果を実現するためのVueの具体的なコードを共有しています。具体的な内...

Zabbix による SQL Server の監視プロセスの詳細な説明

Zabbix による SQL Server の監視を見てみましょう。まずfreetdsをダウンロード...

Windows システムの MySQL が中国語を入力および表示できない問題の解決方法

ステップ 1: メモ帳を使用して、MySQL インストール ディレクトリの「my.ini」ファイルを...

Next.js 入門チュートリアル

目次導入Next.jsプロジェクトを作成するNext.js プロジェクトを手動で作成するcreact...

MySQL 8.0.20 Window10無料インストール版設定とNavicat管理チュートリアルグラフィック詳細説明

1. MySQL 8.0.20をダウンロードして解凍するダウンロードリンク: https://dev...

CentOS 7.5 に Docker をインストールする詳細なチュートリアル

Docker入門Docker は、アプリケーションをより速く配信するのに役立つオープンソースのコンテ...