目次と序文

  1. はじめに-要件と理由
  2. 長所と短所-ドロップレット
  3. VPSで有効になっているかどうかを確認します
  4. パーティションの交換、ファイルの交換、およびディスクイメージ
  5. スワップファイルの作成
  6. スワップの有効化と無効化
  7. 構成、優先度、sysctl設定
  8. 結論

序文

この記事では、仮想メモリまたはスワップファイル(ページング)を使用することの長所と短所、ドロップレットがすでに仮想メモリまたはページングを使用しているかどうかの判断、スワップパーティションとスワップファイルの違い、スワップファイルの作成方法に関する情報について説明します。 、およびシステムの「スワップネス」を構成する方法(仮想メモリを使用する可能性と、使用する適切なサイズを決定する方法)。

スワップ(ページング)および仮想メモリの詳細については、ウィキペディアを参照してください。 この記事の範囲外の多くの質問に答えます。

ウィキペディアのページング(スワップファイル)の記事からの引用:(明確な説明のために2番目の段落を強調)

「コンピュータのオペレーティングシステムでは、ページングは、コンピュータがメインメモリで使用するためにセカンダリストレージからデータを保存および取得できるメモリ管理スキームの1つです。 ページングメモリ管理スキームでは、オペレーティングシステムは、ページと呼ばれる同じサイズのブロックでセカンダリストレージからデータを取得します。 メモリセグメンテーションに対するページングの主な利点は、プロセスの物理アドレス空間を非連続にすることができることです。 ページングが使用される前は、システムはプログラム全体をストレージに連続して適合させる必要があり、これがさまざまなストレージと断片化の問題を引き起こしていました。」

「ページングは、ほとんどの最新の汎用オペレーティングシステムにおける仮想メモリ実装の重要な部分であり、物理ランダムアクセスメモリ(RAM)に収まらないデータにディスクストレージを使用できるようにします。」

ノート

従来の回転式ハードドライブを使用するシステムでは一般にスワップが推奨されますが、SSDでスワップを使用すると、時間の経過とともにハードウェアの劣化の問題が発生する可能性があります。 この考慮事項のため、DigitalOceanまたはSSDストレージを利用するその他のプロバイダーでスワップを有効にすることはお勧めしません。 そうすることは、あなたとあなたの隣人のための基礎となるハードウェアの信頼性に影響を与える可能性があります。

サーバーのパフォーマンスを向上させる必要がある場合は、Dropletをアップグレードすることをお勧めします。 これにより、一般的に良い結果が得られ、サービスに影響を与える可能性のあるハードウェアの問題に寄与する可能性が低くなります。

はじめに-要件と理由

それは何ですか、なぜ私はそれを使うのですか?

512mbの液滴または8gbの液滴があるかどうか。 Arch、Fedora、CentOS、Debian、またはUbuntu; アプリケーションまたはサーバー/デーモンは、物理的に持っているよりも多くのメモリ(または場合によってはより多くのメモリが割り当てられている)を必要とする場合があります。 より具体的には、この場合、ジョブを実行するために仮想サーバーに割り当てられたものです。

本番サーバーを扱っている場合は、仮想メモリが有効になっておらず、システムに空きメモリがない場合、プログラムまたはサービス(おそらくWebサーバー)がより多くのメモリを割り当てる必要があるかどうかを知る必要があります。失敗します! プラットフォームと構成によっては、これにより、他のアプリケーション(つまり、 メモリを要求するプロセス以外のプロセス)は、必要なメモリを解放するために強制的に閉じられ、プログラム(またはサーバー全体)が完全に失敗してクラッシュします。

このため、私は個人的に、ドロップレット、専用サーバー、Windows PCまたはMac、さらにはAndroidタブレットや電話など、ほぼすべてのシステムで、少なくとも少量の仮想メモリを有効にすることをお勧めします。

使い方

仮想メモリを使用すると、システム(およびアプリ)に、システムが物理的に持っているもの(ドロップレットの場合は割り当てられているもの)を超える追加の仮想RAMを追加できます。 これは、ディスクを追加の「仮想」メモリに使用し、必要に応じてシステムメモリと仮想メモリとの間でデータを交換することで実現します。

