MongoDBのパフォーマンスは、基盤となるリソースをどのように利用するかによって異なります。データをメモリだけでなくディスクにも保存します。 CPUリソースを使用して操作を実行し、ネットワークを使用してクライアントと通信します。その一般的な活気をサポートするための十分なリソースが必要です。この記事では、MongoDBデータベースシステムのさまざまなリソース要件と、それらを最適化して最大のパフォーマンスを実現する方法について説明します。
MongoDBの要件
RAMやCPUなどの大規模なリソースをデータベースに提供するだけでなく、オペレーティングシステムを調整することで、パフォーマンスをある程度向上させることもできます。 MongoDB環境を確立するために必要な重要なユーティリティは次のとおりです。
- 十分なディスク容量
- 十分なメモリ
- 優れたネットワーク接続。
MongoDBの最も一般的なオペレーティングシステムはLinuxであるため、データベース用に最適化する方法を見ていきます。
再起動条件。
Linuxに適用できるチューニング手法はたくさんあります。ただし、一部の変更はホストを再起動せずに行われるため、変更を加えた後に再起動して、それらが確実に適用されるようにすることをお勧めします。このセクションでは、これから説明するチューニングの実装は次のとおりです。
- ネットワークスタック
- NTPデーモン
- Linuxユーザー制限
- ファイルシステムとオプション
- セキュリティ
- 仮想メモリ
ネットワークスタック
他のソフトウェアと同様に、優れたネットワーク接続は、サーバーとの要求と応答のためのより優れた交換インターフェースを提供します。ただし、MongoDBは、Linuxのデフォルトのカーネルネットワークチューニングではサポートされていません。名前が示すように、これは、ユーザー領域、カーネル領域、デバイス領域の3つの主要な層に分類できる多くの層の配置です。ユーザー領域とカーネル領域は、タスクがCPUによって実行されるため、ホストと呼ばれます。デバイス領域は、ネットワークインターフェイスカードと呼ばれるインターフェイスを介してパケットを送受信します。 MongoDB環境でのパフォーマンスを向上させるには、ホストを1Gbpsのネットワークインターフェイス制限に制限する必要があります。この場合、調整する必要があるのは、次のような比較的スループットの設定です。
- net.core.somaxconn(値を増やす)
- net.ipv4.tcp_max_syn_backlog(値を増やす)
- net.ipv4.tcp_fin_timeout(値を減らす)
- net.ipv4.tcp_keepalive_intvl(値を減らす)
- net.ipv4.tcp_keepalive_time(値を減らす)
これらの変更を永続的にするには、新しいファイル/etc/sysctl.d/mongodb-sysctl.confが存在しない場合は作成し、これらの行を追加します。
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_max_syn_backlog = 4096
次に、変更を永続的に適用するために、rootユーザー/ sbin /sysctl-pとしてコマンドを実行します。
NTPデーモン
ネットワークタイムプロトコル(NTP)は、Linuxシステムのソフトウェアクロックをインターネットタイムサーバーと同期させる手法です。クラスターであるMongoDBは、ノード間の時間の一貫性に依存しています。このため、NTPをMongoDBホストで永続的に実行することが重要です。 NTP構成の重要性は、ネットワークが切断された後、一定時間サーバーに継続的にサービスを提供することです。デフォルトでは、NTPはクライアント側にインストールされるため、MongoDBがDebian / UbuntuフレーバーのLinuxシステムにNTPをインストールするには、次のコマンドを実行するだけです。
$ sudo apt-get install ntp
ntp.confにアクセスして、さまざまなOSのNTPデーモンの構成を確認できます。
Linuxユーザー制限
ユーザー側の障害がサーバーとホストシステム全体に影響を与える場合があります。これを回避するために、Linuxシステムは、ユーザーごとに実行されるプロセスに関して、いくつかのシステムリソース制限を引き受けるように設計されています。これは明らかですが、MongoDBをこのようなデフォルトのシステム構成にデプロイすることは、デフォルトのプロビジョニングよりも多くのリソースを必要とするため、不適切です。さらに、MongoDBは多くの場合、基盤となるハードウェアを利用するための主要なプロセスであるため、そのような専用の使用法のためにLinuxシステムを最適化することが主流になります。その後、データベースは利用可能なリソースを完全に活用できます。
ただし、この制限制約を無効にしたり、無制限の状態に設定したりするのは便利ではありません。たとえば、CPUストレージまたはRAMが不足している場合、小さな障害が大きな問題にエスカレートし、他の機能が失敗する可能性があります。たとえば、最初の問題を解決するために不可欠なSSHなどです。
より適切な見積もりを実現するには、データベースレベルでの制約要件を理解する必要があります。たとえば、データベースにリクエストを送信するユーザーの数と処理時間を見積もります。 MongoDBを監視するための重要事項を参照できます。 max-user-processesとopen-filesの最も望ましい制限は64000です。これらの値を設定するには、/ etc / security / Limits.dとして存在しない場合は新しいファイルを作成し、これらの行を追加します
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 64000
mongod hard nproc 64000
この変更は新しいシェルにのみ適用されるため、この変更を適用するには、mongodを再起動してください。
ファイルシステムとオプション
MongoDBは、ディスク上のデータベースデータにext3、ext4、XFSの3種類のファイルシステムを採用しています。 3を超えるMongoDBバージョンで採用されているWiredTigerストレージエンジンの場合、安定性の問題が発生すると考えられるext4ではなくXFSを使用するのが最適ですが、事前割り当てのパフォーマンスが低いため、ext3も回避されます。 MongoDBは、他のシステムのようにアクセス時のメタデータ更新を実行するデフォルトのファイルシステム手法を使用しません。したがって、アクセス時の更新を無効にして、これらの更新で使用される少量のディスクIOアクティビティを節約できます。
これは、MongoDBデータを提供するディスクのファイルetc/fstabのファイルシステムオプションフィールドにフラグnoatimeを追加することで実行できます。
$ grep "/var/lib/mongo" /proc/mounts
/dev/mapper/data-mongodb /var/lib/mongo ext4 rw, seclabel, noatime, data=ordered 0 0
この変更は、MongoDBを再起動または再起動した場合にのみ実現できます。
セキュリティ
Linuxシステムが持ついくつかのセキュリティ機能の中には、カーネルレベルでセキュリティが強化されたLinuxがあります。これは、きめ細かい強制アクセス制御の実装です。これは、操作を続行するかどうかを決定するためのセキュリティポリシーへのブリッジを提供します。残念ながら、多くのLinuxユーザーは、このアクセス制御モジュールを警告のみに設定するか、完全に無効にします。これは多くの場合、予期しない許可拒否エラーなどの関連する挫折が原因です。このモジュールは、多くの人が無視しているように、サーバーへのローカル攻撃を減らすのに大きな役割を果たします。この機能を有効にし、コレスポンデントモードをポジティブに設定すると、MongoDBに安全なバックグラウンドが提供されます。したがって、SELinuxモードを有効にし、特にインストールの開始時にEnforcingモードを適用する必要があります。 SELinuxモードをEnforcingに変更するには:コマンドを実行します
$ sudo setenforce Enforcing
実行することで、実行中のSELinuxモードを確認できます
$ sudo getenforce
SomeninesがMongoDBDBAになる-MongoDBを本番環境に導入MongoDBDownloadを無料でデプロイ、監視、管理、スケーリングするために知っておくべきことを学びましょう 仮想メモリ
ダーティレシオ
MongoDBは、キャッシュテクノロジーを採用して、データの迅速なフェッチを強化します。この場合、ダーティページが作成され、それらを保持するためにいくらかのメモリが必要になります。したがって、ダーティ率は、ダーティページを保持できるシステムメモリ全体のパーセンテージになります。ほとんどの場合、デフォルト値は(25〜35)%です。この値を超えると、ページはディスクにコミットされ、ハードポーズを作成する効果があります。これを回避するために、カーネルを設定して、dirty_background_ratioと呼ばれる別の比率でデータを常にフラッシュするように設定できます。この比率の値は、必ずしもハードポーズを作成せずに、バックグラウンドでディスクに対して(10%〜15%)の範囲です。
ここでの目的は、高品質のクエリパフォーマンスを確保することです。したがって、データベースシステムで大容量のメモリが必要になる場合は、バックグラウンド比率を下げることができます。ハードポーズが許可されている場合、データが重複したり、その間に一部のデータが記録されなかったりする可能性があります。また、キャッシュサイズを減らして、データが小さなバッチで頻繁にディスクに書き込まれ、ディスクスループットが向上する可能性を回避することもできます。現在実行中の値を確認するには、次のコマンドを実行できます:
$ sysctl -a | egrep “vm.dirty.*_ratio”
このようなものが表示されます。
vm.dirty_background_ratio = 10
vm.dirty_ratio = 20
Swappiness
これは、仮想メモリマネージャの動作に影響を与える可能性のある1〜100の範囲の値です。 100に設定すると、ディスクに強制的にスワップし、0に設定すると、メモリ不足の問題を回避するためだけにスワップするようにカーネルに指示されます。 Linuxのデフォルトの範囲は50〜60で、そのうちデータベースシステムには適していません。私自身のテストでは、0〜10の値を設定するのが最適です。この値は、/ etc / sysctl.conf
でいつでも設定できます。vm.swappiness = 5
次に、コマンドを実行してこの値を確認できます
$ sysctl vm.swappiness
これらの変更を適用するには、コマンド/ sbin / sysctl -pを実行するか、システムを再起動します。