...

データベースサーバーにおけるLinuxのvm.max_map_countを理解し、最適に設定する

ここでは、その方法を説明します。 vm.max_map_count Linuxデータベースサーバーの状況を把握し、測定し、リスクなく調整する方法。本記事では、PostgreSQL、MySQL/MariaDB、Elasticsearch、OpenSearchが負荷下でも安定して動作するよう、具体的な手順、一般的な設定値、実運用で実証済みのチェック方法を紹介します。.

中心点

  • 機能: プロセスごとの仮想メモリ領域(VMA)の上限
  • 関連性: データベース、検索システム、多数のマッピングを含むJavaスタック
  • 症状:「メモリを割り当てられません」、起動エラー、異常終了
  • 実践的価値観: 大規模なワークロード向け:262,144~1,048,576
  • 手続き: 需要を測定し、余裕を持たせて増強し、モニタリングを組み込む

vm.max_map_count とはどういう意味ですか?

このカーネルパラメータは、その数を指定します。 メモリ領域 (VMAs) 1つのプロセスが作成できる最大数です。mmap操作、ロードされた共有オブジェクト、多数のメモリ割り当て、および共有メモリブロックが増えるほど、この数値は増加します。これにより、RAMの容量そのものを制限するのではなく、 数量 仮想アドレス空間内の分離された領域。大規模なプロセスは、少数の大きなマッピングで多くのメモリを使用できますが、断片化されたワークロードは、多数の小さなマッピングによってすぐに限界に達してしまいます。メモリを大量に消費するソフトウェアを運用する場合は、この上限値を把握しておく必要があります。そうしないと、負荷がかかった時点で初めてエラーが発生してしまいます。.

なぜデータベースサーバーが影響を受けるのか

データベースや検索サービスは、主に ミマップ, 、共有メモリ、キャッシュ、および多数のライブラリ。 多くの拡張機能や接続を持つPostgreSQLインスタンス、プラグインを使用するMySQL/MariaDB、あるいは多数のインデックスセグメントを持つElasticsearch/OpenSearchは、多くのVMAを生成します。その数が上限値に近づくと、それ以上のマッピングが失敗し、プロセスは メモリーエラー. まさにその場合に、サービスが起動しなかったり、負荷がかかると中断したり、クラスタ内のノードが失われたりします。私は、必要な上限値を事前に算出し、適切に設定することで、このような挙動を防いでいます。.

誤った設定による症状とリスク

閾値が低すぎることを示す最も一般的な兆候は、以下の通りです。 起動エラー 空きメモリがあるにもかかわらず。Elasticsearch などのサービスは、マシンにまだリソースの余裕があるにもかかわらず、「Cannot allocate memory」というエラーを報告します。また、内部で許可されている上限を超える数の VMA が必要になると、散発的にプロセスが異常終了することもあります。通常、この値を高く設定しても問題はありません。カーネルは単に少し多めの 管理 vm_area_structs にはこれが必要です。これが問題となるのは、プロセスが実際に数百万ものマッピングを作成する場合に限られますが、一般的なデータベースのワークロードでは、通常、その規模には達しません。.

実務上の数値と位置づけ

多くのディストリビューションでは、65,536という控えめなデフォルト値が採用されています。これは単純なサービスには十分ですが、検索や分析の負荷に対しては手狭になります。 一般的なホスティング環境では、大規模なスタックに対して262,144を堅実な初期値として使用しています。非常に大規模なElasticsearch/OpenSearchインスタンスについては、測定値がその方向を示している場合、1,048,576を割り当てます。値を高くしても、直接的な 性能向上, 多数のマッピングが必要な場合にエラーを防ぐ。Linuxカーネルのドキュメントや一般的な実務報告も、この分類を裏付けている。.

アプリの種類 VMAプロファイル(標準) 初期値 vm.max_map_count 上限(必要な場合)
小規模なDB / ツール 低~中 65.536 262.144
PostgreSQL/MySQL 中~高 262.144 524.288
Elasticsearch/OpenSearch 高い・非常に高い 262.144 1.048.576
大規模なJavaスタック 中~高 262.144 524.288

現在の需要を把握する

変更を行うたびに、現在のものを確認します セッティング をもって sysctl vm.max_map_count または cat /proc/sys/vm/max_map_count. その後、以下の方法でプロセスの実際の要件を特定します。 wc -l /proc//maps, 、できれば負荷がかかっている状態で。この値はモジュール、キャッシュ、ワークロードによって変動するため、私は複数の負荷ウィンドウにわたって監視しています。ピーク値が50~70 %の限界に達したら、適切な予備容量を確保します。そうすることで、根拠に基づいた判断を下すことができます。 決定 推測する代わりに。.