ディスクからの読み取り/書き込み(DigitalOceanの超高速SSDでさえ)は、実際のシステムRAMからの読み取り/書き込みよりも少なくとも数倍遅いことに注意する必要があります。 仮想メモリを使用すると、余裕ができ、1つのドロップレットでより多くのアプリケーション/サーバーを実行でき、メモリ不足エラーを防ぐことができますが、実際にメモリを増やす必要がある場合や仮想サーバーをアップグレードする場合の代替ソリューションではありません。

この記事の内容は、経験豊富な管理者にとっては些細なことのように思えるかもしれませんが、DigitalOceanのホスティングサービスを使用するすべての人、特にDigitalOcean、VPSシステム全般、または独自のサーバーの管理に不慣れな人にとっては貴重な情報だと思います。

要件

要件は非常に単純であり、この手法はすべてのディストリビューションとドロップレットタイプで機能するはずです。実際、Androidフォンまたはタブレット(rootとbusyboxがインストールされている場合)でも機能します。

  • 電源がオンになっているドロップレットサーバーまたは仮想サーバー(または専用サーバー、Linuxベースのシステムなど)
  • ルートターミナルアクセス(ssh、vnc、ローカル)
  • コマンドfree swapon swapoff dd mkswap が使用され、これらはすべてドロップレットで使用するすべてのプラットフォームで利用できます。

ほとんどのプラットフォームは仮想メモリを自動的に使用および管理し、インストール中に特別なスワップパーティションまたはファイルをシステムパーティションに自動的に作成します。サイズは通常、使用可能なシステムRAMに基づいているか、その倍数です。 512MBのRAMに対して1024MBのスワップ。

これは、DigialOceanのドロップレットを含む仮想サーバーでは常に当てはまるとは限りません。

長所と短所-ドロップレット

DigitalOceanのドロップレットはSSD(ソリッドステートディスク)を使用します。SSD(ソリッドステートディスク)は、通常のハードドライブよりも数倍高速で、シーク時間が短く(ハードドライブのヘッドがデータを読み取るためにディスク上を物理的に移動する必要があるため)、1秒あたりのIO要求が少なくなります。 。 SSDは複数のエリアから同時に読み取ることができますが、ハードドライブは通常一度に1つのエリアからしか読み取ることができません。

特にWeb、メール、データベースサーバーでは、仮想メモリに大きく依存することは決して良い考えではありませんが、DOのSSDは、仮想メモリの使用をより簡単に、より論理的にするのに役立ちます。

長所

  • OOM(メモリ不足)エラー、クラッシュ、メモリ関連のシステムの予測不可能性/不安定性に対する保護。
  • システムで使用可能なメモリを増やし、より多くのプログラムを同時により安全に実行できるようにします
  • DigtalOceanのSSDストレージは、ページングの応答時間を増やしながら、VM関連のラグとスラッシングを削減します

短所

  • スラッシングが発生する可能性があります。システムがビジーで、物理的に使用可能なメモリよりも平均して多くのメモリをアクティブに使用している場合、VMシステムは、必要に応じて、プログラムデータをディスクとの間で継続的に「スワップ」し、RAMとの間で継続的に「スワップ」します。 私たちはおそらく、ハードドライブが際限なくすり減っているように見えるハードドライブでわずかに過負荷になっているWindowsPCでこの結果を見たことがあるでしょう。 それは耐えられないほど遅く、楽しくありません。 ただし、これは正しい構成で回避できます。これは、ここでもそれほど悪くない1つの欠点です。これも、DigitalOceanのSSDの速度によるものです。
  • 通常、システムメモリに応じて、ディスクスペースを使用します。 ドロップレットの容量が512mbの場合、スワップには512mb〜1.5gbを使用することをお勧めします。 ただし、これは512MBです。ドロップレットのディスクで使用できるスペースは1.5GB少なくなります。
  • 一般的に、スワップには専用のディスクパーティションを使用することをお勧めします。 ただし、これはドロップレットでは不可能であり、代わりにスワップファイル/ディスクイメージを使用する必要があります。

