はじめに
参考に掲載させていただいているドキュメント(Cassandra on Nutanix Best Practice)にLinux VMのチューニングに関してまとめられておりました。カーネルパラメータへの知見を深めるために、簡易な解説付きで整理しました。
recommendations for tuning in-guest Linux OS settings to achieve the best performance for Cassandra on Nutanix
chronydを利用した時刻同期
設定
/etc/chrony.conf に適切なNTPサーバを指定してください。
Cassandra (and its distributions) overwrites a column if another version with a more recent timestamp exists. Unintended overwrites can occur when machines are in different locations and you haven’t synchronized the clocks.
TCPの設定
設定その1
以下の設定にすることで、90秒後にはアイドル状態となったTCPコネクションを自動的に切断。
net.ipv4.tcp_keepalive_time=60 ※TCP接続のキープアライブパケットを送信するまでの待機時間を設定するカーネルパラメータ。デフォルトの値は7200秒(2時間)。 net.ipv4.tcp_keepalive_probes=3 ※TCPキープアライブパケットを送信して応答がない場合に再送信する回数を設定するカーネルパラメータ。 net.ipv4.tcp_keepalive_intvl=10 ※指定された間隔で追加のキープアライブプローブが送信。
The following settings detect dead TCP connections after 90 seconds (60 + 10 + 10 + 10) with negligible additional traffic, so you don’t need to change them
設定その2
net.core.rmem_max=16777216 ※ネットワークの受信バッファ(Receive Buffer)の最大サイズを指定するカーネルパラメータ。 net.core.wmem_max=16777216 ※ネットワークの送信バッファ(Transmit Buffer)の最大サイズを指定するカーネルパラメータ。 net.core.rmem_default=16777216 ※ネットワークの受信バッファ(Receive Buffer)のデフォルトサイズを指定するカーネルパラメータ。 net.core.wmem_default=16777216 ※ネットワークの送信バッファ(Transmit Buffer)のデフォルトサイズを指定するカーネルパラメータ。 net.core.optmem_max=40960 ※ネットワークソケットのオプションメモリ(Optional Memory)の最大サイズを指定するカーネルパラメータ。 net.ipv4.tcp_rmem=4096 87380 16777216 ※TCPソケットの受信バッファ(Receive Buffer)のメモリサイズを制御するカーネルパラメータ。左から、最小値、新規コネクションのデフォルトバッファサイズ、最大値 net.ipv4.tcp_wmem=4096 65536 16777216 ※TCPソケットの送信バッファ(Transmit Buffer)のメモリサイズを制御するカーネルパラメータ。左から、最小値、新規コネクションのデフォルトバッファサイズ、最大値
The following settings are required to handle large numbers (thousands) of concurrent database connections
現在の設定を確認
sysctl -n net.ipv4.tcp_keepalive_time
設定を変更
sudo sysctl -w net.ipv4.tcp_keepalive_time=新しい値
永続的に設定を反映する場合
/etc/sysctl.confに既に紹介したパラメータを追加。
その後、次のコマンドで設定を反映。
sudo sysctl -p /etc/sysctl.conf
※CVMの場合は以下のファイルに設定されているようです(あくまでも管理人の予測であり、公開情報無し)
/etc/sysctl.d/30-nutanix-customizations.conf
仮想メモリの設定
設定
vm.swappiness=1 ※Linuxカーネルにおいてスワップ領域(ディスク上の仮想メモリ)をどれだけ積極的に使用するかを決定するカーネルパラメータ。デフォルト値は通常60。0に近づくほど物理メモリを使用しスワップを避ける。 vm.dirty_background_ratio = 1 ※Linuxカーネルにおいて、バックグラウンドでの「dirty」メモリページの書き込み操作を開始するための閾値を指定するカーネルパラメータ。システムのメモリの1%が「dirty」ページである場合に、カーネルはバックグラウンドでディスクへの書き込みを開始する。 vm.dirty_ratio = 30 ※Linuxカーネルにおいて、メモリ内の「dirty」ページが利用可能なメモリの特定の割合を超えたときに、システムが積極的にディスクへの書き込みを開始するための閾値を指定するカーネルパラメータ。 vm.max_map_count = 1048575 ※1つのプロセスが同時に作成できるメモリマッピングの最大数を指定するカーネルパラメータ。デフォルト値は通常65530。
dirty buffer memoryについてCopilotに聞いてみた。
「dirty buffer memory」は、メモリ管理の観点で、データがメモリ上に存在するが、まだディスクに書き込まれていない状態を指します。具体的には、以下のような状況です: • Dirty Pages: ファイルシステムやデバイスバッファとして使用されるメモリページが変更されている("dirty")が、まだ永続ストレージ(通常はディスク)に書き込まれていない。 • Write-back Cache: システムは一時的にデータをメモリ内に保持し、後で一括してディスクに書き込むことがあります。このプロセスを「write-back」または「lazy write」と呼びます。 この仕組みにより、ディスクI/O操作が効率的に行われることが多く、システム全体のパフォーマンスが向上します。ただし、「dirty buffer memory」が過剰にたまると、システムが突然多量のディスク書き込みを行う必要があり、パフォーマンス低下を引き起こす可能性があります。
メモリマッピングについてCopilotに聞いてみた。
メモリマッピング(Memory Mapping)は、プロセスの仮想メモリ空間にファイルやデバイスの内容を直接関連付ける技術です。これにより、ファイルやデバイスの内容をメモリ上に効率的に読み書きすることができます。 主な用途: 1. ファイルのメモリマッピング: ファイルの内容を仮想メモリ空間にマップすることで、ファイルの一部または全体をメモリ上で操作できます。この方法は、大きなファイルを部分的にメモリに読み込むのに便利です。 2. 共有メモリ: 複数のプロセス間でデータを共有するために使用されます。共有メモリを使用することで、プロセス間通信(IPC)が高速かつ効率的に行われます。 3. デバイスのメモリマッピング: ハードウェアデバイスのメモリ空間をプロセスの仮想メモリ空間にマップすることで、デバイスとのデータ転送を高速化します。 メモリマッピングの利点には、高速なファイルアクセス、効率的なメモリ使用、および大規模データの効率的な処理が含まれます。一方で、メモリ使用量の管理やデータの一貫性の確保が重要となります。
トランスペアレントヒュージページの無効化
設定
transparent_hugepage=neverをカーネルコマンドラインに追加します(※1)。
“For most workloads THP functions very well, but it doesn’t for databases like Cassandra. OS vendors for databases don’t recommend it, and it’s detrimental to the performance and function of Cassandra cluster nodes. Such negative influence on the performance applies to almost all databases that typically need sparse memory access patterns and rarely have contiguous access patterns. Because the Linux OS doesn’t entirely support turning off THP and keeping it off after reboot, establish a process that’s easy to perform and repeat”
※1についてCopilotに質問
transparent_hugepage(THP)は、Linuxカーネルにおいてメモリ管理を効率化するための機能です。通常のページサイズ(例えば、4KB)の代わりに、より大きなページサイズ(例えば、2MBや1GB)を自動的に使用することで、メモリの利用効率とパフォーマンスを向上させます。 意味: • transparent: 透明な、透過的なという意味で、ユーザーやアプリケーションから見た際に特別な操作や変更を必要とせずに機能が動作することを示す。 • hugepage: 通常よりも大きなメモリページのこと。 transparent_hugepage を有効にすると、カーネルは自動的にメモリアクセスパターンを監視し、適切な場合に通常のメモリページを大きなページに置き換えます。これにより、ページテーブルエントリの数が減少し、メモリ管理オーバーヘッドが軽減されます。また、キャッシュのヒット率が向上するため、特定のアプリケーションでのパフォーマンスが向上することがあります。 ただし、すべてのワークロードで必ずしもパフォーマンスが向上するわけではないため、利用環境に応じて有効化するかどうかを判断する必要があります。
リードアヘッド値の設定
各ブロックデバイスのリードアヘッドサイズを8KBにします。
Ensure that the readahead size is set to 8 KB on block devices storing data files. This setting keeps the database Resident Set Size (RSS) from growing over time, which happens when superfluous data goes into memory as part of any read. Such growth can eventually push data you may need out of memory to make room for readahead data you may not need
設定
echo 8 > /sys/class/block//queue/read_ahead_kb(※1)
※1についてCopilotに質問
リードアヘッドは、ファイルシステムの読み取りパフォーマンスを向上させるために使用されるメカニズムで、事前にデータを読み取ってキャッシュに保存することで、後続の読み取り要求を高速化
Resident Set Size(RSS)は、プロセスがメインメモリ(RAM)上で実際に使用しているメモリ量を示す指標です。 具体的には、プロセスが実行中に物理メモリ内に保持されているページの合計サイズを表します。 主なポイント: • RSSはプロセスが現在物理メモリ内で占めているメモリ量を示し、ディスクにスワップアウトされていないメモリ量を反映します。 • RSSには共有ライブラリによって使用されているメモリも含まれますが、共有ライブラリのメモリはプロセスごとに分割して計算されることが一般的です。 • RSSはシステムのパフォーマンスモニタリングやリソース管理において重要な指標であり、特にメモリ使用量を把握するのに役立ちます。
リソース制限
/etc/security/limits.d/90-nproc.confへnprocを32768へ制限します。
また、/etc/security/limits.d/cassandra.confへ以下を追加します。
設定
cassandra_user - nproc 32768(※1)
<cassandra_user> - memlock unlimited <cassandra_user> - nofile 1048576 <cassandra_user> - nproc 32768 <cassandra_user> - as unlimited(※2)
※1についてCopilotに質問
/etc/security/limits.d/90-nproc.conf ファイルは、システム上のユーザーごとのプロセス数の制限を設定するための構成ファイルです。 このファイルには、特定のユーザーやグループが同時に実行できるプロセス数の上限が含まれています。 典型的な内容は次のようになります: * soft nproc 1024 * hard nproc 4096 • *: すべてのユーザーに対して適用される設定。 • soft: ソフトリミットを示し、通常の動作時に適用される制限。 • hard: ハードリミットを示し、システム管理者のみが変更できる最大制限。 • nproc: プロセス数の制限を示す。 • 1024 と 4096: それぞれのリミットの具体的な数値。
※2についてCopilotに質問
/etc/security/limits.d/cassandra.conf ファイルは、Apache Cassandra データベースのユーザーリソース制限を設定するための構成ファイルです。 このファイルには、Cassandra ユーザーのメモリロック、ファイルディスクリプタ、プロセス数などの制限が含まれています。 例えば、以下のような設定が含まれます: • <cassandra_user> - memlock unlimited: メモリロックを無制限に設定します。 • <cassandra_user> - nofile 100000: ファイルディスクリプタの最大数を100000に設定します。 • <cassandra_user> - nproc 32768: プロセス数の制限を32768に設定します。 • <cassandra_user> - as unlimited: 仮想メモリの制限を無制限に設定します。 これにより、Cassandra が高負荷の環境でも安定して動作するようにリソース制限を調整します。
NUMAシステムでZone Reclaim Modeを無効化
設定
echo 0 > /proc/sys/vm/zone_reclaim_mode(※1)
※1についてCopilotに質問
zone_reclaim_mode は、Linuxカーネルにおいて、NUMA(Non-Uniform Memory Access)システムでメモリの再利用を制御するためのカーネルパラメータです。このパラメータは、メモリゾーンが不足した場合に、他のゾーンからメモリを再利用するかどうかを決定します。 意味: • 0: メモリの再利用を行わない。メモリが不足した場合、他のゾーンからメモリを取得する。 • 1: メモリの再利用を行う。メモリが不足した場合、現在のゾーン内でメモリを再利用する。 • 2: メモリの再利用を行うが、ページキャッシュの解放を優先する。 • 4: メモリの再利用を行うが、スワップアウトを優先する。 NUMAシステムでは、メモリのアクセス速度がノード間で異なるため、zone_reclaim_mode を適切に設定することで、メモリアクセスの効率を向上させることができます。ただし、特定の条件下では、パフォーマンスに悪影響を与える可能性があるため、注意が必要です RHEL8 - マルチノードサーバーで zone_reclaim_mode を使用する際の危険性 - Red Hat Customer PortalRHEL7 と RHEL8 の間に変更があり、特定の条件下では、マルチノードサーバーで vm.zone_reclaim_mode=n (0 以外の任意の値) を使用すると、アプリケーション/サーバーのパフォーマンスに深刻な影響を与える可能性...
SSDの最適化
LinuxのOSやバージョン次第で最適化されていない場合があるそうです。
設定
echo 0 > /sys/block/device_name/queue/rotational(※1) echo noop > /sys/block/device_name/queue/scheduler(※2) echo 128 > sys/block/device_name/queue/nr_requests(※3)
CVMでは以下の設定でした。
cat /sys/block/nvme0n1/queue/rotational 0 cat /sys/block/nvme0n1/queue/scheduler [mq-deadline] kyber none cat /sys/block/nvme0n1/queue/nr_requests 256
※1についてCopilotに質問
/sys/block/device_name/queue/rotational は、特定のブロックデバイスが回転ディスク(HDD)か、非回転ディスク(SSD)であるかを示すシステムファイルです。 意味: • 0: デバイスは非回転ディスク(SSD)です。 • 1: デバイスは回転ディスク(HDD)です。 このファイルを確認することで、システムはディスクの種類に応じた最適なI/Oスケジューリングやその他のパフォーマンス調整を行うことができます。
※2についてCopilotに質問
/sys/block/device_name/queue/scheduler は、指定されたブロックデバイスのI/Oスケジューリングアルゴリズムを設定および表示するためのシステムファイルです。 スケジューリングアルゴリズムの例: • noop: シンプルなFIFO(先入れ先出し)キュー。主にSSDに適している。 • deadline: I/O要求の遅延を最小限に抑えることを目的としたスケジューラ。リアルタイム性が求められるシステムに適している。 • cfq: 完全公平キューイング(Completely Fair Queuing)。異なるプロセス間で公平にI/O帯域を分配する。
※3についてCopilotに質問
/sys/block/device_name/queue/nr_requests は、特定のブロックデバイスが同時に処理できるI/O要求の最大数を設定および表示するためのシステムファイル
スワップの無効化
データベースの設計次第ですが、以下の理由からスワップをOFFにする方が推奨されます。
the database has multiple replicas and transparent failover, it’s better for a replica to be removed immediately when memory is low rather than go into swap
設定
sudo swapoff --all
また、/etc/fstab からスワップエントリを削除します。
コメント