vm.max_map_count を安全に調整するには

テストの際は、一時的にこの値を設定して sysctl -w vm.max_map_count=262144, 、これは即座に反映され、再起動すると消えます。常時有効にするには、この値を /etc/sysctl.conf を入力し、 sysctl --system 新しく、そうすることで…… 構成 のままです。大規模な検索クラスターや、非常にモジュール化されたDBスタックは、測定結果によっては524,288から1,048,576の恩恵を受けます。私は段階的に増やすとともに、ログを確認し、ストレージ使用量のメトリクスを監視しています。そうすることで、これを維持しています。 リスク 稼働中の負荷が低く、計画通りにバッファを蓄積できる。.

生産性の高い環境のためのベストプラクティス

単発の測定値に頼るのではなく、通常負荷時およびピーク負荷時に繰り返し測定を行っています。上限値は、観測されたピーク値の限界値ではなく、その2~4倍の値に設定しています。クラスター内では、すべてのノードが同じように反応し、 アウトライアーズ を生成する。モニタリングでは、mmap/malloc に関するエラーや、プロセスごとの VMA 数の推移を確認する。本番環境への投入前に、新しいものをテストしている 価値観 同程度の負荷がかかるステージング環境で。.

他のカーネルパラメータとの相互作用:スワップニス、ダーティ・レシオ、ファイル制限

vm.max_map_count は決して単独で存在することはありません。他の調整パラメータがそれに影響を与えるからです。 行動 同様に、スワップネスは、システムがページをスワップ領域に書き込む頻度を決定するものであり、これによりレイテンシが増加する可能性があります。 ダーティ・レシオは、変更されたページがいつディスクに戻されるかを制御し、それによってI/Oのピークを平滑化したり、逆に悪化させたりします。オープンファイルの制限は、データベースが並行して保持できるファイルやソケットの数を決定します。私はこれらを確認しています パラメータ 新たなボトルネックが生じないよう、協力して取り組む。.

Transparent Huge Pages を重点的に検証する

THPは、大きなページを束ねることでアクセスパターンを変化させ、メモリ管理に影響を与えます。データベースはワークロードによってはTHPの影響を強く受けるため、私はステータスとモードを確認し、レイテンシが上昇した場合は「madvise」または「never」に設定しています。 その影響やチューニングの詳細については、私の記事「 透明な巨大なページ 要約すると。重要なのは、変更を指標で裏付け、やみくもに切り替えないことです。そうすることで、 記憶特性 理解しやすく、再現可能である。.

VFSキャッシュの印刷について理解する

VFSキャッシュはメタデータとファイルの内容をメモリに保存するため、データベースページと競合することになります。以下のパラメータを使用すると、 VFSキャッシュ出力 これにより、システムがこのキャッシュを解放する速度を調整します。圧力が強すぎるとI/O負荷が増加し、弱すぎるとDBキャッシュが追い出され、レイテンシが悪化します。私は少しずつ調整を行い、ページキャッシュのヒット率、I/O待ち時間、スループットへの影響を測定しています。この 微調整 データベースとファイルシステムが密接に連携して動作している場合、その影響は予想以上に大きくなることがよくあります。.

NUMAガイドラインとデータベース

NUMAアーキテクチャでは、メモリがノード間で分散されるため、アクセス時間に影響が出ます。適切なポリシーが設定されていないと、ページが「誤った」ノードに割り当てられ、レイテンシやキャッシュミスが発生しやすくなります。モードやポリシーに関する詳細については、以下で説明しています。 NUMAガイドライン, 、実践的な起動パラメータを含みます。大規模なDBプロセスでは、優先ノードを設定し、インターリービングを確認して、メモリアクセスが ローカル のままです。vm.max_map_count との連携は、プロセスが一貫性のある NUMA 戦略を通じて多数のマッピングを割り当てられる場合に、好影響をもたらします。.

VMAはどのように生まれるのか――そしてなぜ爆発的な人気を博すことがあるのか

VMAの主な発生源として、次の3つを挙げる:(1) ファイルに紐づくマッピング(例:Elasticsearch/OpenSearchのデータセグメントおよびインデックスセグメント)、 (2) アロケーター(glibc、jemalloc、tcmalloc)を介した匿名マッピング、および (3) スレッド用のスタック。多数の小さな共有オブジェクト、JITコード(例:JVM内)、および断片化された割り当てパターンが、さらなる領域を生み出します。 各スレッドは少なくとも1つのスタックVMAを伴うため、ワーカスレッドの数が増加すると、VMAの数も増加します。これが、データ量は同じでもスレッドやプラグインの数が多いシステムほど、より早く限界に達してしまう理由を説明しています。.