VPSで有効になっているかどうかを確認します

構成ですでに仮想メモリが使用されている可能性は十分にあります。 以下のコマンドは、有効になっているかどうかを判断する方法と、有効になっている場合はサイズと構成を示しています。

サーバーに対してターミナルまたはSSH/VNCを開きます。これらのコマンドはすべて、ターミナルまたはシェルで実行されます。

変更を加えるには、rootである必要があることを忘れないでください。 whoami コマンドを使用して、ログインしているユーザーを確認できます。 ルートまたは0で応答しない場合は、次のように入力できます su ルートシェルを開始します。

ターミナルのプロンプトで「free」コマンドを入力すると、ドロップレットで仮想メモリがすでに有効になっているかどうかを確認できます。

[email protected]:/# free

「free」コマンドは、システムで使用可能な物理メモリと仮想メモリを表示します。

すでに仮想メモリを有効にしている場合は、「スワップパーティションに関する注意」に進んでから、構成セクションに進んでください。 有効にすると、出力は次のようになります。

[email protected]:/# free
             total       used       free     shared    buffers     cached
Mem:        361996     360392       1604          0       1988      54376
-/+ buffers/cache:     304028      57968
Swap:       249896          0     249896
[email protected]:/# _

有効になっていない場合、出力は次のようになります。

[email protected]:/# free
             total       used       free     shared    buffers     cached
Mem:        361996     360392       1604          0       2320      54444
-/+ buffers/cache:     303628      58368
Swap:            0          0          0
[email protected]:/# _
<p>You can also narrow down the output with <code>free | grep Swap</code>. This will only show the <b>Swap:</b> line, total, used and free VM. (Remember, by default, grep is case sensitive!)</p>
[email protected]:/# free | grep Swap
Swap:       249896          0     249896
[email protected]:/# _

パーティションの交換、ファイルの交換、およびディスクイメージ

スワップパーティションに関する注意

一般に、Linuxベースのシステムの場合、ハードディスクに専用のスワップパーティションを作成することをお勧めします。 ほとんどのシステムは通常のインストール中にこれを自動的に実行します。スワップがすでに構成されている場合は、パーティションを使用してセットアップされている可能性があります。 残念ながら、以下の sysctl 設定を構成する以外に、スワップパーティションのサイズ変更はこの記事の範囲外です。

ただし、ここに示す方法を使用して、スワップファイルを追加し、パーティション化されたスワップ領域を超えて使用可能な仮想メモリを増やすことができます。 ただし、スワップがシステムによってすでに構成および管理されている場合は、追加の仮想メモリが不要である可能性があり、何をしているのかわからない限り、デフォルト設定のままにしておく方がよい場合があります。

スワップファイルとは何ですか?

一部のシステム(特にWindows)は、専用のパーティションを使用する代わりに、仮想メモリを特別なファイルに保存します。 これは、パーティショニングが不可能または実行可能でない場合のオプションでもあります。 Linuxでは、このファイルは実際にはディスクイメージです。

ディスクイメージとは何ですか?

ディスクイメージには通常、ファイルとそれらのファイルに関する情報、およびそれらを含むファイルシステムが含まれています。

例としては、液滴のスナップショット(私は雪片と呼んでいます-凍結した液滴)、バックアップ、複製、移行などのために液滴全体のディスクイメージを作成する機能があります。

もう1つの代表的な例は、ほとんどのLinuxディストリビューション(またはディストリビューション)がディスクイメージとして提供され、通常は .iso 形式であるため、マウントするか、ディスクに書き込むことができます。

どのように画像を使用する場合でも、覚えておくべき重要なことは、ファイルシステム情報を保存することです。そのため、画像を作成したファイルシステムと同じように使用することも、完全に再作成することもできます。

スワップファイルの作成

ドロップレットの場合、ストレージをパーティション分割できないため、ディスクイメージを使用する必要があります。 * NIXオペレーティングシステムはスワップ専用のファイルシステムを使用します。これが、前述したように、パーティションの使用が推奨される理由です。 必要な仮想メモリに応じたサイズの空のディスクイメージを作成し、スワップファイルシステムで初期化してからオンにします。

