|
StackExchange.Redisでredisキャッシュを操作すると、以下のエラーが発生します:
StackExchange.Redis.RedisServerException: MISCONF Redis は RDB スナップショットを保存するように設定されていますが、現在ディスク上に永続化できません。 データセットを変更する可能性のあるコマンドは無効になっています。エラーの詳細についてはRedisのログを確認してください。 一時的な解決策としては、redis.windows.confファイルを変更します。この場合、redisサービスを以下の設定で再起動する必要があります: redisサービスを再起動したくない場合は、redis-cliコマンドを使って以下のように設定できます:
説明は以下の通り:
# デフォルトでは、RDBスナップショットが有効になっている場合、Redisは書き込み # を受け付けなくなります。 (少なくとも1つのセーブポイント)で、最新のバックグラウンド保存が失敗 # した場合、Redisは書き込みを受け付けなくなります。 # これにより, ユーザはデータが適切にディスクに保存されていないことを # (厳しい方法で)認識することになります. そうでなければ, 誰もそれに気づかず, # 災害が起きてしまう可能性があります. # 災難が起こるだろう。 # バックグラウンドで保存処理が開始される場合 # バックグラウンドでの保存処理が再開された場合. # 自動的に書き込みが許可されます。 # # しかし、Redisサーバーの適切な監視をセットアップしているのであれば # 永続化もセットアップしておくと良いでしょう。 # もしRedisサーバーの適切な監視と永続化をセットアップしているのであれば、 # ディスクに問題が発生してもRedisが通常通り動作し続けるように、 # この機能を無効にしたいかもしれません。 # ディスクやパーミッションなどに # 問題が発生しても、Redisは通常通り動作し続ける。 # パーミッションなど。 簡単に言うと、ハードドライブにデータを保存する際、Redisはメインプロセスが誤死しないようにメインプロセスのコピーをForkし、Forkプロセス内でハードドライブへのデータ保存操作を完了する必要がある。 メインプロセスが4GBのメモリーを使用し、Forkサブプロセスがさらに4GBを必要とする場合、メモリーが足りず、Forkは失敗し、ハードドライブへのデータ保存も失敗する。 redisのログを見るには、redis.windows.confを以下のように設定する必要がある:
また、'stdout'を使用することで、強制的に # Redisを標準出力にログ出力させることができます。 # ログファイル名を指定する. ログファイル "E:/Redis-x64-3.2.100/redis.txt" ログの例外は以下の通りです:
[8984] 14 May 14:05:09.060 * pid 8672によりバックグラウンド保存が開始されました。 [8672] 14 May 14:05:09.169 #. Windows版のRedisは、システムのページングファイルからヒープメモリを確保します。 この時点では、Redisディレクトリに利用可能な連続した空き領域が不足しています。 システム・ページング・ファイルのサイズを増やすことができます。 現時点では、システム・ページング・ファイルの空き領域が不足しています。 システム・ページング・ファイルのサイズを増やすことができます。
Redis を続行できません。 [8984] 14 May 14:05:09.278 # フォーク操作に失敗しました
解析の結果、最大ヒープサイズ「maxheap」の設定に問題があり、使用可能なメモリが不足していることが判明しました。
解決方法
Redisの設定ファイル "redis.windows.conf "を開き、以下のコードセクションを見つけます:
# Redisのヒープはmaxmemoryフラグで指定された値よりも大きくなければならない。 ヒープアロケータには独自のメモリ要件があり、ヒープの断片化が # 発生するためです。 maxmemoryフラグのみが指定されている場合、maxheapは # maxmemoryフラグで指定された値よりも大きくなければなりません。 maxmemory # フラグのみが指定された場合, maxheapは1.5*maxmemoryに設定されます. maxmemory とともに # 指定された場合, maxheapフラグは自動的に1.5*maxmemoryに # 設定されます. # 1.5*maxmemoryより小さい場合は自動的に増加します. # # maxheap <バイト この設定を増やすと、redisサービスが起動できなくなります!!! # # # maxheap <bytes デフォルト値は: maxheap 1024000000≈976.56M
confファイルでこのコメントを探したわけではなく、以下のコメントを見つけました:
# 指定されたバイト数以上のメモリを使用しない。 # 指定されたバイト数以上のメモリを使用しないこと # メモリの上限に達すると、Redisはキーの削除を試みます。 # メモリ制限に達した場合、Redisは選択された消去ポリシーに従ってキーの # 削除を試みます(maxmemory-policyを参照)。 # Redisがキーを削除できない場合 # Redisがポリシーに従ってキーを削除できない場合、またはポリシーが # ポリシーに従ってRedisがキーを削除できない場合、またはポリシーが # 'noeviction'に設定されている場合、Redisは以下のようなコマンドに # エラーを返すようになります。 # SETやLPUSHなどのような、より多くのメモリを消費するようなコマンド # に対してはエラーで応答し始めます。 # GETのような読み取りのみのコマンドには返事を返し続ける。 # このオプションは通常, RedisをLRUキャッシュとして利用する場合や, # インスタンスにハードなメモリ制限を設定する場合に有用です. このオプションは通常、RedisをLRUキャッシュとして利用する場合や、 # インスタンスにハードなメモリ制限を設定する場合(「noeviction」ポリシーを利用 # する場合)に有用です。 このオプションは通常, RedisをLRUキャッシュとして利用する場合や, # インスタンスに(「noeviction」ポリシーを利用して)ハードなメモリ制限を # 設定する場合に有用です. # 警告: maxmemoryがオンのインスタンスにスレーブがアタッチされている場合、 # 出力バッファのサイズが制限されます。 スレーブに供給するために必要な出力バッファのサイズは # 使用メモリカウントから差し引かれます。 スレーブに供給するために必要な出力バッファのサイズは, # 使用メモリカウントから差し引かれます. ネットワークの問題や再同期が発生しても, # キーが退避されるループが発生することはありません. スレーブの # バッファが、追い出されたキーのDELによっていっぱいになり、さらに # キーの削除が繰り返される。 その結果、スレーブの出力バッファがいっぱいになり、 # 退去されたキーのDELがさらなるキーの削除を誘発する。 # # 要するに... もしスレーブが接続されているのであれば, # maxmemoryの上限を低く設定することをお勧めします. # スレーブの出力バッファのためにシステム上のRAMに空きがあるように # maxmemoryに下限を設定することが推奨されます。 # (ただし、ポリシーが 'noeviction' の場合は不要です)。 警告: # maxmemoryを設定しない # 警告: maxmemoryを設定しないと、Redisが # メモリ不足例外で終了してしまいます。 警告: maxmemoryを設定しないと, ヒープ限界に達した場合に # メモリ不足例外が発生してRedisが終了します. # # # 注意: Redisはヒープメモリの確保にシステムページングファイルを利用するため, # ヒープメモリの確保にシステムページングファイルが示すワーキングセットの # メモリ使用量が使用されます. # Windowsのタスクマネージャや, # ProcessExplorerのような他のツールで表示されるワーキングセットの # メモリ使用量は. # Windowsタスクマネージャや, ProcessExplorerなどのツールで # 示されるワーキングセットのメモリ使用量は, 常に正確であるとは限りません. # 例えば, RDBやAOFファイルをバックグラウンドで保存した直後, # 作業セットのメモリ使用量が大幅に減少することがあります. redis-serverが使用するメモリの正確な量を確認するために, # # 作業セットの値が大幅に低下することがあります. # INFOクライアントコマンドを使用します. # コマンドは, redisデータの保存に使用されるメモリのみを表示します. # INFOクライアントコマンドでは報告されない # 余分なメモリの量. INFOコマンドによって報告されなかったメモリの # 余分な量は、クライアントコマンドによって報告されたメモリの # ピークワーキングセットを差し引いて計算することができる。 # を差し引くことで計算できる。 # を差し引くことで計算することができる. # # maxmemory <バイト 警告: maxmemoryを設定しないと、Redisがヒープ制限に達した場合に メモリ不足例外で終了してしまいます。
注意:Redisはシステムのページングファイルを使ってヒープメモリを割り当てます。
Windowsタスク・マネージャやProcessExplorerなどのツールで表示されるワーキング・セットのメモリ使用量は、必ずしも正確ではありません。簡単に言うと、タスク・マネージャーで表示されるメモリ使用量は正確ではありません!
infoコマンドを使用して、以下を照会してください:
# メモリ used_memory:2011338768 used_memory_human:1.87G used_memory_rss:2011279992 メモリ使用量:1.87G used_memory_peak:2011338768 使用メモリーピーク:1.87G 合計システムメモリー:0 システム・メモリ合計:0B used_memory_lua:37888 使用メモリー:37.00K 使用メモリー:37888使用メモリー:37.00K 使用メモリー:37888 使用メモリー:37.00K 最大メモリー:0 最大メモリポリシー:noeviction メモリ断片化率:1.00 メモリアロケータ:jemalloc-3.6.0
設定は以下の通りです:
1073741824 バイト = 1G これを設定すると、redis .net クライアントが新しいキャッシュを追加し、以下のエラーを報告する:
使用メモリ > 'maxmemory'の場合、OOMコマンドは許可されません。 # MAXMEMORY POLICY: maxmemory # に達したときにRedisが何を削除するかを選択する方法。 MAXMEMORY POLICY: maxmemory # に達した際にRedisが何を削除するかを選択する方法. # maxmemoryポリシー. # volatile-lru -> LRUアルゴリズムを使って期限切れのキーを削除する。 # allkeys-lru -> LRUアルゴリズムに従って任意のキーを削除する。 # volatile-random -> 期限切れのランダムなキーを削除する。 # allkeys-random -> 任意のランダムキーを削除する。 # volatile-ttl -> 有効期限が最も近い鍵を削除する (マイナーTTL) # noeviction -> 期限を設定せず、書き込み時にエラーを返す。 # noeviction -> 期限を設定せず、書き込み時にエラーを返す # noeviction -> 期限切れにせず、書き込み操作時にエラーを返す # 注意: 上記のいずれのポリシーでも、Redisは書き込み操作時にエラーを返します。 # 注意: 上記のどのポリシーでも、Redisは消去に適したキーがない場合、 # 書き込み操作に対してエラーを返します。 注意: 上記のいずれのポリシーでも、Redisは # 書き込み操作時にエラーを返します。 バックグラウンドでの保存処理が開始される場合. # この記事の執筆時点では, # 以下のコマンドが利用可能です: set setnx setex append # incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd # sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset msetnx exec sort # exec sort # デフォルトは # # maxmemory-policy noeviction # MAXMEMORYポリシー: MAXMEMORYが
が # 到着した場合.5つの動作から選択できる:
#
#volatile lru-> lruアルゴリズムを使って期限切れのキーを削除する。
#allkeys lru->lruアルゴリズムに従って任意のキーを削除する。
#volatile random->有効期限付きのランダムなキーを削除する。
#allkeys random->任意のランダムキーを削除する。
#volatile ttl->有効期限が最も近い鍵を削除 (マイナーttl)
#noeviction-> 有効期限を設定せず、書き込み操作のエラーを返す。
#volatile ttl->直近に期限切れとなったキーを削除 (minor ttl)
# 注意: 上記のいずれのストラテジーでも、Redisは書き込み時に # エラーを返します。
# evictionに適したキーがない場合、Redisは書き込み時にエラーを返す # 注意: 上記のいずれの戦略でも、Redisは書き込み時にエラーを返す。
#
# この記事の執筆時点では, # 以下のコマンドを使用します: set setnx setex append
# インクリメント デクリメント rpush lpushx lpushx linsert lset rpoplpush sadd
#sdiff sdiffstore zadd zincrby
zdiff sdiffstore zadd zincrby #zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby hotel
#getset msetnx exec sort
#
# デフォルト値
#
# maxmemoryポリシーは無効 以下の設定も必要である:
デフォルトのredis設定は非常に保守的です。つまり、メモリを超過しても保存されません。ポリシーをLRUアルゴリズム(Least Recently Used Algorithm)に変更することもできます。
思い出してください:
Redis永続RDBとAOFの違い https://www.itsvse.com/thread-9555-1-1.html
Redisキャッシュを実行するDockerインストール https://www.itsvse.com/thread-8995-1-1.html
Redis Cache Penetration、Cache Avalanche、Cache Knockdownとはどのようなものかの例。 https://www.itsvse.com/thread-8968-1-1.html
Redisワイルドカード一括削除キー https://www.itsvse.com/thread-7957-1-1.html
Redis 5.0.3 on CentOS 7 チュートリアル https://www.itsvse.com/thread-7201-1-1.html
CentOSのphp 5.5.7用のredis拡張のインストール。 https://www.itsvse.com/thread-7200-1-1.html
redisの1つのインスタンスに格納できるキーの数と、キーと値の最大数は? https://www.itsvse.com/thread-6848-1-1.html
redisの1つのインスタンスに格納できるキーの数と、キーと値の最大数を教えてください。 https://www.itsvse.com/thread-5032-1-1.html
redisをリモートアクセスに使用するには? https://www.itsvse.com/thread-5011-1-1.html
Windows で Redis サービスを開始できません。エラー 1067: プロセスが予期せず終了しました。 https://www.itsvse.com/thread-5010-1-1.html
redis4.0.8をcentosにインストールする。 https://www.itsvse.com/thread-4614-1-1.html
redisのリモート接続とアクセスパスワードのセットアップ https://www.itsvse.com/thread-4101-1-1.html
redisがデータキャッシュをクリアする https://www.itsvse.com/thread-4027-1-1.html
redisの永続化設定と永続化の停止 https://www.itsvse.com/thread-4012-1-1.html
redisにおけるsaveとbgsaveの違い https://www.itsvse.com/thread-4010-1-1.html
redisにおける2種類の永続性とその仕組み https://www.itsvse.com/thread-4009-1-1.html
Redisを起動する3つの方法 https://www.itsvse.com/thread-4008-1-1.html
Redisのコマンドラインウィンドウを隠す方法 https://www.itsvse.com/thread-2988-1-1.html
Redisのハッシュ(Hash)フェッチの問題 https://www.itsvse.com/thread-2587-1-1.html
Redisを使う前に知っておくべき5つのこと https://www.itsvse.com/thread-2580-1-1.html
Redis デフォルトポート番号の変更とアクセスパスワードの設定 https://www.itsvse.com/thread-2577-1-1.html
Redis Windows 64 ビット版ダウンロード、公式ダウンロードアドレス https://www.itsvse.com/thread-2576-1-1.html
Luaスクリプトを使用したRedis https://www.itsvse.com/thread-9634-1-1.html
Redisのベンチマーク https://www.itsvse.com/thread-9645-1-1.html 終了
|
前の記事:NPOIセル日付型判定次の記事:NPOI操作 エクセル 詳細
|