[PaaS のみ]{class="badge informative" title="Adobe Commerce on Cloud プロジェクト(Adobeが管理する PaaS インフラストラクチャ)およびオンプレミスプロジェクトにのみ適用されます。"}

Redis サービス設定のベストプラクティス

  • Redis L2 キャッシュの設定
  • Redis スレーブ接続を有効にする
  • キーをプリロード
  • 古いキャッシュを有効にする
  • Redis キャッシュと Redis セッションを分離します。
  • Redis キャッシュを圧縮し、高い圧縮に gzip を使用します

Redis L2 キャッシュの設定

REDIS_BACKEND 設定ファイルの .magento.env.yaml デプロイメント変数を設定して、Redis L2 キャッシュを設定します。

stage:
  deploy:
    REDIS_BACKEND: '\Magento\Framework\Cache\Backend\RemoteSynchronizedCache'

クラウドインフラストラクチャー上の環境設定については、REDIS_BACKEND クラウドインフラストラクチャー上のCommerceガイドの __ を参照してください。

オンプレミスのインストールの場合は、 設定ガイドRedis ページ キャッシュの設定 を参照してください。

NOTE
ece-tools パッケージの最新バージョンを使用していることを確認します。 そうでない場合は 最新バージョンにアップグレードします。 composer show magento/ece-tools CLI コマンドを使用すると、ローカル環境にインストールされているバージョンを確認できます。

L2 キャッシュメモリのサイズ設定(Adobe Commerce Cloud)

L2 キャッシュは、ストレージ メカニズムとして 一時ファイル システムを使用します。 特殊なキー値データベースシステムと比較して、一時ファイルシステムには、メモリの使用を制御するためのキー削除ポリシーがありません。

メモリ使用量の制御がないと、古くなったキャッシュが蓄積され、L2 キャッシュのメモリ使用量が時間の経過とともに増加する可能性があります。

L2 キャッシュ実装のメモリ不足を避けるために、Adobe Commerceは、特定のしきい値に達するとストレージをクリアします。 デフォルトのしきい値は 95% です。

キャッシュストレージのプロジェクト要件に基づいて、L2 キャッシュメモリの最大使用量を調整することが重要です。 次のいずれかの方法を使用して、メモリキャッシュサイズを設定します。

  • /dev/shm マウントのサイズ変更をリクエストするサポートチケットを作成します。
  • ストレージの最大充填率に上限を設定するようにアプリケーションレベルで cleanup_percentage プロパティを調整します。 残りの空きメモリは、他のサービスで使用できます。
    設定は、キャッシュ設定グループ cache/frontend/default/backend_options/cleanup_percentage の下にあるデプロイメント設定で調整できます。
NOTE
cleanup_percentage の設定可能なオプションは、Adobe Commerce 2.4.4 で導入されました。

次のコードは、.magento.env.yaml ファイルの設定例を示しています。

stage:
  deploy:
    REDIS_BACKEND: '\Magento\Framework\Cache\Backend\RemoteSynchronizedCache'
    CACHE_CONFIGURATION:
      _merge: true
      frontend:
        default:
          backend_options:
            cleanup_percentage: 90

キャッシュ要件は、プロジェクト設定とカスタムサードパーティコードによって異なる場合があります。 L2 キャッシュ メモリ サイズのスコープにより、しきい値のヒット数が多くなりすぎることなく、L2 キャッシュを動作させることができます。
ストレージのクリアが頻繁に行われるのを避けるために、L2 キャッシュメモリの使用状況が、しきい値を下回る一定のレベルで安定していることが理想的です。

以下の CLI コマンドを使用してクラスターの各ノードでの L2 キャッシュストレージメモリの使用状況を確認し、/dev/shm 行を探すことができます。
使用方法はノードによって異なる場合がありますが、同じ値に収束する必要があります。

df -h

Redis スレーブ接続を有効にする

.magento.env.yaml 設定ファイルの Redis スレーブ接続を有効にして、1 つのノードだけが読み取り/書き込みトラフィックを処理し、他のノードが読み取り専用トラフィックを処理できるようにします。

stage:
  deploy:
    REDIS_USE_SLAVE_CONNECTION: true

2}Cloud Infrastructure ガイドのCommerceREDIS_USE_SLAVE_CONNECTION} を参照してください __

Adobe Commerce オンプレミスのインストールの場合は、bin/magento:setup コマンドを使用して新しい Redis キャッシュ実装を設定します。 設定ガイドデフォルトキャッシュに Redis を使用 を参照してください。

WARNING
拡張/分割アーキテクチャ を使用して、クラウドインフラストラクチャプロジェクト用の Redis スレーブ接続を設定する しないでください。 これにより、Redis 接続エラーが発生します。 クラウドインフラストラクチャー上の Commerce ガイドの Redis 設定ガイダンス を参照してください。

キーをプリロード

ページ間でデータを再利用するには、プリロードのキーを .magento.env.yaml 設定ファイルにリストします。

