Skip to content

restic fatal error: runtime: out of memory #526

@egalanos

Description

@egalanos

This was from trying to run a first time backup from my laptop via sftp to a backup repository which is 5 TiB in size (from backing up a server & workstation).

Output of restic version

restic 0.1.0 (v0.1.0-548-g795e3d5)
compiled at 2016-05-24 22:26:48 with go1.5.4

Actual behavior

fatal error: runtime: out of memory

runtime stack:
runtime.throw(0xa37550, 0x16)
/usr/lib/golang/src/runtime/panic.go:527 +0x90
runtime.sysMap(0xc98a740000, 0x5a000000, 0x118f00, 0xc94d58)
/usr/lib/golang/src/runtime/mem_linux.go:203 +0x9b
runtime.mHeap_SysAlloc(0xc75b00, 0x5a000000, 0xc820001c80)
/usr/lib/golang/src/runtime/malloc.go:426 +0x160
runtime.mHeap_Grow(0xc75b00, 0x2d000, 0x0)
/usr/lib/golang/src/runtime/mheap.go:628 +0x63
runtime.mHeap_AllocSpanLocked(0xc75b00, 0x2d000, 0x100)
/usr/lib/golang/src/runtime/mheap.go:532 +0x5f1
runtime.mHeap_Alloc_m(0xc75b00, 0x2d000, 0x100000000, 0xc800000001)
/usr/lib/golang/src/runtime/mheap.go:425 +0x1ac
runtime.mHeap_Alloc.func1()
/usr/lib/golang/src/runtime/mheap.go:484 +0x41
runtime.systemstack(0x7fc0f294fe28)
/usr/lib/golang/src/runtime/asm_amd64.s:278 +0xab
runtime.mHeap_Alloc(0xc75b00, 0x2d000, 0x10100000000, 0x4357af)
/usr/lib/golang/src/runtime/mheap.go:485 +0x63
runtime.largeAlloc(0x5a000000, 0x7fc000000001, 0xc80000001d)
/usr/lib/golang/src/runtime/malloc.go:748 +0xb3
runtime.mallocgc.func3()
/usr/lib/golang/src/runtime/malloc.go:637 +0x33
runtime.systemstack(0xc820020a00)
/usr/lib/golang/src/runtime/asm_amd64.s:262 +0x79
runtime.mstart()
/usr/lib/golang/src/runtime/proc1.go:668

goroutine 82 [running]:
runtime.systemstack_switch()
/usr/lib/golang/src/runtime/asm_amd64.s:216 fp=0xc824197608 sp=0xc824197600
runtime.mallocgc(0x5a000000, 0x94a5c0, 0x7fc000000001, 0x429622)
/usr/lib/golang/src/runtime/malloc.go:638 +0x9c4 fp=0xc8241976d8 sp=0xc824197608
runtime.newarray(0x94a5c0, 0x200000, 0x4bd4693f)
/usr/lib/golang/src/runtime/malloc.go:780 +0xc9 fp=0xc824197718 sp=0xc8241976d8
runtime.hashGrow(0x84f740, 0xc822d9a000)
/usr/lib/golang/src/runtime/hashmap.go:761 +0x82 fp=0xc824197748 sp=0xc824197718
runtime.mapassign1(0x84f740, 0xc822d9a000, 0xc824197900, 0xc8241978b8)
/usr/lib/golang/src/runtime/hashmap.go:481 +0x55b fp=0xc8241977f0 sp=0xc824197748
restic/repository.DecodeIndex(0x7fc0f2951530, 0xc822d9a030, 0xc8200fe070, 0x0, 0x0)
/tmp/restic-build-781614583/src/restic/repository/index.go:519 +0x5ba fp=0xc824197a68 sp=0xc8241977f0
restic/repository.LoadIndexWithDecoder(0xc8200942a0, 0xe579cf34c883a906, 0x375522f06072b6de, 0x7a12e8d1a4c630ce, 0x14e7bc67aaec6f38, 0xac7120, 0x40, 0x0, 0x0)
/tmp/restic-build-781614583/src/restic/repository/index.go:568 +0x2d2 fp=0xc824197bb0 sp=0xc824197a68
restic/repository.LoadIndex(0xc8200942a0, 0xe579cf34c883a906, 0x375522f06072b6de, 0x7a12e8d1a4c630ce, 0x14e7bc67aaec6f38, 0x375522f06072b6de, 0x0, 0x0)
/tmp/restic-build-781614583/src/restic/repository/repository.go:380 +0x60 fp=0xc824197c78 sp=0xc824197bb0
restic/repository.(*Repository).LoadIndex.func1(0xe579cf34c883a906, 0x375522f06072b6de, 0x7a12e8d1a4c630ce, 0x14e7bc67aaec6f38, 0xc820094c00, 0x0, 0x0)
/tmp/restic-build-781614583/src/restic/repository/repository.go:348 +0x59 fp=0xc824197d78 sp=0xc824197c78
restic/repository.ParallelWorkFuncParseID.func1(0xc820099080, 0x40, 0xc820094c00, 0x0, 0x0)
/tmp/restic-build-781614583/src/restic/repository/parallel.go:89 +0x269 fp=0xc824197e60 sp=0xc824197d78
restic/repository.FilesInParallel.func1(0xc8200f4770, 0xc820094c60, 0xc8200f4760, 0xc820094c00, 0xc820094cc0)
/tmp/restic-build-781614583/src/restic/repository/parallel.go:53 +0x114 fp=0xc824197f68 sp=0xc824197e60
runtime.goexit()
/usr/lib/golang/src/runtime/asm_amd64.s:1721 +0x1 fp=0xc824197f70 sp=0xc824197f68
created by restic/repository.FilesInParallel
/tmp/restic-build-781614583/src/restic/repository/parallel.go:63 +0x185

