MemoryError в Redis при конвейерной обработке
Я использую этот скрипт Python для переноса данных из одного экземпляра ElastiCache Redis в другой. Он использует конвейеризацию Redis для переноса данных в виде фрагментов.
https://gist.github.com/thomasst/afeda8fe80534a832607
Но я получаю эту странную ошибку:
Traceback (most recent call last):########### | ETA: 0:00:12
File "migrate-redis.py", line 95, in <module>
migrate()
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 664, in __call__
return self.main(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 644, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 837, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 464, in invoke
return callback(*args, **kwargs)
File "migrate-redis.py", line 74, in migrate
results = pipeline.execute(False)
File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 2593, in execute
return execute(conn, stack, raise_on_error)
File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 2446, in _execute_transaction
all_cmds = connection.pack_commands([args for args, _ in cmds])
File "/usr/local/lib/python2.7/dist-packages/redis/connection.py", line 637, in pack_commands
output.append(SYM_EMPTY.join(pieces))
MemoryError
Нет проблем с оперативной памятью, так как узел имеет 6 ГБ оперативной памяти.
Профиль памяти источника redis выглядит следующим образом:
used_memory:1483900120
used_memory_human:1.38G
used_memory_rss:1945829376
used_memory_peak:2431795528
used_memory_peak_human:2.26G
used_memory_lua:86016
mem_fragmentation_ratio:1.31
mem_allocator:jemalloc-3.6.0
Что может быть причиной этого?
1 ответ
Из вашего журнала ошибок, он не имеет никакого отношения к вашему серверу redis. Ошибка происходит в вашем Redis-клиенте, когда он упаковывает все команды в буфер памяти.
Возможно, вы можете попытаться уменьшить опцию SCAN count в вашем файле migrate-redis.py, чтобы проверить, не слишком ли он велик для упаковки.