SA.04.2 性能の改善 (重要度: 3)
各種アルゴリズム・プロトコルの特徴や制約
HTTP/3とQUICは、ネットワーク通信の性能向上を目指し、従来のTCPを使用したHTTP通信と比較していくつかの重要な特徴と制約があります。
HTTP/3の特徴:
- プロトコル: HTTP/3は、QUIC(Quick UDP Internet Connections)プロトコルの上に構築されています。QUICはTCPを置き換える目的で開発された新しいトランスポートプロトコルであり、低遅延・高い信頼性を提供します。
- マルチパス: HTTP/3では、データが複数のパスで送信されるマルチパス通信が可能です。これにより、ネットワークの中断やパケットロスがあってもパフォーマンスを維持することができます。
- 接続の確立: QUIC通信は、データを送信する前にハンドシェイクが行われますが、TCPに比べて手続きが高速です。これにより、接続の確立が速く、ウェブページの読み込み時間を短縮することができます。
HTTP/3の制約:
- 対応性: QUICおよびHTTP/3は比較的新しい技術であり、現在の実装やブラウザの対応性に制約があります。一部の古いブラウザやネットワークデバイスは、まだHTTP/3に対応していないかもしれません。
- プロトコルの複雑性: QUICは、TCPと比較して複雑なプロトコルです。そのため、デバッグやトラブルシューティングがより困難になる可能性があります。また、ネットワーク上で正常に動作するように設定する必要があります。
このように、HTTP/3とQUICは、高速かつ信頼性のある通信を提供するために開発されていますが、新しい技術であるため一部の制約や対応性の課題が存在することを理解しておく必要があります。将来的には、これらの制約が解消されてより広く採用されることが期待されています。
機能ごとの優先度調整
新規プロセスと既存プロセスのプロセス優先度
プロセスの優先度には、新規プロセスと既存プロセスの間でいくつかの違いがあります。
新規プロセスの優先度:
新たに作成されたプロセスは、一般的には標準の優先度を持ちます。これは、システムがプロセスをどのように処理するかに関与します。新しいプロセスは、リソースの要求や時間片の割り当てといったシステムリソースの一般的なルールに従います。新しいプロセスはまだ稼働していないため、通常は他の既存プロセスよりも低い優先度を持ちます。
既存プロセスの優先度:
一方、既存のプロセスは、システム内で一定の時間を実行しており、そのプロセスの優先度は経過時間や実行時間に応じて動的に変化する場合があります。一般的に、長時間実行され、リソースを多く消費するプロセスは、他のプロセスに比べて優先度を下げることがあります。これにより、システム全体のパフォーマンスと利用可能なリソースの均衡が維持されます。ただし、優先度を下げられたプロセスは一定の期間で再評価され、再度優先度が引き上げられることもあります。
プロセスの優先度は、システムの特定の設定やプロセススケジューラのポリシーによって管理されます。システムは、利用可能なリソースを最も効果的に割り当てるために、プロセスの優先度を適切に制御する必要があります。
チューニングされたプロファイル
プロファイルのチューニングには、以下の手順を実行することが一般的です。
- プロファイルの選択: チューニングするプロファイルを選択します。プロファイルには、一般的な設定(例:電力プロファイル、パフォーマンスプロファイル、バランスプロファイルなど)や、独自の設定が含まれる場合があります。
- 設定の確認: プロファイルの現在の設定を確認します。これには、プロセッサのクロック速度、電源制御の設定、ファン速度などが含まれる場合があります。現在の設定を把握しておくことで、チューニングの結果を比較することができます。
- 設定の変更: プロファイルの設定を変更します。例えば、パフォーマンスを向上させるためにクロック速度を上げる、エネルギー消費を抑えるために電源制御を調整するなどの変更が考えられます。ただし、変更がシステムへの影響をどの程度もたらすかを事前に評価し、慎重に変更する必要があります。
- 変更の適用: 変更をプロファイルに適用します。これには、設定の保存や再起動が含まれる場合があります。変更を適用する前に、プロファイルの変更前と後のパフォーマンスをベンチマークテストすることをおすすめします。
- ベンチマークテストと評価: プロファイルの変更後、システムのパフォーマンスをベンチマークテストすることで、変更がどの程度の効果をもたらしたか評価することが重要です。これにより、最適なプロファイル設定を特定することができます。
プロファイルのチューニングは、システムやタスクの要件に応じて行う必要があります。より詳細な調整が必要な場合は、専門家に相談することがおすすめです。
cgroup によるシステムリソースの使用量の調整
cgroup (Control Groups) は、Linux カーネルの機能の1つで、プロセスグループによるシステムリソースの使用量を制御するために使用されます。cgroup を使用すると、CPU、メモリ、ネットワーク、ディスク入出力などのリソースを、グループごとに制限・分配することができます。
以下に、cgroup の基本的な使用方法の手順を示します。
- cgroup の有効化: cgroup を有効化するために、カーネルパラメータ(/proc ファイルシステム内)を設定する必要があります。具体的な手順は、使用している Linux ディストリビューションによって異なる場合がありますので、OS のドキュメンテーションやカーネルのマニュアルを参照してください。
- cgroup の作成: cgroup を作成するには、/sys/fs/cgroup ディレクトリ内に新しいディレクトリを作成します。たとえば、/sys/fs/cgroup/cpu というディレクトリを作成すると、CPU のリソース制限が可能となります。
- リソースの割り当て: cgroup 内でリソースを制限するために、制限値を設定します。たとえば、CPU の場合、使用するコアの数や使用率の上限を設定することができます。リソース制限は、cgroup のディレクトリ内の cgroup.[resource]_limit ファイルを編集することで行われます。
- プロセスのリソースの制限に対応させる: cgroup にプロセスを割り当てることで、リソース制限が適用されます。具体的には、/sys/fs/cgroup/cpu/tasks ファイルにプロセスの PID を書き込むことで、cgroup にプロセスを追加できます。
cgroup を使用することで、異なるプロセスグループ間でシステムリソースを効果的に制御することができます。特に、マルチテナント環境やコンテナ化された環境において重要な機能となっています。cgroup の設定や操作には、専門的な知識が必要な場合がありますので、十分な理解と慎重な操作を行うようにしてください。
ノード内の CPU, メモリ, ディスク, ネットワーク性能の改善
カーネル
shmmaxは、Linuxシステムで共有メモリセグメントの最大サイズを制御するカーネルパラメータです。shmmaxの値を調整することによって、システム上で利用可能な共有メモリの最大量を変更できます。
shmmaxの値を調整する手順は次のようになります:
- /etc/sysctl.confファイルを編集します。
- ファイル内で、”kernel.shmmax”という行を見つけます。もし存在しない場合は、新たに追加します。
- “kernel.shmmax”の値を調整します。値の単位はバイトです。
- 変更を保存してファイルを終了します。
- 変更を反映させるために、次のコマンドを実行します:
sudo sysctl -p
これでshmmaxの値が変更され、システム上で利用可能な共有メモリの最大サイズが変わります。
ただし、適切なshmmaxの値を設定するためには、システムのリソースやアプリケーションの要件に応じて調整する必要があります。過度に大きな値を設定すると、システムのパフォーマンスに悪影響を与えるかもしれません。適切な値を設定するためには、システムの仕様やアプリケーションのニーズを理解し、適切なテストとベンチマーキングを実施することが重要です。
メモリ
Linuxの代替ページサイズ(Transparent Huge Pages)は、大容量メモリサポートを提供し、メモリアクセスの効率を向上させる機能です。代替ページサイズを調整するためには、次の手順を行います:
- /etc/default/grubファイルを編集します。
- GRUB_CMDLINE_LINUX_DEFAULT変数内のクォートで囲まれたオプション文字列を見つけます。この変数はデフォルトのカーネルの引数を設定します。
- オプション文字列末尾に”transparent_hugepage=テンプレート”を追加します。テンプレートの設定には、次のオプションがあります:
- “always”:代替ページが常に有効になります。
- “madvise”:アプリケーションが代替ページ利用を要求した場合に有効になります。
- “never”:代替ページが無効になります。 例えば、”transparent_hugepage=never”のように設定します。
- 変更を保存してファイルを終了します。
- グラブを再構築するために、次のコマンドを実行します:
sudo update-grub
- 変更を反映させるために、システムを再起動します。
これで代替ページサイズの設定が変更され、システム上で代替ページが有効になるかどうかが変わります。
ただし、代替ページサイズの調整はシステムとアプリケーションのニーズに基づいて行う必要があります。適切な設定を行うためには、システムのリソース使用状況や性能の要件を理解し、適切なテストとベンチマーキングを実施することが重要です。また、代替ページサイズの設定はアプリケーションの動作に影響を与える場合がありますので、注意が必要です。
ディスク
I/O スケジューリングアルゴリズムは、複数の入出力要求がある場合にそれらを効率的に処理するために使用されます。主な目標は、ディスクのアクセス時間を最小限に抑え、システム全体のパフォーマンスを最適化することです。
いくつかの一般的な I/O スケジューリングアルゴリズムには以下があります:
- FCFS (First-Come, First-Served):このアルゴリズムでは、キューに入った順番に処理されます。アプリケーションやプロセスの実行順序に応じて、大量の待ち時間が発生する可能性があります。
- SSTF (Shortest Seek Time First):このアルゴリズムでは、ディスクヘッドが最も近くのトラックに移動し、アクセス時間を最小限にします。ただし、トラックの移動が多く発生する場合、他の要求が遅延する可能性があります。
- SCAN:このアルゴリズムでは、ディスクヘッドが一方向にトラックを走査し、要求を順番に処理します。ディスクの外側から内側、あるいはその逆方向に移動する場合があります。
- C-SCAN:このアルゴリズムも SCAN と同様ですが、ディスク制御が一方向にのみ移動する代わりに、トラックの末尾に到達した後はディスクの先頭に移動します。
I/O スケジューリングアルゴリズムの選択は、アプリケーションやシステムの要件、ディスクハードウェアの性能などに応じて行われます。最適なアルゴリズムは、キュー内の I/O 要求のパフォーマンスと公平性のバランスを取るように設定されるべきです。
フィーチャ・オプションの選択は、ソフトウェアやハードウェアなどの機能を有効または無効にするためのオプションです。一般的には、これらのオプションはシステムの設定ファイルまたはプログラムの引数として指定されます。
フィーチャ・オプションの選択は、システムやアプリケーションの要件に合わせて行われます。具体的なフィーチャ・オプションは、使用するソフトウェアやハードウェアによって異なりますが、いくつかの例を以下に示します:
- セキュリティオプション:セキュリティを向上させるために、パスワードの複雑さの要件やアクセス制御リスト向けのオプションを設定します。
- パフォーマンスオプション:パフォーマンスを最適化するために、キャッシュサイズや並列処理のオプションを調整します。
- デバッグオプション:デバッグを容易にするために、ログレベルのオプションやトレース機能を有効にします。
- ストレージオプション:ディスクのセクターサイズやファイルシステムのオプションを選択して、ストレージの効率や信頼性を向上させます。
これらのオプションの選択は、システムの機能やパフォーマンスに重要な影響を与える場合があります。そのため、各オプションの効果と可能性のリスクを理解し、適切な設定を行う必要があります。また、オプションの調整には詳細な知識やテストが必要な場合がありますので、注意が必要です。
ブロックサイズ調整は、データストレージシステムにおいて重要な設定です。ブロックサイズは、ファイルシステムやデータベースなどのシステムで使用される1つのデータブロックのサイズを指します。
適切なブロックサイズを選択することによって、データアクセスの効率性やストレージの使用効率が向上します。以下にブロックサイズ調整のポイントをいくつか説明します:
- アクセスパターンに基づく調整:ブロックサイズは、ワークロードに応じて選択することが重要です。大きなブロックサイズは、シーケンシャルアクセスパターンに適しています。一方、小さなブロックサイズは、ランダムアクセスパターンに適しています。
- I/Oの効率性とレイテンシのトレードオフ:大きなブロックサイズは、1つのディスクリードやライトに必要なI/O数を減らすため、I/Oの効率性を向上させます。しかし、大きなブロックサイズは、データの取得や更新が必要なときの待ち時間(レイテンシ)も増加させます。
- ファイルのサイズと関連付けられたブロックサイズ:ファイルサイズが大きい場合、大きなブロックサイズを選択することで、ファイルをより効率的に格納できます。一方、小さなファイルは小さなブロックサイズで格納する方が効率的です。
- ファイルシステムのパラメータや要件:使用するファイルシステムやその他のストレージシステムには、ブロックサイズに関連するパラメータや要件が存在する場合があります。これらの指針や仕様に基づいて、ブロックサイズを選択する必要があります。
ブロックサイズの調整は、トライアンドエラーのプロセスかもしれません。実際のワークロードや性能測定を行いながら、最適なブロックサイズを見つけることが重要です。
ネットワーク
バッファサイズの計算や設定は、データ処理やネットワーク通信などの分野で重要な役割を果たします。基本的なアプローチは次の通りです:
- 必要なメモリ量の見積もり:まず、バッファに格納する必要があるデータの量を見積もります。これには、処理するデータのサイズや、同時に処理することができるデータの数などが含まれます。
- ハードウェアおよびシステムの制約:使用するハードウェアやシステムの制約も考慮する必要があります。例えば、利用可能なメモリ容量や、バッファを格納するためのディスクスペースの制限などです。
- パフォーマンス要件:ネットワーク通信やデータ処理などのパフォーマンス要件も考慮する必要があります。バッファのサイズは、十分なスループットや低いレイテンシを実現するために適切に設定される必要があります。
- バッファ使用量のモニタリングと調整:実際の運用中にバッファの使用量を監視し、必要に応じて調整を行うことも重要です。バッファが過度に使用される場合、メモリリークやオーバーフローリスクが生じる可能性があります。
なお、バッファサイズの計算や設定はアプリケーションやシステムによって異なる場合があります。具体的な要件や制約に応じて、適切なバッファサイズを計算し設定する必要があります。また、バッファサイズを最適化する場合は、実際のテストやパフォーマンス評価を行うことが重要です。
ノード間のチューニング
ネットワークホップ数の改善
ネットワークホップ数は、ネットワーク上でデータが送信元から宛先へ伝達される際に経由するノードの数を表します。ネットワークホップ数の改善は、大きなデータセンターや分散システムなどの高負荷ネットワークにおいて、パフォーマンスやレイテンシの改善を実現するために重要です。
以下はネットワークホップ数を改善するための一般的な手法です:
- ネットワークトポロジーの見直し:ネットワーク内のノードの配置を見直し、データの転送パスを最適化します。例えば、より直接的な経路やボトルネック回避のためのバイパスパスを設定することができます。
- ルーティングプロトコルの最適化:ルーティングプロトコルを最適化して、より短い経路を探索するようにします。これにより、パケットの転送にかかる時間と遅延が削減されます。
- キャッシュやロードバランサの使用:キャッシュやロードバランサなどの技術を使用して、データやリクエストを最も近いノードにキャッシュしたり、負荷を分散させたりすることで、パフォーマンスを向上させることができます。
- ネットワークエンジニアリングの最適化:ネットワークエンジニアリングの手法を使用して、帯域幅を最大限に利用し、通信リンクの輻輳やボトルネックを回避することも重要です。
これらの手法は、ネットワークホップ数の改善を目指す際に役立つ一部のアプローチです。ただし、特定の環境やニーズに応じて、他の技術や手法を組み合わせる必要がある場合もあります。
ボンディング (リンクアグリゲーション)
ボンディング、またはリンクアグリゲーションは、複数の物理的なネットワークリンクを1つの論理リンクとしてまとめる技術です。これにより、帯域幅を拡張し、冗長性を向上させることができます。
ボンディングの方法には、以下のようないくつかのタイプがあります:
- ロードバランシング:複数のリンクにトラフィックを均等に分散させることで、帯域幅を最大限に活用します。これにより、ボトルネックの原因となるシングルポイントのリンクを回避し、ネットワークのパフォーマンスを向上させることができます。
- 冗長性の向上:ボンディングにより、複数のリンクが冗長なバックアップとして使用されます。1つのリンクが故障しても、他のリンクが引き継ぎ、ネットワークの可用性を維持します。
ボンディングは、特に要件の多いネットワーク環境や重負荷のシステムにおいて重要な役割を果たします。また、冗長性が求められる場所や、大量のデータを処理するデータセンターなどでも利用されています。
ボンディングは、ハードウェアやソフトウェアによって実現できます。ネットワークスイッチやネットワークインターフェースカード(NIC)は、ボンディング機能をサポートしている場合があります。また、オペレーティングシステムやネットワーク設定によってもボンディングが設定できます。具体的な方法や手順は、使用している機器や環境によって異なる場合があります。
リソース枯渇にたどり着きにくくするための設定
ファイル・ディスクリプタ数の適正化
ディスクリプタは、コンピュータシステムの中でリソースを識別し管理するための参照や情報を保持するデータ構造です。一般的な例として、ファイルディスクリプタがあります。ファイルディスクリプタは、オペレーティングシステムがファイルやソケットといった入出力リソースを識別・操作するために使用する整数値です。
ディスクリプタ数の適正化は、システムのリソース効率を向上させるために重要な考慮事項です。適正なディスクリプタ数を設定することにより、以下のような利点があります:
- リソースの最適な使用:ディスクリプタ数を制限することにより、不必要に多くのリソースを使用することを防ぐことができます。システムのリソースが有効に使用されるため、パフォーマンスや効率が向上します。
- メモリ使用量の最適化:ディスクリプタは通常、メモリ上に確保されます。ディスクリプタ数が制限されている場合、メモリ使用量が制御され、不必要なメモリの使用を避けることができます。
- セキュリティの向上:適切なディスクリプタ数を設定することにより、予期せぬ攻撃やリソースの過剰使用を防ぐことができます。ディスクリプタが適切に割り当てられていれば、攻撃者はシステムリソースへのアクセスを逸脱することが困難になります。
ディスクリプタ数の適正化は、システムの種類や目的に合わせて行われる必要があります。選ぶべき適切なディスクリプタ数は、システムの要求仕様に基づいて、トラフィックの予想、リソースの利用率、ユーザーの同時接続数などを考慮して決定されます。
ネットワークのソケット, ポート, キュー数の適正化
参考:https://meetup-jp.toast.com/1516
セッション数の適正化
セッション数の適正化において、Connection Pooling(接続プーリング)は非常に重要な概念です。Connection Poolingは、データベースやその他のリソースへの接続を効率的に管理するために使用されます。
通常、アプリケーションはデータベースなどの外部リソースに接続するために、接続オブジェクトを作成します。しかし、接続の作成や切断はリソースを消費する操作であり、頻繁に実行される場合にはパフォーマンスの低下やリソースの枯渇を引き起こす可能性があります。
Connection Poolingでは、事前に接続オブジェクトをプール(一時的に準備する)し、アプリケーションに必要なタイミングで利用可能な接続を提供します。これにより、接続の作成や切断にかかるオーバーヘッドを最小限に抑え、リソースの効率的な利用を実現できます。
具体的には、Connection Poolは、アプリケーションからの接続要求を適切に処理するために必要な接続数を事前に確保します。使用されなくなった接続はプール内に戻され、別の接続要求で再利用されることができます。
接続プーリングは、多くのアプリケーションフレームワークやデータベースドライバに組み込まれており、設定や管理が簡単にできることが多いです。しかし、適切な設定やチューニングは重要であり、同時接続数やリソースの使用状況に合わせて調整する必要があります。
したがって、アプリケーションのパフォーマンスとスケーラビリティを向上させるために、Connection Poolingの使用を検討することが重要です。