goroutine 1 [chan receive, 4 minutes]:
restic/repository.(_Repository).LoadIndex(0xc8200942a0, 0x0, 0x0)
/tmp/restic-build-781614583/src/restic/repository/repository.go:367 +0x17a
main.CmdBackup.Execute(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7ffe97eed4e9, 0x1d, 0x0, 0xa943e2, ...)
/tmp/restic-build-781614583/src/cmds/restic/cmd_backup.go:302 +0x59c
main.(_CmdBackup).Execute(0xc82001c240, 0xc820013dd0, 0x1, 0x3, 0x0, 0x0)
:14 +0xe0
github.com/jessevdk/go-flags.(_Parser).ParseArgs(0xc820078870, 0xc82000a250, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0)
/tmp/restic-build-781614583/src/github.com/jessevdk/go-flags/parser.go:278 +0x8e3
github.com/jessevdk/go-flags.(_Parser).Parse(0xc820078870, 0x0, 0x0, 0x0, 0x0, 0x0)
/tmp/restic-build-781614583/src/github.com/jessevdk/go-flags/parser.go:154 +0x9b
main.main()
/tmp/restic-build-781614583/src/cmds/restic/main.go:26 +0x1d1

goroutine 17 [syscall, 4 minutes, locked to thread]:
runtime.goexit()
/usr/lib/golang/src/runtime/asm_amd64.s:1721 +0x1

goroutine 5 [syscall, 4 minutes]:
os/signal.loop()
/usr/lib/golang/src/os/signal/signal_unix.go:22 +0x18
created by os/signal.init.1
/usr/lib/golang/src/os/signal/signal_unix.go:28 +0x37

goroutine 6 [chan receive, 4 minutes]:
restic.init.1.func1.1()
/tmp/restic-build-781614583/src/restic/lock.go:262 +0x16f
created by restic.init.1.func1
/tmp/restic-build-781614583/src/restic/lock.go:265 +0x2b

goroutine 18 [select, 4 minutes, locked to thread]:
runtime.gopark(0xac7450, 0xc820026728, 0x9d4da8, 0x6, 0x44ed18, 0x2)
/usr/lib/golang/src/runtime/proc.go:185 +0x163
runtime.selectgoImpl(0xc820026728, 0x0, 0x18)
/usr/lib/golang/src/runtime/select.go:392 +0xa64
runtime.selectgo(0xc820026728)
/usr/lib/golang/src/runtime/select.go:212 +0x12
runtime.ensureSigM.func1()
/usr/lib/golang/src/runtime/signal1_unix.go:227 +0x353
runtime.goexit()
/usr/lib/golang/src/runtime/asm_amd64.s:1721 +0x1