stage:
  deploy:
    REDIS_BACKEND: '\Magento\Framework\Cache\Backend\RemoteSynchronizedCache'
    CACHE_CONFIGURATION:
      _merge: true
      frontend:
        default:
          id_prefix: '061_'                       # Prefix for keys to be preloaded
          backend_options:
            preload_keys:                         # List the keys to be preloaded
              - '061_EAV_ENTITY_TYPES:hash'
              - '061_GLOBAL_PLUGIN_LIST:hash'
              - '061_DB_IS_UP_TO_DATE:hash'
              - '061_SYSTEM_DEFAULT:hash'

オンプレミスのインストールについては、 設定ガイドRedis プリロード機能 を参照してください。

古いキャッシュを有効にする

新しいキャッシュを並行して生成しながら古いキャッシュを使用することで、特に多数のブロックとキャッシュキーを処理する場合に、ロックの待機時間を短縮し、パフォーマンスを向上させます。 古いキャッシュを有効にして、config.php 設定ファイルでキャッシュタイプを定義する(クラウドのみ):

'cache' => [
        'frontend' => [
            'stale_cache_enabled' => [
                'backend' => '\\Magento\\Framework\\Cache\\Backend\\RemoteSynchronizedCache',
                'backend_options' => [
                    'remote_backend' => '\\Magento\\Framework\\Cache\\Backend\\Redis',
                    'remote_backend_options' => [
                        'persistent' => 0,
                        'server' => 'localhost',
                        'database' => '4',
                        'port' => '6370',
                        'password' => ''
                    ],
                    'local_backend' => 'Cm_Cache_Backend_File',
                    'local_backend_options' => [
                        'cache_dir' => '/dev/shm/'
                    ],
                    'use_stale_cache' => true,
                ],
                'frontend_options' => [
                    'write_control' => false,
                ],
            ]
        ],
        'type' => [
            'default' => ['frontend' => 'default'],
            'layout' => ['frontend' => 'stale_cache_enabled'],
            'block_html' => ['frontend' => 'stale_cache_enabled'],
            'reflection' => ['frontend' => 'stale_cache_enabled'],
            'config_integration' => ['frontend' => 'stale_cache_enabled'],
            'config_integration_api' => ['frontend' => 'stale_cache_enabled'],
            'full_page' => ['frontend' => 'stale_cache_enabled'],
            'translate' => ['frontend' => 'stale_cache_enabled']
        ],
    ]
NOTE
前の例では、full_page キャッシュは Fastly を使用しているので、クラウドインフラストラクチャプロジェクトのAdobe Commerceには関係ありません。

オンプレミスのインストールを構成する方法については、 構成ガイド古いキャッシュ オプション を参照してください。

Redis のキャッシュとセッションのインスタンスを分離する

Redis キャッシュと Redis セッションを分離すると、キャッシュとセッションを個別に管理できます。 キャッシュの問題がセッションに影響を与え、売上高に影響を与える可能性を防ぐことができます。 各 Redis インスタンスは独自のコアで実行されるため、パフォーマンスが向上します。

  1. .magento/services.yaml 設定ファイルを更新します。

    code language-yaml
    mysql:
        type: mysql:10.4
        disk: 35000
    
    redis:
       type: redis:6.0
    
    redis-session:              # This is for the new Redis instance
       type: redis:6.0
    
    search:
       type: elasticsearch:7.9
       disk: 5000
    
    rabbitmq:
       type: rabbitmq:3.8
       disk: 2048
    
  2. .magento.app.yaml 設定ファイルを更新します。

    code language-yaml
    relationships:
        database: "mysql:mysql"
        redis: "redis:redis"
        redis-session: "redis-session:redis"   # Relationship of the new Redis instance
        search: "search:elasticsearch"
        rabbitmq: "rabbitmq:rabbitmq"
    
  3. Adobe Commerce サポートチケットを送信して、実稼動環境とステージング環境のセッション専用の新しい Redis インスタンスのプロビジョニングをリクエストします。 更新された .magento/services.yaml.magento.app.yaml の設定ファイルを含めます。 ダウンタイムは発生しませんが、新しいサービスをアクティブ化するにはデプロイメントが必要です。

  4. 新しいインスタンスが実行中であることを確認し、ポート番号をメモします。

    code language-bash
    echo $MAGENTO_CLOUD_RELATIONSHIPS | base64 -d | json_pp
    
  5. .magento.env.yaml 設定ファイルにポート番号を追加します。

    note important
    IMPORTANT
    ece-tools redis セッションサービス定義から自動的に検出で MAGENTO_CLOUD_RELATIONSHIPS ない場合にのみ、redis セッションポートを設定します。
    note note
    NOTE
    disable_locking1 に設定する必要があります。
    code language-yaml
    SESSION_CONFIGURATION:
      _merge: true
      redis:
        timeout: 5
        disable_locking: 1
        bot_first_lifetime: 60
        bot_lifetime: 7200
        max_lifetime: 2592000
        min_lifetime: 60
    
  6. Redis キャッシュインスタンスの デフォルトデータベースdb 0)からセッションを削除します。

    code language-bash
    redis-cli -h 127.0.0.1 -p 6374 -n 0 FLUSHDB
    

