推奨される学習: Redis ビデオ チュートリアル
トラブルシューティングのアイデア
Redis インスタンスでメモリ制限 maxmemory が設定されている場合、Redis の速度が低下する可能性があります。
Redis を純粋なキャッシュとして使用する場合、通常、このインスタンスのメモリ上限 maxmemory を設定してから、データ削除戦略を設定します。インスタンスのメモリが maxmemory に達すると、その後新しいデータを書き込むたびに操作遅延が増加する場合があります。
速度低下の原因
Redis メモリが maxmemory に達すると、Redis は新しいデータを書き込む前に毎回インスタンスから一部のデータを追い出す必要があります。インスタンス全体のメモリを以下に維持してください。新しいデータを書き込む前に maxmemory を実行します。
古いデータを追い出すこのロジックにも時間がかかり、具体的な時間の長さは設定した削除戦略によって異なります:
どの戦略を使用するかは、特定のビジネス シナリオの構成によって異なります。最も一般的に使用される削除戦略は、allkeys-lru / volatile-lru です。その処理ロジックは、毎回インスタンスからキーのバッチをランダムに取り出し (この数は構成可能)、次に最もアクセスの少ないキーの 1 つを削除し、その後、残りのキーを使用します。キーをプールに一時的に保存し、引き続きキーのバッチをランダムに選択し、それらを前のプール内のキーと比較して、最もアクセスの少ないキーを削除します。インスタンスのメモリが maxmemory を下回るまで、これを繰り返します。
Redis 内のデータを削除するロジックは、期限切れのキーを削除するロジックと同じであり、コマンドが実際に実行される前に実行されるため、遅延も増加することに注意してください。また、書き込み OPS が高くなるほど遅延が顕著になります。
さらに、この時点で bigkey も Redis インスタンスに保存されている場合、bigkey を削除してメモリを解放するのにも時間がかかります。 ######あなたはそれを見ましたか? bigkey の危険はどこにでも存在します。これが、bigkey を保存しないようにするよう以前に注意した理由です。
解決策ビッグキーの保存を回避し、メモリの解放時間を短縮します
##アプリケーションがオペレーティング システムからメモリを申請する場合、メモリ ページ単位で適用され、従来のメモリ ページ サイズは 4KB であることは誰もが知っています。
2.6.38 以降、Linux カーネルはメモリ ヒュージ ページ メカニズムをサポートします。これにより、アプリケーションはオペレーティング システムから 2MB 単位でメモリを申請できるようになります。解決策
ヒュージ ページ メカニズムをオフにします。
まず、Redis マシンでラージ メモリ ページが有効になっているかどうかを確認する必要があります。
$ cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never
出力オプションが always の場合、ラージ メモリ ページ メカニズムが現在有効であることを意味します。
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
実際、オペレーティング システムが提供するラージ メモリ ページ メカニズムの利点は、特定のプログラムに対するアプリケーション メモリ リクエストの数を削減できることです。
ただし、パフォーマンスと遅延に非常に敏感な Redis のようなデータベースの場合、Redis がメモリに適用するたびにかかる時間ができるだけ短いことが望まれるため、このメカニズムを有効にすることはお勧めしません。 Redis マシン上で。
トラブルシューティングのアイデア
Redis が突然非常に遅くなった場合は、各操作に最大で数百ミリ秒かかります。偶数秒の場合は、Redis が Swap を使用しているかどうかを確認する必要がありますが、この場合、Redis は基本的に高パフォーマンスのサービスを提供できません。
速度低下の原因
スワップとは何ですか?スワップを使用すると Redis のパフォーマンスが低下するのはなぜですか?
オペレーティング システムについてある程度の知識がある場合は、メモリ不足によるアプリケーションへの影響を軽減するために、オペレーティング システムではメモリ内のデータの一部をディスクに移動できることをご存知でしょう。アプリケーションのメモリ使用量をバッファリングします。これらのメモリ データは、ディスク上のスワップ領域にスワップされます。
問題は、メモリ内のデータがディスクに移動されると、Redis がそのデータに再度アクセスするときに、ディスクからデータを読み取る必要があることです。ディスクへのアクセス速度は、メモリ内のデータの数百倍遅いです。記憶にアクセス中!特に、非常に高いパフォーマンス要件があり、パフォーマンスに非常に敏感な Redis のようなデータベースの場合、この操作の遅延は許容できません。
この時点で、Redis マシンのメモリ使用量をチェックして、スワップが使用されているかどうかを確認する必要があります。 Redis プロセスが Swap を使用しているかどうかは、次の方法で確認できます。
# 先找到 Redis 的进程 ID $ ps -aux | grep redis-server # 查看 Redis Swap 使用情况 $ cat /proc/$pid/smaps | egrep '^(Swap|Size)'
出力結果は次のとおりです
サイズ: 1256 KB
スワップ: 0 KB
サイズ: 4 Kb
スワップ: 0 KB
サイズ: 132 KB
スワップ: 0 KB
サイズ: 63488 KB
スワップ: 0 KB
サイズ: 132 KB
スワップ: 0 KB
サイズ: 65404 KB
スワップ: 0 kb
サイズ: 1921024 kb
スワップ: 0 kB
....
この結果には、Redis プロセスのメモリ使用量がリストされます。
Size の各行は、Redis によって使用されるメモリのサイズを表します。Size の下の Swap は、メモリのサイズと、ディスクにスワップされたデータの量を表します。これら 2 つの値がある場合、が等しい場合は、ブロック メモリ内のデータがディスクに完全にスワップされたことを意味します。
少量のデータのみがディスクにスワップされる場合、たとえば、各スワップが対応するサイズの小さな割合を占める場合、影響は大きくありません。数百メガバイト、さらには GB のメモリがディスクにスワップされる場合は、Redis のパフォーマンスが確実に急激に低下するため、注意が必要です。
解決策
Redis のスワップを解放するプロセスでは、通常、インスタンスを再起動する必要があります。インスタンスの再起動によるビジネスへの影響を考慮して、通常はマスター/スレーブのプロセスが最初に実行されます。切り替え、次に古いマスター ノードのスワップを解除し、古いマスター ノードのインスタンスを再起動し、スレーブ データベースのデータ同期が完了するまで待機します。その後、マスター/スレーブ切り替えを実行します。
Redis が Swap を使用すると、現時点での Redis の性能は基本的に高性能要件を満たせないことがわかります (格闘技が廃止されていることがわかります) ので、この事態を防ぐ必要もありますあらかじめ。
これを防ぐ方法は、Redis マシンのメモリとスワップの使用状況を監視し、メモリ不足またはスワップが使用されている場合にアラームを発し、タイムリーに対処する必要があります。
トラブルシューティングのアイデア
パフォーマンスの問題を引き起こす上記のシナリオを回避しており、Redis も安定している場合は、長い間稼働していたRedisの動作が、ある時期を境に急に遅くなり、それが続いているのですが、この状態は何が原因なのでしょうか?
このとき、Redis マシンのネットワーク帯域幅が過負荷になっていないか、マシン全体のネットワーク帯域幅を埋めているインスタンスが存在していないかを確認する必要があります。
速度低下の原因
ネットワーク帯域幅が過負荷になると、サーバーは TCP 層およびネットワーク層でパケット送信の遅延やパケット損失などが発生します。
Redis の高いパフォーマンスは、動作メモリに加えてネットワーク IO にもあり、ネットワーク IO にボトルネックがあると、Redis のパフォーマンスにも深刻な影響を及ぼします。
解決策
1) 頻繁な短い接続
ビジネス アプリケーションは、頻繁な接続を避けるために、Redis を操作するために長い接続を使用する必要があります。短い接続。
短い接続が頻繁に発生すると、Redis は接続の確立と解放に多くの時間を費やし、TCP の 3 方向ハンドシェイクと 4 方向ウェーブもアクセス遅延を増加させます。
2) 運用とメンテナンスの監視
また、Redis の速度低下を事前に予測したい場合は、運用と保守の監視を適切に行うことが不可欠であることも前述しました。監視。 。
監視とは実際には Redis のさまざまなランタイムインジケーターの収集であり、監視プログラムが Redis の INFO 情報を定期的に収集し、INFO 情報内のステータスデータに基づいてデータの表示やアラームを実行するのが一般的です。
ここで注意していただきたいのは、監視スクリプトを作成したり、オープンソースの監視コンポーネントを使用したりするときは、軽視してはいけないということです。
Redis にアクセスする監視スクリプトを作成する場合は、頻繁に短い接続が行われないように、長い接続を使用してステータス情報を収集するようにしてください。同時に、ビジネス リクエストへの影響を避けるために、Redis へのアクセス頻度の制御にも注意を払う必要があります。
一部のオープンソース監視コンポーネントを使用する場合は、これらのコンポーネントの実装原則を理解し、これらのコンポーネントを正しく構成して、短期間に大量の Redis 操作が発生する監視コンポーネントのバグを防ぐことが最善です。時間がかかり、Redis のパフォーマンスに影響を与える可能性があります。
当時、DBA がいくつかのオープン ソース コンポーネントを使用していたときに、構成と使用法の問題により、監視プログラムが Redis から頻繁に確立および切断され、Redis の応答が遅くなるということが起こりました。
3) 他のプログラムがリソースをめぐって競合する
最後に、Redis マシンは最適な専用マシンであり、Redis インスタンスのデプロイにのみ使用されることを思い出してください。他のアプリケーションの場合は、他のプログラムが CPU、メモリ、およびディスク リソースを占有し、Redis に割り当てられるリソースが不十分になることを防ぐために、Redis に比較的「静かな」環境を提供するようにしてください。
推奨される学習: Redis ビデオ チュートリアル
以上がRedis が遅い理由とそのトラブルシューティング方法についての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。