重要:「メモリ容量の多さ」と「マッピングの多さ」は区別しています。大きく連続した領域が問題になることはめったにありません。問題となるのは、ソフトウェアが多数の小さなオブジェクトに対して頻繁に ミマップ (アロケータ戦略)を利用したり、ライブラリを動的に読み込んだり、非常に多くのファイルを並列でマッピングしたりする場合。.

VMA 1つあたりのオーバーヘッドはそれほど大きくありません(数百バイトの管理データ)。上限値を高く設定しても、プロセスがそれを利用しない限り、RAM を消費することなく、理論上可能な構造の規模を拡大できます。実際に数十万から数百万もの VMA が生じ始めて初めて、カーネルの管理負荷が測定可能なレベルで顕在化します。.

測定手法の理解を深める:ピークを確実に捉える

  • 私は1日のうちいくつかの時間帯や、ピーク時の負荷(バッチ処理、再インデックス、メンテナンスウィンドウ)の状況下で測定を行っています。.
  • 私は単一のプロセスだけでなく、重要なサービス全体(DB、サイドカー、バックアップ/監視エージェント)を監視しています。.
  • 再現性のある結果を得るために、「コールド」(ページキャッシュが空の状態)と「ウォーム」(キャッシュが満たされた状態)を区別し、その違いを記録しています。.

VMAのホットスポットを見つけるのに役立つ便利なツール:

# VMA数に基づく上位10のプロセス
for p in /proc/[0-9]*; do
 pid=${p##*/}; test -r "$p/maps" || continue
 c=$(wc -l /dev/null || echo 0)
 cmd=$(tr -d '\0' /dev/null)]}"
done | sort -k2,2nr | head -n 10

クラスターの場合、複数のノードにわたる結果を分析し、体系的な外れ値(特定のシャード、特定の拡張機能、バージョンなど)を探します。プロセスの%が閾値の70を超えた場合、またはピーク負荷が傾向として増加している場合にアラートを設定します。.

トラブルシューティング:代表的なログメッセージと確認事項