まず、このファイルを配置する場所を決定する必要があります。 スワップに使用するMBの量に関係なく、配置するパーティションに十分な空き容量が必要です。 512MBのスワップにより、最大512MBのスワップファイルが作成されます。

コマンドを使用できます df -h マウントされたパーティションとファイルシステム、およびそれらのサイズと空き領域を表示します。

このファイルを/varに配置し、「swap.img」と呼ぶことをお勧めします。 / varにcdしてこのファイルを作成し、そのアクセス許可を600に設定します。

注:セキュリティ上、ファイルのアクセス許可を600に設定して、他のユーザーがファイルを直接読み取れないようにすることが重要です。そうしないと、システムメモリが読み取られたり悪化したりする可能性があります。

[email protected]:/# cd /var
[email protected]:/var# touch swap.img
[email protected]:/var# chmod 600 swap.img
[email protected]:/var# _

サイジング

次に、ファイルのサイズを設定します。 サイズ設定は重要であり、最適なサイズはシステムとユースケースによって異なります。

一般的に、使用可能なシステムRAMの1〜2倍をお勧めします。 したがって、512mbの液滴がある場合は、512mb-1gbのスワップを使用します。 1GBの液滴がある場合は、1GBから2GBのスワップなどを使用します。 これは厳格なルールではありません。たとえば、4 GBの液滴がある場合は、スワップをほとんど(512 mb)使用しないか、まったく使用しないのが最適な場合があります。

それは完全にあなたの使用に依存します、しかしこれらの指示は512mbの液滴のために調整されます。 コマンドddを使用して、スワップファイルをゼロまたは無で埋め、必要なサイズに拡大します。 この場合、1GBまたは1024MBを使用しています。 これには1分かかる場合があります。

[email protected]:/var# dd if=/dev/zero of=/var/swap.img bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 4.0868896 s, 253 MB/s
[email protected]:/var# _

ディスクイメージの準備

ここでは、スワップファイルシステムを初期化します。

[email protected]:/var# mkswap /var/swap.img
Setting up swapspace version 1, size = 1020 GiB
no label, UUID=72761533-8xbe-436l-b07e-c0sabe9cedf3
[email protected]:/var# _

それが完了すると、使用できるようになります。

スワップの有効化と無効化

スワップファイルを有効にする

swaponを使用して有効にします。 成功すると出力はありませんが、で確認できます free.

[email protected]:/var# swapon /var/swap.img
[email protected]:/var# free
             total       used       free     shared    buffers     cached
Mem:        503596     478928      24668          0      38832     102384
-/+ buffers/cache:     337712     165884
Swap:      1048572       1780    1046792
[email protected]:/var# _

使用できます swapoff /var/swap.img それをオフにします。

起動時にスワップファイルを有効にする

swapon は、現在のブートでのみファイルを有効にすることに注意してください。 再起動すると、スクリプトを作成しない限り、オンラインに戻りません。 swapon 起動時に実行するか、 /etc/fstab ほとんどの場合、これははるかに簡単で、ここで使用する方法です。

