Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于内存不足,Redis正在中止_C#_Redis_Stackexchange.redis - Fatal编程技术网

C# 由于内存不足,Redis正在中止

C# 由于内存不足,Redis正在中止,c#,redis,stackexchange.redis,C#,Redis,Stackexchange.redis,我正在尝试将一个大文件(电影)分块移动到redis缓存中。 我正在Windows机箱上使用stackexchange.redis。 redis配置为执行allkey lru并每秒使用append。Maxmemory配置为100mb ConnectionMultiplexer redis2 = ConnectionMultiplexer.Connect("localhost:6380, syncTimeout=100000"); IDatabase db2 = redis2.GetDatabase

我正在尝试将一个大文件(电影)分块移动到redis缓存中。 我正在Windows机箱上使用stackexchange.redis。 redis配置为执行allkey lru并每秒使用append。Maxmemory配置为100mb

ConnectionMultiplexer redis2 = ConnectionMultiplexer.Connect("localhost:6380, syncTimeout=100000");
IDatabase db2 = redis2.GetDatabase();

const int chunkSize = 4096;
string fileName = "D:\\movie.mp4";
using (var file = File.OpenRead(fileName))
{
    int bytesRead;
    int inCounter = 1;
    var buffer = new byte[chunkSize];
    while ((bytesRead = file.Read(buffer, 0, buffer.Length)) > 0)
    {
        db2.StringSet(file.Name + inCounter, buffer);
        inCounter++;
    }
}
当chunk size为chunkSize=4096时,一切都很好。 但是,当我将区块大小更改为65536时,服务器会崩溃,并出现以下日志:

[2816] 20 Jul 23:06:42.300 * Starting automatic rewriting of AOF on 6766592700% growth
[2816] 20 Jul 23:06:42.331 * Background append only file rewriting started by pid 3672
[3672] 20 Jul 23:06:42.331 # Write error writing append only file on disk: Invalid argument
[3672] 20 Jul 23:06:42.331 # rewriteAppendOnlyFile failed in qfork: Invalid argument
[2816] 20 Jul 23:06:42.440 # fork operation complete
[2816] 20 Jul 23:06:42.440 # Background AOF rewrite terminated with error
[2816] 20 Jul 23:06:42.549 * Starting automatic rewriting of AOF on 7232582200% growth
[2816] 20 Jul 23:06:42.581 * Background append only file rewriting started by pid 1440
[2816] 20 Jul 23:06:42.581 # Out Of Memory allocating 10485768 bytes!
[2816] 20 Jul 23:06:42.581 #

=== REDIS BUG REPORT START: Cut & paste starting from here ===
[2816] 20 Jul 23:06:42.581 # ------------------------------------------------
[2816] 20 Jul 23:06:42.581 # !!! Software Failure. Press left mouse button to continue
[2816] 20 Jul 23:06:42.581 # Guru Meditation: "Redis aborting for OUT OF MEMORY" #..\src\redis.c:3467
[2816] 20 Jul 23:06:42.581 # ------------------------------------------------
[1440] 20 Jul 23:06:42.581 # Write error writing append only file on disk: Invalid argument
[1440] 20 Jul 23:06:42.581 # rewriteAppendOnlyFile failed in qfork: Invalid argument

有什么想法吗?

结果是一个非常有趣和令人惊讶的问题

造成这种情况的真正原因是他们正在使用的分配器中的内存碎片(
dlmalloc
)。 希望MSFT能让这一切变得更好,但我希望这需要一些时间

与此同时,解决方法也在不断改进

解决此问题的正确方法(目前)

配置
maxmemory
maxheap
参数。使
maxheap
maxmemory
大得多

因此,如果您想要
maxmemory=100MB
,请将
maxheap
5倍甚至10倍大,例如
maxheap=500MB
甚至
maxheap=1000MB
。 我不认为有一个好的经验法则,那就是
maxheap
需要多大,这就是为什么它是一个如此棘手的问题

这样做的效果是:Redis仍将尝试将内存使用量保持在
100MB
以下,但实际使用的物理内存可能会减少 大于该值,可能高达
maxheap
值。具体数量取决于碎片化程度。有希望地 在现实生活中,这将保持在合理的水平


我已将问题记录到团队中



编辑:根据新的知识,我完全修改了这个答案。请参阅编辑历史记录中的早期版本。

使用此命令设置它肯定会工作的最大堆大小

redis服务器redis.windows.conf–-maxheap 1gb


当你(可能)调到磁盘时,在Redis中缓存有什么意义呢?听起来你正在耗尽可用的内存空间,它无法足够快地刷新到磁盘。这就解释了为什么增加缓冲区大小会使它爆炸。嘿,Komrade.P,首先感谢您的帮助。我尝试了您建议的修复,它解决了“内存不足”异常。然而,现在程序没有崩溃,但是appendonly文件无法重写自身,只是继续增长,并且超过了100MB的限制。谢谢:)是的,对我也不管用。可能与此有关:。这有点蹩脚,但您可以通过设置
appendonly no
来禁用aof。还可以使用
save=”“
关闭rdb内容。至少这应该允许您继续。有趣的是,如果我在调试模式下编译,一切都会正常工作,这是内存问题的一个明显迹象。无论如何,谢谢你。我想我会等待修复..AOF问题看起来已经解决了,想试一试,看看这是否适用于您吗?我用2.8.2101版测试了该场景,问题似乎已得到解决。非常感谢@Komrade P.I。我可以修复,但我们正在等待新版本