0

Redis と組み合わせて Node.JS を使用しており、データ損失の問題が発生しています。統計収集システムがあるため、サーバーに処理された各リクエストを収集する必要があります。同時リクエストが多い (平均 1000/秒) と、Redis でデータ損失の問題が発生します。

Node.JS と Redis ですべてのリクエストをログに記録しました。問題は、Node.JS が送信されたリクエストとまったく同じ量を示し、Redis Monitor が同じ量をデバッグしているにもかかわらず、Redis DBSIZE が誤った値を示していることです。常に予想よりも 40% ~ 50% 少なくなります。

サーバー構成は次のとおりです。

インテル® Core™ i7-920
24 GB DDR3 RAM
ヘッツナーから

Debian Squeeze を実行しています。sysctl は次のとおりです。

net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.core.somaxconn = 1280
fs.file-max = 50000
vm.overcommit_memory=1

「負荷平均」は 0.04 で、十分な空きメモリ (~20 GB) があります。

この問題に関するヘルプは非常に高く評価されます。

4

2 に答える 2

2

最初のステップは、メモリ管理に関する Redis 構成を確認することです。maxmemory および maxmemory-policy パラメーターの値に応じて、Redis はメモリからオブジェクトを削除できます。maxmemory エントリがコメントアウトされていること、および maxmemory-policy が allkeys-* に設定されていないことを確認することをお勧めします。

次に、Node.js コードも確認する必要があります。Node.js は非同期であるため、Redis からの対応する ack パケットを処理する前に、多数の項目を Redis にプッシュできます。コードは、ある時点でクライアント コマンド キュー内の項目数を制限するように設計する必要があります。この点を確認するために、送信されたコマンドの数をカウントし、応答の数 (コールバックを定義することによって計算される) と比較することができます。

最後に、Redis のMONITORコマンドを使用して、Redis サーバーに実際に送信されたすべてのトラフィックが実際に保存されていることを確認することもできます。問題がサーバー側にあるのかクライアント側にあるのかを評価すると役立つ場合があります。

于 2012-03-01T10:32:06.603 に答える
0

本当に、DBSIZEすべてのキーを返すことになっていますか? KEYSコマンドで同じことを試しましたか?

編集:これも役立つかもしれません。 redis dbsize コマンドの精度

于 2012-03-01T09:16:24.737 に答える