あなたがしなければならないのはあなたに線を追加することです /etc/fstab 起動時に準備するためのファイル。 気をつけて! このファイルは、正しくフォーマットされていない場合、または上書きされている場合、システムを破壊する可能性があります。 swap.imgを/varに入れると、以下のコマンドを問題なくコピーして貼り付けることができます。 (入力する場合は、>記号が2つあることを確認してください。1つを使用すると、最後に行を追加する代わりにファイルが上書きされます。

[email protected]:/var# echo "/var/swap.img    none    swap    sw    0    0" >> /etc/fstab
[email protected]:/var# _

構成、優先度、sysctl設定

構成

スワップスペースがオンラインになったら、構成する必要のあるものはそれほど多くありません。 本質的な詳細に興味がない場合は、ここで停止することもできます。通常、有効にすると、ほとんどのセットアップで問題なく機能します。

優先順位

複数のデバイスおよびデバイスタイプにまたがるスワップファイルまたはパーティションを使用する場合(ドロップレットではあり得ない)、これらのスワップ領域ごとに優先順位を付けて、低速またはアイドル状態のストレージよりも高速またはアイドル状態のストレージを使用することをお勧めします。または忙しいストレージ。 ほとんどの場合、 swapon のパラメーターとして、または /etc/fstab.

システムは、優先度の低いスワップ領域を使用する前に、優先度の高いスワップ領域を使用します。 swaon -p 例:

[email protected]:/var# swapon -p 100 /var/swap.img
[email protected]:/var# swapon -p 10 /mnt/SecondDrive/swap.img

そして、 /etc/fstab 優先順位は、を使用して設定できます pri= このようなパラメータ:

/var/swap.img none swap defaults,pri=100 0 0
/mnt/SecondDrive/swap.img none swap defaults,pri=10 0 0

sysctl設定(およびsysfs)

コマンドsysctlを使用して、Linux仮想メモリマネージャー専用の設定を変更します。

変更することをお勧めする設定は1つだけです。 vm.swappiness. この設定は、Linuxカーネル/VMハンドラーにVMを使用する可能性を指示します。 これは、0〜100のパーセント値です。

この値を0に設定すると、VMハンドラーは使用可能なスワップスペースを使用する可能性が最も低くなり、使用可能なすべてのシステムメモリを最初に使用する必要があります。 100に設定すると、VMハンドラーは使用可能なスワップスペースを使用する可能性が高くなり、システムメモリの大部分を使用できるように解放しようとします。

個人的には30%の値を使用することをお勧めします。これは、スワッピングとシステムメモリの間の幸せな媒体になるはずです。 この値は、ハードルールというよりも目標の目標であることに注意してください。

以下は、sysctl設定を変更する方法の例です。 詳細については、次のように入力できます sysctl --help また man sysctl.

[email protected]:/var# sysctl -w vm.swappiness=30
vm.swappiness = 30
[email protected]:/var# _

実行することもできます sysctl -a すべてのsysctlオプション(VMだけでなく)を一覧表示する、または sysctl -a | grep vm..

または、単一の設定を表示するには(各設定のgrepコマンドの後でキー名を変更できます):

[email protected]:/var# sysctl -a | grep vm.swappiness
vm.swappiness = 30
[email protected]:/var# _

Linux VM(vm。*)には他にも多くの設定がありますが、これらはこの記事の一般的な範囲外であり、通常は設定を変更しないことをお勧めします。 ただし、この記事の最後(付録)に、微調整または学習する価値のあるオプションの小さなリストを含め、それらのオプションの推奨値(括弧内)を追加しました。

LinuxカーネルのWebサイトには、オプションとその使用法の完全なリストがありますが、すべてのカーネルがすべてのオプションを実装しているわけではありません。 この記事を書いている時点では、このドキュメントはすでに少し古くなっていますが、決して役に立たない、または非難されているわけではありません。 リンクは次のとおりです:https://www.kernel.org/doc/Documentation/sysctl/vm.txt

このドキュメントの説明の中には、設定を「ファイル」と呼んでいるものがあります。これは、Linuxの SysFS(Wikipedia)システムからもアクセス/構成できるためです。

結論

私の記事を読んでいただきありがとうございます。 これで、実稼働環境およびドロップレットまたは仮想マシンのコンテキスト内での安定性におけるページング/スワップファイルの重要性を理解する必要があります。

コメント、訂正、クッキーは大歓迎です! nom..nom..nom.。

参考資料と付録

使用される参照、リンク: LinuxカーネルVMドキュメント(kernel.org) SysFSシステム(Wikipedia)スワップ(ページング)(Wikipedia) 仮想メモリ(Wikipedia)

以下は、微調整または学習する価値のあるsysctl / sysfs vm関連のオプションのリストと、いくつかの設定に対する私の推奨値です。 これらの説明は意図的に短くしています。詳細については、kernel.orgのリファレンスリンクを参照してください。

dirty_background_bytes**
	
	Contains the amount of dirty memory at which the background kernel flusher threads
	will start writeback.
		
	Note: dirty_background_bytes is the counterpart of dirty_background_ratio. Only
	one of them may be specified at a time. When one sysctl is written it is
	immediately taken into account to evaluate the dirty memory limits and the
	other appears as 0 when read.

dirty_background_ratio**
	
	Contains, as a percentage of total system memory, the number of pages at which
	the background kernel flusher threads will start writing out dirty data.
	
	Note: dirty_background_ratio is the counterpart of dirty_background_bytes. Only
	one of them may be specified at a time. See above.

dirty_bytes**
	
	Contains the amount of dirty memory at which a process generating disk writes
	will itself start writeback.
	
	Note: dirty_bytes is the counterpart of dirty_ratio. Only one of them may be
	specified at a time. When one sysctl is written it is immediately taken into
	account to evaluate the dirty memory limits and the other appears as 0 when
	read.

dirty_expire_centisecs**

	This tunable is used to define when dirty data is old enough to be eligible
	for writeout by the kernel flusher threads.  It is expressed in 100'ths
	of a second.  Data which has been dirty in-memory for longer than this
	interval will be written out next time a flusher thread wakes up.

dirty_ratio**

	Contains, as a percentage of total system memory, the number of pages at which
	a process which is generating disk writes will itself start writing out dirty
	data.
	
	Note: dirty_bytes is the counterpart of dirty_ratio. Only one of them may be
	specified at a time. See above.

dirty_writeback_centisecs**

	The kernel flusher threads will periodically wake up and write `old' data
	out to disk.  This tunable expresses the interval between those wakeups, in
	100'ths of a second.
	
	Setting this to zero disables periodic writeback altogether.

drop_caches**

	Writing to this will cause the kernel to drop clean caches, dentries and
	inodes from memory, causing that memory to become free.

laptop_mode** (0 or Off for servers)

	laptop_mode is a knob that controls "laptop mode". All the things that are
	controlled by this knob are discussed in Documentation/laptops/laptop-mode.txt.

memory_failure_recovery** (1 or On if supported)

	Enable memory failure recovery (when supported by the platform)
	
	1: Attempt recovery.
	
	0: Always panic on a memory failure.

min_free_kbytes** (2048kb to 4096kb)

	This is used to force the Linux VM to keep a minimum number
	of kilobytes free.  The VM uses this number to compute a
	watermark[WMARK_MIN] value for each lowmem zone in the system.
	Each lowmem zone gets a number of reserved free pages based
	proportionally on its size.
	
	Some minimal amount of memory is needed to satisfy PF_MEMALLOC
	allocations; if you set this to lower than 1024KB, your system will
	become subtly broken, and prone to deadlock under high loads.
	
	Setting this too high will OOM your machine instantly.

oom_dump_tasks**

	Enables a system-wide task dump (excluding kernel threads) to be
	produced when the kernel performs an OOM-killing and includes such
	information as pid, uid, tgid, vm size, rss, nr_ptes, swapents,
	oom_score_adj score, and name.  This is helpful to determine why the
	OOM killer was invoked, to identify the rogue task that caused it,
	and to determine why the OOM killer chose the task it did to kill.
	
oom_kill_allocating_task**

	This enables or disables killing the OOM-triggering task in
	out-of-memory situations.
	
overcommit_memory**

	This value contains a flag that enables memory overcommitment.

overcommit_ratio**

	When overcommit_memory is set to 2, the committed address
	space is not permitted to exceed swap plus this percentage
	of physical RAM.  See above.

page-cluster**

	page-cluster controls the number of pages up to which consecutive pages
	are read in from swap in a single attempt. This is the swap counterpart
	to page cache readahead.
	
panic_on_oom** (0 or Off/disabled)

	This enables or disables panic on out-of-memory feature.

swappiness** (30 to 50)

	This control is used to define how aggressive the kernel will swap
	memory pages.  Higher values will increase agressiveness, lower values
	decrease the amount of swap.

vfs_cache_pressure**

	Controls the tendency of the kernel to reclaim the memory which is used for
	caching of directory and inode objects.

著作権で保護されている、または保護されている可能性のある引用部分は、フェアユースの資格として教育目的で使用されます。

投稿者: Jai Boudreau