メモリ制限に達すると、「Cannot allocate memory」、「mmap failed」、「failed to map segment from shared object」といったエラーメッセージが表示されたり、明らかなRAM不足がないにもかかわらず起動が中断されたりすることがよくあります。その場合、私は以下の点を確認します:

  • grep -i mmap /var/log/* および業務固有のログにおけるENOMEMに関する情報
  • 現在のマッピング数: wc -l /proc//maps
  • Ulimit/Nofileの制限。これは、開いているファイル数が十分でない場合、多くのセグメントファイルが適切にマッピングされないためである。
  • スレッド数 (ps -eLo pid,comm,nlwp | sort -k3 -nr | head)、多くのスレッドがVMAの数値を上昇させるため

これらの調査結果を、負荷プロファイル(インデックス構築、Vacuum/Analyze、大規模インポート)と照らし合わせています。VMAの数値が特定のジョブに対して明確なピークを示している場合、それに応じて予備容量を適切に設定します。.

コンテナ、クラウド、オーケストレーション:特徴

コンテナの中には vm.max_map_count 実際にはたいてい ホスト設定. ノード(ベアメタルまたはVM)上の値を sysctl そして、それを永続的に /etc/sysctl.conf またはファイルを /etc/sysctl.d/. Docker環境では、確かに --sysctl と指定しますが、実際には vm.max_map_count はホスト全体に適用されるようです。そのため、この変更はノード単位の対策として実施する予定です。 オーケストレーター(Kubernetesなど)では、権限のないPodも正常に起動できるよう、Node-Init/Cloud-Initまたはマシンイメージを介してこの値を設定することを推奨します。重要:選択した設定を文書化しています。 コンプライアンス・ライン (どのノードタイプがどの値を保持するか)を明確にし、スケジューリングとオートスケーリングの一貫性を保つため。.

自動化とコンプライアンス

私は、設定管理などで「コードとして」設定を記録しています。例として、sysctlのドロップインファイルを使用しています:

# /etc/sysctl.d/90-db-mappings.conf
vm.max_map_count = 524288

ロールアウトは段階的に行われます(ステージング → カナリー → 全面展開)。 デプロイ直後にヘルスチェックを実施し、新しいPodやサービスが同じ制限値を認識していることを確認します。監査に備えて、運用ドキュメントに測定データ(ピークVMA、リザーブ係数、直近の調整日)を記録します。.

オーバーコミットとOOMキラーによる調整

VMAの上限を引き上げてもRAMの使用量は減りませんが、より多くのマッピングが可能になります。処理負荷がピークに達した際には、オーバーコミット戦略やOOMキラーとの相互作用が重要になってきます。マッピングを許可すればするほど、プロセスはより積極的にメモリを予約できるようになります。したがって、私は vm.overcommit_memory そして vm.overcommit_ratio これを注視し、ワークロードにオーバーブッキングの傾向が見られる場合は、明確な予備容量(スワップ/ヘッドルーム)を確保するか、より厳格なオーバーコミットポリシーを適用するようにします。 目標は「事前警告の余裕」を確保することです。つまり、突然のOOMが発生する代わりに、モニタリングでエラー率の上昇やレイテンシの増加といったシグナルを早期に検知し、それをもとに適切な対策を講じることができるようにすることです。.

エッジケース:32ビット、多数のスレッド、アロケーターの選択

  • 32ビットプロセス: 仮想アドレス空間が狭いため、断片化の影響がより早く顕在化する。vm.max_map_count の値を大きくしてもアドレス空間不足は解消されない――この場合は、64ビットビルドやアーキテクチャの変更が有効だ。.
  • スレッドの多いサービス: 各スレッドには、少なくとも1つの独自のスタックVMAが割り当てられます。ワーカー数が大幅に増加すると、VMAの数もそれに比例して増加します。私は、スレッドプールが適切に制限され、合理的にスケーリングされるよう確保しています。.
  • アロケーター: 一部のアロケーターは ミマップ 大きすぎるブロックや、多数の小さなブロックに対しては過剰です。VMAの急激なピークが顕著な場合は、マッピング数を減らすために、代替のアロケーターやそのチューニングオプションを試しています。.
  • 共有ライブラリ: 動的に読み込まれる小さなモジュールが多数あるため、マッピングの数が増えてしまっています。モジュールを統合できるか、あるいは不要なプラグインを削除できるかを確認しています。.

変更前のチェックリスト

  • 現在の境界を特定し、記録する
  • 複数の負荷ウィンドウにわたるプロセス固有のVMAピークを測定する
  • 予備量を算出(ピーク値の2~4倍)し、ステージング検査を計画する
  • 付随する制限(nofile)、スレッド数、THP、スワップネス、ダーティ・レシオの確認
  • VMA近傍、mmapエラー、OOMイベントの監視/アラートを有効にする
  • ロールアウトおよびロールバックのパスを定義する(Canary、メンテナンスウィンドウ、sysctl.dファイル)
  • クラスタ/ノードの一貫性を確保し、文書化する

クラスターと成長に向けた計画

私は現状だけでなく、データや指標の予想される成長も考慮しています。新機能の追加、クライアント数の増加、あるいは機能拡張などにより、多くの場合、その数は増加します。 マッピング. 。そのため、観測されたピーク値よりも余裕を持たせた値を想定し、その判断を明確に記録しておく。クラスター内では、各ノードが同一の反応を示すよう値を同期させ、フェイルオーバーが制限値に達して失敗しないようにしている。メンテナンスウィンドウでの定期的な確認により、 継続性 設定。.

簡単にまとめると:データベースサーバーのセキュリティ設定

現在の制限を確認し、負荷がかかった状態でのVMA数を測定し、予備分を考慮してvm.max_map_countを設定します。多くのデータベースや検索ワークロードでは、262,144が 開始値 また、測定値や成長状況に応じて必要であれば、上限値を1,048,576に設定します。 この変更は即座にパフォーマンスの向上をもたらすものではありませんが、非常に多くのマッピングが必要になる場合にエラーを防ぐことができます。ログ、メトリクス、および関連するカーネルパラメータを総合的に検討することで、安定性が確保されます。これにより、 データベースの運用 耐久性に優れ、計画性に富み、負荷の増加にも対応可能です。.

現在の記事

データセンター内の、vm.max_map_count が最適化された Linux データベースサーバー
サーバーと仮想マシン

データベースサーバーにおけるLinuxのvm.max_map_countを理解し、最適に設定する

データベースサーバー向けに、Linuxカーネルパラメータ「vm.max_map_count」を最適に設定する方法をご紹介します。本記事では、「vm.max_map_count」に焦点を当て、安定したデータベースホスティングやメモリを大量に消費するアプリケーションにおけるその重要性について解説します。.