18

私は php-fpm と phpredis ドライバーで redis (2.6.8) を使用していますが、redis のレイテンシの問題で問題があります。特定の負荷がかかると、アプリケーションから redis への最初のリクエストに約 1 ~ 1.5 秒かかりredis-cli --latency、同じレイテンシーを示します。

私はすでにレイテンシーガイドをチェックしました。

  • Unix ソケットと同じホストで redis を使用します
  • スローログに 5 ミリ秒以上のエントリがありません
  • AOFは使用しません
  • redisは、利用可能な16Gbのうち約3.5Gbのメモリを必要とします(多すぎないと思います)
  • 私たちのシステムはスワップしていません
  • ディスク I/O を実行しているプロセスが他にない

私は永続的な接続を使用しており、接続されているクライアントの数は 5 から 25 までさまざまです (60 から 80 に達することもあります)。

これがグラフです。

同時接続クライアント数が 20 以上になると問題が発生するようです。

問題がどこにあるかを理解するのを手伝ってもらえますか?

アップデート

問題を調査したところ、何らかの理由で redis が適切に動作するのに十分なプロセッサ時間がないように見えました。

ネットワーク スニファを使用して、php-fpm と redis 間の通信を徹底的にチェックしました。Redis は tcp 経由でリクエストを受け取りましたが、1.5 秒後にのみ応答を返しました。これは明らかに、問題が redis の内部にあり、特定の条件で非常に多くのリクエストを処理できないことを示しています (プロセッサがシステム全体で 50% しかロードされていないため、プロセッサが枯渇している可能性があります)。

この問題は、ほとんどアイドル状態だった他のサーバーに redis を移動することで解決されました。同じサーバーで動作するように Linux スケジューラーをいじるべきだったと思いますが、まだ実行していません。

4

2 に答える 2

2

Redis はシングルスレッドであることに注意してください。プロセッサを集中的に使用する側で実行している操作がエラーになると、リクエストが相互にブロックされている可能性があります。たとえば、HVALS非常に大きな値を持つハッシュに対して実行している場合、そのすべてのデータを引き出して出力バッファーにコピーする間、すべてのクライアントを待機させることになります。

ここで行う必要があることの一部は (これが問題であるかどうかに関係なく)、使用しているすべてのコマンドを調べて、各コマンドの複雑さを判断することです。非常に大量のデータに対して一連のO(N)コマンドを実行している場合、一度に多くのことを実行しすぎている可能性があります。

TL;DR 使用しているコマンドとデータがどのように見えるかを知らずに、この問題を確実にデバッグできる人は誰もいません。ただし、使用している各メソッドの時間の複雑さを調べて、それが妥当であることを確認できます。

于 2013-11-05T01:45:05.897 に答える
0

私が取り組んでいる問題を調査しているときにこれに出くわしましたが、ここで役立つかもしれないと思いました:

https://groups.google.com/forum/#!topic/redis-db/uZaXHZUl0NA

スレッドを読むと、興味深い情報がいくつかあります。

于 2013-10-22T01:15:25.567 に答える