デプロイメント中、 ビルドおよびデプロイログに次の行が表示されます。

W:   - Downloading colinmollenhour/credis (1.11.1)
W:   - Downloading colinmollenhour/php-redis-session-abstract (v1.4.5)
...
W:   - Installing colinmollenhour/credis (1.11.1): Extracting archive
W:   - Installing colinmollenhour/php-redis-session-abstract (v1.4.5): Extracting archive
...
[2022-08-17 01:13:40] INFO: Version of service 'redis' is 6.0
[2022-08-17 01:13:40] INFO: Version of service 'redis-session' is 6.0
[2022-08-17 01:13:40] INFO: redis-session will be used for session if it was not override by SESSION_CONFIGURATION

キャッシュ圧縮

6 GB を超える Redis maxmemory を使用している場合は、キャッシュ圧縮を使用して、キーが消費する領域を減らすことができます。 クライアントサイドのパフォーマンスにはトレードオフがあることに注意してください。 予備の CPU がある場合は、有効にします。 設定ガイドセッションストレージに Redis を使用 を参照してください。

stage:
  deploy:
    REDIS_BACKEND: '\Magento\Framework\Cache\Backend\RemoteSynchronizedCache'
    CACHE_CONFIGURATION:
      _merge: true;
      frontend:
        default:
          backend_options:
            compress_data: 4              # 0-9
            compress_tags: 4              # 0-9
            compress_threshold: 20480     # don't compress files smaller than this value
            compression_lib: 'gzip'       # snappy and lzf for performance, gzip for high compression (~69%)

Redis 非同期解放の有効化(lazyfree)

クラウドインフラストラクチャー上のAdobe Commerceで lazyfree を有効にするには、Adobe Commerce サポートチケットを送信し次の Redis 設定が環境に適用されるようにリクエストします。

lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
replica-lazy-flush yes
lazyfree-lazy-user-del yes

lazyfree を有効にすると、Redis はメモリの再利用をバックグラウンド スレッドにオフロードし、削除、サーバーによる削除、ユーザーの削除、レプリカ データセットのフラッシュを行います。 これにより、メインスレッドのブロックが減り、リクエストの待ち時間が短縮されます。

NOTE
lazyfree-lazy-user-del yes オプションを指定すると、DEL コマンドは UNLINK のように動作します。これにより、キーのリンクが直ちに解除され、メモリが非同期で解放されます。
WARNING
バックグラウンドで解放が行われるため、削除/期限切れ/削除されたキーが使用するメモリは、バックグラウンドスレッドが作業を完了するまで割り当てられたままです。 お使いの Redis が既にメモリ負荷が高い場合は、慎重にテストし、最初にメモリ負荷を下げることを検討してください(例えば、特定のケースではブロック キャッシュを無効にし、上記のようにキャッシュとセッションの Redis インスタンスを分離します)。

Redis マルチスレッド I/O を有効にする

クラウドインフラストラクチャでAdobe Commerceの Redis I/O スレッドを有効にするには、Adobe Commerce サポートチケットを送信し以下の設定をリクエストします。 これにより、ソケットの読み取り/書き込みとコマンド解析をメインスレッドからオフロードすることで、スループットが向上しますが、CPUの使用率は高くなります。 負荷の下で検証し、ホストを監視します。

io-threads-do-reads yes
io-threads 8 # choose a value lower than the number of CPU cores (check with nproc), then tune under load
NOTE
I/O スレッドは、クライアント I/O と解析のみを並列化します。 Redis コマンドの実行はシングルスレッドのままです。
WARNING
I/O スレッドを有効にすると、CPUの使用量が増える可能性がありますが、すべてのワークロードにメリットがあるわけではありません。 保守的な価値とベンチマークから始めます。 待ち時間が増加したり、CPUが飽和状態になった場合は、I/O スレッドの読み取りを減らすか、無効 io-threads します。

Redis クライアントのタイムアウトと再試行の回数を増やす

.magento.env.yaml でバックエンドオプションを調整して、キャッシュクライアントの許容値を一時的な飽和値に引き上げます。

stage:
  deploy:
    CACHE_CONFIGURATION:
      _merge: true
      frontend:
        default:
          backend_options:
            read_timeout: 10
            connect_retries: 5

これらの設定により、Redis のクライアント許容値が増加し、返信待ちウィンドウが拡張され、接続設定が再試行されます。 これにより、短いスパイク時の断続的な cannot connect to localhost:6370 ールと読み取りタイムアウトのエラーを減らすことができます。

NOTE
これらは、永続的な過負荷の修正ではありません。

追加情報

recommendation-more-help
754cbbf3-3a3c-4af3-b6ce-9d34390f3a60