goroutine 7 [chan receive, 4 minutes]:
main.CleanupHandler(0xc82001c1e0)
/tmp/restic-build-781614583/src/cmds/restic/cleanup.go:58 +0x7b
created by main.init.1
/tmp/restic-build-781614583/src/cmds/restic/cleanup.go:25 +0x12a

goroutine 8 [syscall, 1 minutes]:
syscall.Syscall(0x0, 0x5, 0xc823bbbca0, 0x4, 0x18, 0x18, 0x0)
/usr/lib/golang/src/syscall/asm_linux_amd64.s:18 +0x5
syscall.read(0x5, 0xc823bbbca0, 0x4, 0x4, 0x18, 0x0, 0x0)
/usr/lib/golang/src/syscall/zsyscall_linux_amd64.go:783 +0x5f
syscall.Read(0x5, 0xc823bbbca0, 0x4, 0x4, 0x18, 0x0, 0x0)
/usr/lib/golang/src/syscall/syscall_unix.go:160 +0x4d
os.(_File).read(0xc82002e240, 0xc823bbbca0, 0x4, 0x4, 0x18, 0x0, 0x0)
/usr/lib/golang/src/os/file_unix.go:211 +0x53
os.(_File).Read(0xc82002e240, 0xc823bbbca0, 0x4, 0x4, 0x18, 0x0, 0x0)
/usr/lib/golang/src/os/file.go:95 +0x8a
io.ReadAtLeast(0x7fc0f4999568, 0xc82002e240, 0xc823bbbca0, 0x4, 0x4, 0x4, 0x0, 0x0, 0x0)
/usr/lib/golang/src/io/io.go:298 +0xe6
io.ReadFull(0x7fc0f4999568, 0xc82002e240, 0xc823bbbca0, 0x4, 0x4, 0x18, 0x0, 0x0)
/usr/lib/golang/src/io/io.go:316 +0x62
github.com/pkg/sftp.recvPacket(0x7fc0f4999568, 0xc82002e240, 0xc82003af70, 0x0, 0x0, 0x0, 0x0, 0x0)
/tmp/restic-build-781614583/src/github.com/pkg/sftp/packet.go:143 +0xde
github.com/pkg/sftp.(*Client).recv(0xc820078960)
/tmp/restic-build-781614583/src/github.com/pkg/sftp/client.go:160 +0x7f
created by github.com/pkg/sftp.NewClientPipe
/tmp/restic-build-781614583/src/github.com/pkg/sftp/client.go:77 +0x2d6

goroutine 11 [select, 4 minutes]:
main.refreshLocks(0xc6d760, 0xc820094ae0)
/tmp/restic-build-781614583/src/cmds/restic/lock.go:69 +0x434
created by main.lockRepository
/tmp/restic-build-781614583/src/cmds/restic/lock.go:46 +0x196

goroutine 12 [semacquire, 4 minutes]:
sync.runtime_Semacquire(0xc8200f477c)
/usr/lib/golang/src/runtime/sema.go:43 +0x26
sync.(_WaitGroup).Wait(0xc8200f4770)
/usr/lib/golang/src/sync/waitgroup.go:126 +0xb4
restic/repository.FilesInParallel(0x7fc0f4999f20, 0xc82012c000, 0x9d37b0, 0x5, 0x14, 0xc8200f4760, 0x0, 0x0)
/tmp/restic-build-781614583/src/restic/repository/parallel.go:66 +0x1ad
restic/repository.(_Repository).LoadIndex.func2(0xc820094ba0, 0xc820094b40, 0xc8200942a0, 0xc820142760)
/tmp/restic-build-781614583/src/restic/repository/repository.go:364 +0xc4
created by restic/repository.(*Repository).LoadIndex
/tmp/restic-build-781614583/src/restic/repository/repository.go:365 +0x143

Steps to reproduce the behavior

Simply try to run the first time backup.

I believe the problem is that the memory requirements for reading the index files is too large. I recently did a rebuild index on another machine. It was super memory intensive and required the machine to have 8GiB + swap to complete the job.

On the backup drive:

du -sh index

939M index

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions