<p>restic prune : λ©”λͺ¨λ¦¬ λΆ€μ‘±</p>

에 λ§Œλ“  2018λ…„ 04μ›” 16일  Β·  31μ½”λ©˜νŠΈ  Β·  좜처: restic/restic

restic version

restic 0.8.3 (v0.8.3-0-g272ccec7)
linux / amd64μ—μ„œ go1.10으둜 컴파일

μ •ν™•νžˆ μ–΄λ–»κ²Œ νœ΄μ‹μ„ μ·¨ν–ˆμŠ΅λ‹ˆκΉŒ?

RESTIC_PASSWORD = foobar
RESTIC_REPOSITORY = / data / joe / restic
restic prune

μ €μž₯μ†Œλ₯Ό μ €μž₯ν•˜λŠ” 데 μ‚¬μš©ν•œ λ°±μ—”λ“œ / μ„œλ²„ / μ„œλΉ„μŠ€λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

직접 파일 μ•‘μ„ΈμŠ€.

μ˜ˆμƒλ˜λŠ” 행동

Restic은 repoλ₯Ό μ •λ¦¬ν•©λ‹ˆλ‹€.

μ‹€μ œ 행동

2018-04-16 18:33:51: Starting restic prune
counting files in repo
building new index for repo
[11:59] 100.00%  291017 / 291017 packs

incomplete pack file (will be removed): 02b612398378d4b6d7b6a77b5f51cf3c541baa78f542886810c27488fc52f8a2
incomplete pack file (will be removed): 08ce4b79b2adacd1d85373c59ad28777e215cec52b16bf9963cb03106e1d547f
incomplete pack file (will be removed): 08d76e1953f8b06d936f46679986f0af9bfb0260ca1b81e641d30262f4e2fb69
incomplete pack file (will be removed): 0ada7a6774140391104de82da908a1027eaedc97be83a2c30ae26db85093aba1
incomplete pack file (will be removed): 0f960d42718f0e0b29ea10a47fef530638811fd1620843e13e4c4c3c139c9477
incomplete pack file (will be removed): 11aa5b87e3a44ff1678de573e21280ff56e8cdf93755c363c7ba1a03537b84b0
incomplete pack file (will be removed): 13b211c7fc26e7de47e8a5387749bb93f7737217809143e01caf7f826deeea13
incomplete pack file (will be removed): 13f00bb9960f95b0d71abc9ff5e5b86f53d370cd602a4c45e03505cefab328ab
incomplete pack file (will be removed): 1b0be1e761e0c369aaed7b2d03f07163854946dfe7b6bb749d4ff5d5c62cfd61
incomplete pack file (will be removed): 1ee341e8778661a76bc0f4d2a285457851cb5984f6ac6ee51d42bbdf705025ab
incomplete pack file (will be removed): 26de4ab07458e880217accac26098edcc46622d11d20dcbb57996cfebedbc859
incomplete pack file (will be removed): 274ede1a69f1f2634abeb6f7f7a9af2a4027a7f224d7a61a6e209ef8ee4c152f
incomplete pack file (will be removed): 383bad67ef592da43d0cc9793bc6e1afc4a4327fc2c504b753111888b6c189f3
incomplete pack file (will be removed): 39d74d322db6b80f613efabe4c1b7242b3ff31ab936b60a0a4ee903713f9b299
incomplete pack file (will be removed): 419b5a6e3ebbab53150b5106316e8f3183ef7dd6d3b0c10de0a611dedb7ea846
incomplete pack file (will be removed): 44ba8b9892a33391201339cbea4c963707ee16d30c6ca96d38d96bbeadfe23ca
incomplete pack file (will be removed): 45b75bb12def8334143681bf89811c68baace1376311e3ca79478021faf6b062
incomplete pack file (will be removed): 47947ddb8dd54856e22ec44b0de268668b89ccac77e6145a61f05870ab23c57d
incomplete pack file (will be removed): 4ba9ef53b1579d10d0682153382a6a30d12e444bf3ac0b55dd3e5bbe1f151d9f
incomplete pack file (will be removed): 4d36946b6c368baf824590d0846b1c28cb34943c8fd16734b83847b42ded8dab
incomplete pack file (will be removed): 61b294bea904324ef980d75c5b5da2f0e8b6d9be1aa16e55b7606afe5623df69
incomplete pack file (will be removed): 65555bcda953ddb00af9e3d141a4c274614d5dfd3a6345bf396872028852797c
incomplete pack file (will be removed): 716d9a5a48c2d364069fc9c9576c1683bd99cecc7b0232c53034a70bca9aed2b
incomplete pack file (will be removed): 71766e7583ba835480aa87e02566b23c26ba940ecc0f697beb2aaa0621422f4c
incomplete pack file (will be removed): 74f82d71b0f881c95f5eb54668355ce2d9f32a5a6087ec61e52618f909af377c
incomplete pack file (will be removed): 8476543253237a28264c87c70f41eb87883488f8d84314045cc07c3e7deee656
incomplete pack file (will be removed): 8d9d77e05a32a84da1a62159c245a004d55386923137f406c74b1b01281d07d3
incomplete pack file (will be removed): 8fa209c571b2cace97f5725c12c3a110deef8b8f7cfe6705f28175ac6182e9b8
incomplete pack file (will be removed): 9146ec8c10a77c248aa0db6aa291c25b83498848afddfbb4bb33b9928b003fdf
incomplete pack file (will be removed): 9f5e6c422683e05fe9cb7212d44c6492c55d24cb55230407cc59ebd06c96dde7
incomplete pack file (will be removed): a4ac5898b871d3a4343e2fd4c88aaae2e1a31879cce0d90d4e93527334a9deeb
incomplete pack file (will be removed): aa0d2b035ebcab381cd816ba2000d61c43f824621fafc74b81e5cfa1524ae94c
incomplete pack file (will be removed): aa2f5ba3a21a7b12ed23ab198ee457c5fde4921344cd350f2cb9ea675d05a1d6
incomplete pack file (will be removed): aa8f152200a3657728e68eddc1a9ad4c3cecf20af568d4fa01727ffb86005856
incomplete pack file (will be removed): af13847a8a95013afc34b59dfb40daa1c74f0067100a49adf5b1279559d3afd5
incomplete pack file (will be removed): af287ee5aa3c436cba495f4a73f30bf43d23e995d94913c9e64e12dd670b0a36
incomplete pack file (will be removed): ba38890edd8e2c84feb3af506427b6fd5cb4bd4150d7a5784f15f82e01598ca1
incomplete pack file (will be removed): bca933d271cd67feb9b42c55eb168d9f44bb568a121d3947fa443975e47e1ba1
incomplete pack file (will be removed): bd6cdb11204f445cc413cd04fbf56038eee417bc6312dd26624c037eba153417
incomplete pack file (will be removed): c436f5f332c6dbefa57456c8b0532cb3a89beb99564ab67b3ecc433bb0654df3
incomplete pack file (will be removed): cffa984794599843ec0b673c906a84f7813a4ee2346af3bacb6b7c2a217e172f
incomplete pack file (will be removed): d1aeb4847d269c3e6c469e2ac7a82e846f7891f357b0c3b25ef7fa8cc1bd9388
incomplete pack file (will be removed): d2269e9659755adb4d0c8944cb2abe1d6b2e75fa48e9c2ac749ec07c1222e196
incomplete pack file (will be removed): d29e8e66df6380d8f6bf65e18f35bc4597539e73c9a1932bca3dc067fa219ad6
incomplete pack file (will be removed): eb9e4049591e77ad69bc52d9bf830872798bc5c0814ad7cf65eb03befc38bed8
incomplete pack file (will be removed): ec458035798f3e4159314a50e0b7e3f5b8766564aef307c7f10fa7ac3f6dfa5d
incomplete pack file (will be removed): ecf1542bf4a15bc44d447973fc6312fe1a4e2528b5fd07aa9264f5b4bae6820c
incomplete pack file (will be removed): ee2ce3bd4a13ee395ad3a4a95dd0aa017e0b17ecf2cbd1faa66124e510717762
incomplete pack file (will be removed): ee637a1a84fc5819dee56c3192f38bf3895a00b42f6d3ddec5e2ed43c208e18a
incomplete pack file (will be removed): ef4e136efdd73d6e667c8afc8deccaf1d8e6c425d66eb377d5fa1fa85c484394
incomplete pack file (will be removed): f1d0b28ff0c5bdb8d77f9a7381324a54f574a7e9eb0f7e7320f315a26a71cb7a
repository contains 290966 packs (4042496 blobs) with 1.350 TiB
processed 4042496 blobs: 14417 duplicate blobs, 947.112 MiB duplicate
load all snapshots
find data that is still in use for 30 snapshots
[14:50] 100.00%  30 / 30 snapshots

found 4020862 of 4042496 data blobs still in use, removing 21634 blobs
will remove 51 invalid files
will delete 110 packs and rewrite 34143 packs, this frees 1.797 GiB
fatal error: runtime: out of memory

runtime stack:
runtime.throw(0xae011d, 0x16)
    /usr/local/go/src/runtime/panic.go:619 +0x81
runtime.sysMap(0xc4f7c60000, 0x490000, 0x43fd00, 0xe91e58)
    /usr/local/go/src/runtime/mem_linux.go:216 +0x20a
runtime.(*mheap).sysAlloc(0xe78660, 0x490000, 0x7fd3f522c098)
    /usr/local/go/src/runtime/malloc.go:470 +0xd4
runtime.(*mheap).grow(0xe78660, 0x248, 0x0)
    /usr/local/go/src/runtime/mheap.go:907 +0x60
runtime.(*mheap).allocSpanLocked(0xe78660, 0x248, 0xe91e68, 0xc45cd39ee0)
    /usr/local/go/src/runtime/mheap.go:820 +0x301
runtime.(*mheap).alloc_m(0xe78660, 0x248, 0x410101, 0xc41e8c7fff)
    /usr/local/go/src/runtime/mheap.go:686 +0x118
runtime.(*mheap).alloc.func1()
    /usr/local/go/src/runtime/mheap.go:753 +0x4d
runtime.(*mheap).alloc(0xe78660, 0x248, 0xc45c010101, 0x4142ac)
    /usr/local/go/src/runtime/mheap.go:752 +0x8a
runtime.largeAlloc(0x48f87c, 0x450101, 0x7fd3f5ca56c8)
    /usr/local/go/src/runtime/malloc.go:826 +0x94
runtime.mallocgc.func1()
    /usr/local/go/src/runtime/malloc.go:721 +0x46
runtime.systemstack(0x0)
    /usr/local/go/src/runtime/asm_amd64.s:409 +0x79
runtime.mstart()
    /usr/local/go/src/runtime/proc.go:1170

goroutine 1 [running]:
runtime.systemstack_switch()
    /usr/local/go/src/runtime/asm_amd64.s:363 fp=0xc480ad81c8 sp=0xc480ad81c0 pc=0x454010
runtime.mallocgc(0x48f87c, 0x9cfd20, 0x979301, 0xc4d6371720)
    /usr/local/go/src/runtime/malloc.go:720 +0x8a2 fp=0xc480ad8268 sp=0xc480ad81c8 pc=0x410882
runtime.makeslice(0x9cfd20, 0x48f87c, 0x48f87c, 0x1, 0x1, 0x58f)
    /usr/local/go/src/runtime/slice.go:61 +0x77 fp=0xc480ad8298 sp=0xc480ad8268 pc=0x43fdc7
github.com/restic/restic/internal/repository.Repack(0xb5a640, 0xc420068e40, 0xb62260, 0xc4202510a0, 0xc424eb4120, 0xc475dfecf0, 0xc4200c38c0, 0x9c5582208afec32f, 0xc475dfecf0, 0xc475dfed20)
    /tmp/restic-build-762914258/src/github.com/restic/restic/internal/repository/repack.go:60 +0xec3 fp=0xc480ad8a60 sp=0xc480ad8298 pc=0x752d93
main.pruneRepository(0xc420024012, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
    src/github.com/restic/restic/cmd/restic/cmd_prune.go:278 +0x1e99 fp=0xc480ad9990 sp=0xc480ad8a60 pc=0x94d959
main.runPrune(0xc420024012, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
    src/github.com/restic/restic/cmd/restic/cmd_prune.go:85 +0x153 fp=0xc480ad9ab8 sp=0xc480ad9990 pc=0x94b943
main.glob..func17(0xe6b180, 0xe8ffd8, 0x0, 0x0, 0x0, 0x0)
    src/github.com/restic/restic/cmd/restic/cmd_prune.go:25 +0x4d fp=0xc480ad9bb8 sp=0xc480ad9ab8 pc=0x95e07d
github.com/restic/restic/vendor/github.com/spf13/cobra.(*Command).execute(0xe6b180, 0xe8ffd8, 0x0, 0x0, 0xe6b180, 0xe8ffd8)
    /tmp/restic-build-762914258/src/github.com/restic/restic/vendor/github.com/spf13/cobra/command.go:698 +0x46d fp=0xc480ad9c60 sp=0xc480ad9bb8 pc=0x6b34ed
github.com/restic/restic/vendor/github.com/spf13/cobra.(*Command).ExecuteC(0xe69e60, 0xffffffffffffffff, 0x0, 0x19)
    /tmp/restic-build-762914258/src/github.com/restic/restic/vendor/github.com/spf13/cobra/command.go:783 +0x2e4 fp=0xc480ad9d90 sp=0xc480ad9c60 pc=0x6b3c64
github.com/restic/restic/vendor/github.com/spf13/cobra.(*Command).Execute(0xe69e60, 0x24, 0xc420217eb8)
    /tmp/restic-build-762914258/src/github.com/restic/restic/vendor/github.com/spf13/cobra/command.go:736 +0x2b fp=0xc480ad9dc0 sp=0xc480ad9d90 pc=0x6b395b
main.main()
    src/github.com/restic/restic/cmd/restic/main.go:69 +0x1d6 fp=0xc480ad9f88 sp=0xc480ad9dc0 pc=0x95c796
runtime.main()
    /usr/local/go/src/runtime/proc.go:198 +0x212 fp=0xc480ad9fe0 sp=0xc480ad9f88 pc=0x42b472
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:2361 +0x1 fp=0xc480ad9fe8 sp=0xc480ad9fe0 pc=0x456b31

goroutine 5 [syscall, 28 minutes]:
os/signal.signal_recv(0x0)
    /usr/local/go/src/runtime/sigqueue.go:139 +0xa6
os/signal.loop()
    /usr/local/go/src/os/signal/signal_unix.go:22 +0x22
created by os/signal.init.0
    /usr/local/go/src/os/signal/signal_unix.go:28 +0x41

goroutine 6 [chan receive, 28 minutes]:
github.com/restic/restic/internal/restic.init.0.func1.1()
    /tmp/restic-build-762914258/src/github.com/restic/restic/internal/restic/lock.go:266 +0xef
created by github.com/restic/restic/internal/restic.init.0.func1
    /tmp/restic-build-762914258/src/github.com/restic/restic/internal/restic/lock.go:263 +0x35

goroutine 7 [select, 28 minutes, locked to thread]:
runtime.gopark(0xb01d80, 0x0, 0xad384f, 0x6, 0x18, 0x1)
    /usr/local/go/src/runtime/proc.go:291 +0x11a
runtime.selectgo(0xc420042f50, 0xc42002c2a0)
    /usr/local/go/src/runtime/select.go:392 +0xe50
runtime.ensureSigM.func1()
    /usr/local/go/src/runtime/signal_unix.go:549 +0x1f4
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:2361 +0x1

goroutine 17 [chan receive, 28 minutes]:
github.com/restic/restic/internal/restic.init.2.func1(0xc42002c1e0)
    /tmp/restic-build-762914258/src/github.com/restic/restic/internal/restic/progress_unix.go:17 +0xa3
created by github.com/restic/restic/internal/restic.init.2
    /tmp/restic-build-762914258/src/github.com/restic/restic/internal/restic/progress_unix.go:16 +0xab

goroutine 18 [chan receive, 28 minutes]:
main.CleanupHandler(0xc42021c1e0)
    src/github.com/restic/restic/cmd/restic/cleanup.go:62 +0x5d
created by main.init.0
    src/github.com/restic/restic/cmd/restic/cleanup.go:24 +0x6d

goroutine 33 [select, 3 minutes]:
main.refreshLocks(0xe71be0, 0xc4201322a0)
    src/github.com/restic/restic/cmd/restic/lock.go:72 +0x221
created by main.lockRepository
    src/github.com/restic/restic/cmd/restic/lock.go:49 +0x373

goroutine 40 [select]:
github.com/restic/restic/internal/restic.(*Progress).reporter(0xc4200c38c0)
    /tmp/restic-build-762914258/src/github.com/restic/restic/internal/restic/progress.go:169 +0x130
created by github.com/restic/restic/internal/restic.(*Progress).Start
    /tmp/restic-build-762914258/src/github.com/restic/restic/internal/restic/progress.go:96 +0x132
2018-04-16 19:02:18: Terminated: restic prune (return code 2)

행동을 μž¬ν˜„ν•˜λŠ” 단계

4GiB의 λ©”λͺ¨λ¦¬μ™€ Intel (R) Core ( TM) i3-3225 CPU @ 3.30GHz. 그런 λ‹€μŒ ~ 1.5TB 크기의 μ €μž₯μ†Œλ₯Ό λ§Œλ“€κ³  μ„œλ²„ μΈ‘μ—μ„œ restic prune을 μ‹€ν–‰ν•˜μ‹­μ‹œμ˜€.

이 문제의 원인이 무엇인지 μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ?

λ‚΄κ°€ restic을 μ‹€ν–‰ν•˜λŠ” μ‹œμŠ€ν…œμ—λŠ” 4GiB의 λ©”λͺ¨λ¦¬κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘ , 더 λ§Žμ„μˆ˜λ‘ μ’‹μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ΄λŸ¬ν•œ μœ ν˜•μ˜ 였λ₯˜μ— λŒ€ν•΄ restic이 μ‹€νŒ¨ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 더 쒋을 κ²ƒμž…λ‹ˆλ‹€.

문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법을 μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ?

ν™•μ‹€ν•œ. μ‹œμŠ€ν…œμ— 더 λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μΆ”κ°€ν•˜λŠ” 것이 ν•˜λ‚˜μ˜ μ†”λ£¨μ…˜μž…λ‹ˆλ‹€. λ˜λŠ”λ³΄λ‹€ 효율적으둜 νœ΄μ‹μ„ μ·¨ν•˜μ‹­μ‹œμ˜€ (λ¦¬μ†ŒμŠ€ λˆ„μΆœμ΄ μ—†λŠ”μ§€ 확인).

restic이 당신을 λ„μ™”κ±°λ‚˜ μ–΄λ–€ 식 μœΌλ‘œλ“  당신을 ν–‰λ³΅ν•˜κ²Œ λ§Œλ“€μ—ˆμŠ΅λ‹ˆκΉŒ?

칭찬을 μœ„ν•΄ λ‚šμ‹œν•˜λŠ” κ±°μ£ ? λ¬Όλ‘ μž…λ‹ˆλ‹€. Restic은 μ˜μ‹¬ ν•  여지없이 κ½€ 멋진 μ œν’ˆμž…λ‹ˆλ‹€. μ €λŠ” ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ μ•”ν˜Έν™”, KDF의 μ μ ˆν•œ μ‚¬μš©, ACL 지원, FUSEλ₯Ό ν†΅ν•œ λ°±μ—… 마운트λ₯Ό μ’‹μ•„ν•©λ‹ˆλ‹€. 그것은 λ¬Όμ—μ„œ 죽은 λ‚˜μ˜ 이전 rsync μ ‘κ·Ό 방식을 λŠ₯κ°€ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μžμ›μ— λŒ€ν•œ 배고픔을 쑰금 λœμ–΄ 쀄 수 μžˆμ„κΉŒμš”? :-)

prune bug

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이봐 μ•Œλ ‰μ‚°λ”, 여기에 μΆ”κ°€ ν•  기술이 μ—†μ§€λ§Œ λ§ˆμ§€λ§‰ μ½”λ©˜νŠΈ ν›„μ—λŠ” λ‹€μŒκ³Ό 같이 말할 ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. 응닡이 맀우 λΉ λ¦…λ‹ˆλ‹€. 이전에 μ—¬κΈ°μ—μ„œ κ°€μ§œ 버그λ₯Όλ³΄κ³ ν–ˆλŠ”데 (예λ₯Ό λ“€μ–΄ HW λ¬Έμ œμ— 뿌리λ₯Όλ‘κ³ μžˆλŠ” κ²ƒμœΌλ‘œ 판λͺ… 됨) 당신은 항상 맀우 지원해 μ™”μŠ΅λ‹ˆλ‹€. λͺ¨λ“  μ˜€ν”ˆ μ†ŒμŠ€ ν”„λ‘œμ νŠΈλŠ” 당신을 ν›„μ›μžλ‘œ μ‚ΌλŠ” 것이 ν–‰μš΄μ΄λΌκ³  생각할 수 있으며, 당신이 νœ΄μ‹μ„ μœ„ν•΄ κ·Έ μ΄μƒμœΌλ‘œ λ‚˜μ•„κ°€κ³  μžˆμŒμ„ λΆ„λͺ…νžˆ λ³΄μ—¬μ€λ‹ˆλ‹€. 그것은 λ†€λΌμš΄ 도ꡬ이며 우리 λͺ¨λ‘λŠ” 그것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. μ–΄μ œ 기뢄이 쒋지 μ•Šλ‹€κ³  λ§ν–ˆμ„ λ•Œ λ―Ώκ³  μžˆμ§€λ§Œ λ°œμ–Έμ—λŠ” ν™•μ‹€νžˆ λ‚˜νƒ€λ‚˜μ§€ μ•Šμ•˜μœΌλ‹ˆ μ•ˆμ‹¬ν•˜μ„Έμš”. κ³„μ†ν•΄μ„œ 멋진 μž‘μ—…μ„ν•˜κ³  Restic을 λŠμž„μ—†μ΄ κ°œμ„  ν•΄μ£Όμ…”μ„œ λ‹€μ‹œ ν•œ 번 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 건배, μš”ν•˜λ„€μŠ€

λͺ¨λ“  31 λŒ“κΈ€

μ—­ 좔적을 보면 핡심 λ¬Έμ œλŠ” κ³  루틴 1에 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

https://github.com/restic/restic/blob/6a34e0d10fb978cb8988a460bf4b04e9976cca17/internal/repository/repack.go#L60

이것은 μ§ˆλ¬Έμ„ μ œκΈ°ν•©λ‹ˆλ‹€ : μš°λ¦¬κ°€ 더 효율적으둜 재 포μž₯ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? 예λ₯Ό λ“€μ–΄, 순차적 λŒ€λŸ‰ μž‘μ—…μ—μ„œ blobμ„λ‘œλ“œν•˜κ±°λ‚˜ 기둝 쀑 볡사λ₯Ό μ‚¬μš©ν•˜μ—¬ blob의 데이터λ₯Ό μœ μ§€ν•˜λ €λ©΄ λ‚˜λ³΄λ‹€ 더 λ§Žμ€ μ•„ν‚€ν…μ²˜ 지식을 가진 μ‚¬λžŒμ΄ ν•„μš”ν•©λ‹ˆλ‹€.

예, 가지 μΉ˜κΈ°μ—λŠ” λ„ˆλ¬΄ λ§Žμ€ λ©”λͺ¨λ¦¬κ°€ ν•„μš”ν•˜λ©° 훨씬 더 효율적일 수 μžˆμŠ΅λ‹ˆλ‹€. μ΅œμ ν™” ν•  μ‹œκ°„μ΄ ν•„μš”ν•©λ‹ˆλ‹€. μ‹ κ³  ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

이것을 κ³΅μœ ν•˜κΈ°μ— κ°€μž₯ 쒋은 μž₯μ†ŒλŠ” ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 여기에 μΆ”κ°€ ν•  데이터 ν¬μΈνŠΈκ°€ ν•˜λ‚˜ 더 μžˆμŠ΅λ‹ˆλ‹€. μ–΄μ œ λ°€ OOM 였λ₯˜κ°€ λ°œμƒν•œ ν›„ restic을 λ‹€μ‹œ λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€. μ„œλ²„μ—μ„œ λ°±μ—…ν•˜λŠ” λ™μ•ˆ μ•½ 25GB의 RAM을 μ‚¬μš©ν•˜λŠ” μœ„μΉ˜μ— λ„λ‹¬ν–ˆμŠ΅λ‹ˆλ‹€.

Aug 21 03:24:35 courtlistener kernel: [3131661.383314] Out of memory: Kill process 28903 (restic) score 359 or sacrifice child
Aug 21 03:24:35 courtlistener kernel: [3131661.384564] Killed process 28903 (restic) total-vm:25856956kB, anon-rss:24415312kB, file-rss:0kB
Aug 21 03:24:35 courtlistener kernel: [3131661.400102] postgres invoked oom-killer: gfp_mask=0x2000d0, order=2, oom_score_adj=0

μ•½ 20GB의 RAM을 μ‚¬μš©ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€κ°€μžˆλŠ” μ„œλ²„μ—μ„œλŠ” νœ΄μ‹κ³Ό 같은 μž‘μ—…μ„ μœ„ν•΄ μœ μ§€ν•˜λŠ” μ˜€λ²„ ν—€λ“œκ°€ μžˆμ§€λ§Œ 백업을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 30GB μ΄μƒμ˜ RAM (λ˜λŠ” κ·Έ 이상?)을 무료둜 μœ μ§€ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” μ—¬μ „νžˆ DB의 슀트리밍 백업을 μœ„ν•΄ restic을 μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ, 이것은 λ„ˆλ¬΄ λ§Žμ€ λ©”λͺ¨λ¦¬μž…λ‹ˆλ‹€.

음, λ°±μ—… 쀑이 μ—ˆλ‚˜μš”? μ•„λ‹ˆλ©΄ 가지 치기?

λ°±μ—… 쀑. μžλ‘κ°€ λΉ„ν™œμ„±ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€. prune이 μ—†λ‹€λŠ” 것은 Backblazeκ°€ 더 λ§Žμ€ λΉ„μš©μ„ μ²­κ΅¬ν•œλ‹€λŠ” 것을 μ˜λ―Έν•˜λ―€λ‘œ μ„±λŠ₯ / λ©”λͺ¨λ¦¬ λ¬Έμ œκ°€ ν•΄κ²° 될 λ•ŒκΉŒμ§€ λΉ„ν™œμ„±ν™”ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 이제 백업도 λΉ„ν™œμ„±ν™”ν•΄μ•Όν–ˆμŠ΅λ‹ˆλ‹€.

ν•œμˆ¨, μ£„μ†‘ν•©λ‹ˆλ‹€.

κΈ€μŽ„, 그것이 λ¬΄μ—‡μž…λ‹ˆκΉŒ! μš°λ¦¬λŠ” μŠ€μΌ€μΌλ§μ΄ 쉽지 μ•Šκ³  λ•Œλ•Œλ‘œ 일을 μΆ”μ§„ν•œλ‹€λŠ” 것을 λˆ„κ΅¬λ‚˜ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 일반적으둜 κ·Έλž˜λ„ μ—¬μ „νžˆ restic을 μ’‹μ•„ν•©λ‹ˆλ‹€. 슀트리밍 λ°±μ—…? 음. 손가락에 ν‚€μŠ€ . λ§›μžˆλŠ”.

@mlissner μ €μž₯μ†Œ ν¬κΈ°λŠ” μ–Όλ§ˆμž…λ‹ˆκΉŒ?

μ–΄μ œλŠ” 기뢄이 쒋지 μ•Šμ•˜μ§€λ§Œ μ˜€λŠ˜μ€ 훨씬 λ‚˜μ•„μ‘ŒμŠ΅λ‹ˆλ‹€ :)

이봐 μ•Œλ ‰μ‚°λ”, 여기에 μΆ”κ°€ ν•  기술이 μ—†μ§€λ§Œ λ§ˆμ§€λ§‰ μ½”λ©˜νŠΈ ν›„μ—λŠ” λ‹€μŒκ³Ό 같이 말할 ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. 응닡이 맀우 λΉ λ¦…λ‹ˆλ‹€. 이전에 μ—¬κΈ°μ—μ„œ κ°€μ§œ 버그λ₯Όλ³΄κ³ ν–ˆλŠ”데 (예λ₯Ό λ“€μ–΄ HW λ¬Έμ œμ— 뿌리λ₯Όλ‘κ³ μžˆλŠ” κ²ƒμœΌλ‘œ 판λͺ… 됨) 당신은 항상 맀우 지원해 μ™”μŠ΅λ‹ˆλ‹€. λͺ¨λ“  μ˜€ν”ˆ μ†ŒμŠ€ ν”„λ‘œμ νŠΈλŠ” 당신을 ν›„μ›μžλ‘œ μ‚ΌλŠ” 것이 ν–‰μš΄μ΄λΌκ³  생각할 수 있으며, 당신이 νœ΄μ‹μ„ μœ„ν•΄ κ·Έ μ΄μƒμœΌλ‘œ λ‚˜μ•„κ°€κ³  μžˆμŒμ„ λΆ„λͺ…νžˆ λ³΄μ—¬μ€λ‹ˆλ‹€. 그것은 λ†€λΌμš΄ 도ꡬ이며 우리 λͺ¨λ‘λŠ” 그것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. μ–΄μ œ 기뢄이 쒋지 μ•Šλ‹€κ³  λ§ν–ˆμ„ λ•Œ λ―Ώκ³  μžˆμ§€λ§Œ λ°œμ–Έμ—λŠ” ν™•μ‹€νžˆ λ‚˜νƒ€λ‚˜μ§€ μ•Šμ•˜μœΌλ‹ˆ μ•ˆμ‹¬ν•˜μ„Έμš”. κ³„μ†ν•΄μ„œ 멋진 μž‘μ—…μ„ν•˜κ³  Restic을 λŠμž„μ—†μ΄ κ°œμ„  ν•΄μ£Όμ…”μ„œ λ‹€μ‹œ ν•œ 번 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 건배, μš”ν•˜λ„€μŠ€

restic check와 ν•¨κ»˜ # 1830μ—μ„œμ™€ λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
GOGC = 20을 μ„€μ •ν•˜λ €κ³ ν–ˆμ§€λ§Œ 운이 μ—†μŠ΅λ‹ˆλ‹€. restic checkλŠ” μž μ‹œ μ‹€ν–‰ ν•œ 후에도 μ—¬μ „νžˆ oom-killedμž…λ‹ˆλ‹€ (8GB ram, ~ 1,5TB repo).

/ tmp / restic-check-cache-961467159μ—μ„œ μž„μ‹œ μΊμ‹œ μ‚¬μš©
02a14a0b μ €μž₯μ†Œκ°€ μ„±κ³΅μ μœΌλ‘œ μ—΄λ ΈμŠ΅λ‹ˆλ‹€. λΉ„λ°€λ²ˆν˜Έκ°€ μ •ν™•ν•©λ‹ˆλ‹€.
μ €μž₯μ†Œμ— λŒ€ν•œ 독점 잠금 생성
λ‘œλ“œ 인덱슀
λͺ¨λ“  팩 확인
μŠ€λƒ… μƒ·, 트리 및 Blob 확인
μ‚΄ν•΄

κ³Ό
처치 κ³Όμ • 16,350 (restic) 총-VM : 2428260kB, anon- RSS : 2375472kB 파일 - RSS : 0KB , shmem- RSS : 0KB

@mlissner μ €μž₯μ†Œ ν¬κΈ°λŠ” μ–Όλ§ˆμž…λ‹ˆκΉŒ?

μ£„μ†‘ν•©λ‹ˆλ‹€.이 λ¬Έλ§₯μ—μ„œ "μ €μž₯μ†Œ"κ°€ 무엇을 μ˜λ―Έν•˜λŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.ν•˜μ§€λ§Œ μš°λ¦¬κ°€ λ°± λΈ”λ ˆμ΄μ¦ˆμ—μžˆλŠ” 물건의 양을 μ˜λ―Έν•˜λŠ” 것 κ°™λ‚˜μš”? λ§žλ‹€λ©΄ 버킷 ν¬κΈ°λŠ” μ•½ 5.2TBμž…λ‹ˆλ‹€.

λ°±μ—…ν•˜λŠ” 양이 μ–Όλ§ˆλ‚˜λ˜λŠ”μ§€ μ˜λ―Έν•œλ‹€λ©΄ 파일이 15M 정도 인 2TB μ •λ„μž…λ‹ˆκΉŒ? μ΄κ²ƒμ˜ λŒ€λΆ€λΆ„μ€ κ²°μ½” λ³€ν•˜μ§€ μ•Šμ§€λ§Œ μš°λ¦¬λŠ” 맀일 더 많이 μ–»μŠ΅λ‹ˆλ‹€. 법λ₯  λ¬Έμ„œ μ•„μΉ΄μ΄λΈŒ 인 CourtListener.com을 μš΄μ˜ν•©λ‹ˆλ‹€.

@ johndoe31415 μΉœμ ˆν•œ 말 κ°μ‚¬ν•©λ‹ˆλ‹€! λ•Œλ‘œλŠ” μ—¬μ „νžˆν•΄μ•Ό ν•  일의 양이 압도적 일 수 μžˆμŠ΅λ‹ˆλ‹€ ...

같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€ (8GB RAM, repoλŠ” 267GB)

$ restic version
restic 0.9.3 compiled with go1.10.4 on linux/amd64

λͺ…λ Ή : restic -r sftp:[email protected]:/mybackup --password-file mypassword --cache-dir /var/cache/restic forget --prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 --keep-yearly=1

1 snapshots have been removed, running prune
counting files in repo
building new index for repo
[1:14:56] 100.00%  56025 / 56025 packs

repository contains 56025 packs (4844700 blobs) with 257.876 GiB
processed 4844700 blobs: 0 duplicate blobs, 0B duplicate
load all snapshots
find data that is still in use for 44 snapshots
fatal error: runtime: out of memory

runtime stack:
runtime.throw(0xb92259, 0x16)
        /usr/lib/go-1.10/src/runtime/panic.go:616 +0x81
runtime.sysMap(0xc50f780000, 0x12980000, 0xf6ce00, 0xf85fd8)
        /usr/lib/go-1.10/src/runtime/mem_linux.go:216 +0x20a
runtime.(*mheap).sysAlloc(0xf6c6e0, 0x12980000, 0x7f7d482609c8)
        /usr/lib/go-1.10/src/runtime/malloc.go:470 +0xd4
runtime.(*mheap).grow(0xf6c6e0, 0x94c0, 0x0)
        /usr/lib/go-1.10/src/runtime/mheap.go:907 +0x60
runtime.(*mheap).allocSpanLocked(0xf6c6e0, 0x94c0, 0xf85fe8, 0x7f7d6bffed88)
        /usr/lib/go-1.10/src/runtime/mheap.go:820 +0x301
runtime.(*mheap).alloc_m(0xf6c6e0, 0x94c0, 0x410101, 0xc41a96e1ff)
        /usr/lib/go-1.10/src/runtime/mheap.go:686 +0x118
runtime.(*mheap).alloc.func1()
        /usr/lib/go-1.10/src/runtime/mheap.go:753 +0x4d
runtime.(*mheap).alloc(0xf6c6e0, 0x94c0, 0x7f7d6b010101, 0x415afc)
        /usr/lib/go-1.10/src/runtime/mheap.go:752 +0x8a
runtime.largeAlloc(0x12980000, 0x450101, 0x7f7d79aded90)
        /usr/lib/go-1.10/src/runtime/malloc.go:826 +0x94
runtime.mallocgc.func1()
        /usr/lib/go-1.10/src/runtime/malloc.go:721 +0x46
runtime.systemstack(0xc400000000)
        /usr/lib/go-1.10/src/runtime/asm_amd64.s:409 +0x79
runtime.mstart()
        /usr/lib/go-1.10/src/runtime/proc.go:1175

goroutine 1 [running]:
runtime.systemstack_switch()
        /usr/lib/go-1.10/src/runtime/asm_amd64.s:363 fp=0xc4d2cc6b88 sp=0xc4d2cc6b80 pc=0x4552d0
runtime.mallocgc(0x12980000, 0xaffe40, 0xbb6b01, 0xaed4a0)
        /usr/lib/go-1.10/src/runtime/malloc.go:720 +0x8a2 fp=0xc4d2cc6c28 sp=0xc4d2cc6b88 pc=0x4120d2
runtime.newarray(0xaffe40, 0x110000, 0xc42013c000)
        /usr/lib/go-1.10/src/runtime/malloc.go:855 +0x6a fp=0xc4d2cc6c58 sp=0xc4d2cc6c28 pc=0x41245a
runtime.makeBucketArray(0xb32640, 0x42f5cad737fd4814, 0xc4d2cc6cd0, 0x401e32)
        /usr/lib/go-1.10/src/runtime/hashmap.go:881 +0xe2 fp=0xc4d2cc6c90 sp=0xc4d2cc6c58 pc=0x40a6b2
runtime.hashGrow(0xb32640, 0xc44ee1c960)
        /usr/lib/go-1.10/src/runtime/hashmap.go:905 +0x80 fp=0xc4d2cc6ce0 sp=0xc4d2cc6c90 pc=0x40a830
runtime.mapassign(0xb32640, 0xc44ee1c960, 0xc4d2cc6f9f, 0xc4cd1f7d40)
        /usr/lib/go-1.10/src/runtime/hashmap.go:579 +0x2b7 fp=0xc4d2cc6d70 sp=0xc4d2cc6ce0 pc=0x409777
github.com/restic/restic/internal/restic.BlobSet.Insert(...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/blob_set.go:26
github.com/restic/restic/internal/restic.FindUsedBlobs(0xc15640, 0xc42020e9c0, 0xc1d760, 0xc42021fa40, 0x467d86ab22e4ce70, 0x21a44382a1438885, 0x829c686ff3f4eb07, 0x2bbf9f1c26cb983a,
0xc44ee1c960, 0xc44ee1c990, ...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/find.go:9 +0x10c fp=0xc4d2cc6fe8 sp=0xc4d2cc6d70 pc=0x6f9ecc
github.com/restic/restic/internal/restic.FindUsedBlobs(0xc15640, 0xc42020e9c0, 0xc1d760, 0xc42021fa40, 0xad0966088f423528, 0xc0855b2604177a2c, 0x416e998bdcc27c99, 0xd45bd561fbc152b3,
0xc44ee1c960, 0xc44ee1c990, ...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/find.go:31 +0x5a6 fp=0xc4d2cc7260 sp=0xc4d2cc6fe8 pc=0x6fa366
github.com/restic/restic/internal/restic.FindUsedBlobs(0xc15640, 0xc42020e9c0, 0xc1d760, 0xc42021fa40, 0x7ed337032395c12e, 0x697a1ab6f4be111b, 0x77f9fa7adfc1bd09, 0x1821c35434fcefb9,
0xc44ee1c960, 0xc44ee1c990, ...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/find.go:31 +0x5a6 fp=0xc4d2cc74d8 sp=0xc4d2cc7260 pc=0x6fa366
github.com/restic/restic/internal/restic.FindUsedBlobs(0xc15640, 0xc42020e9c0, 0xc1d760, 0xc42021fa40, 0x4edfb5f894134ac9, 0xf0bba160fd7f8f19, 0xe83800bc1f59b772, 0xc1b5cb4b8c32a833,
0xc44ee1c960, 0xc44ee1c990, ...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/find.go:31 +0x5a6 fp=0xc4d2cc7750 sp=0xc4d2cc74d8 pc=0x6fa366
github.com/restic/restic/internal/restic.FindUsedBlobs(0xc15640, 0xc42020e9c0, 0xc1d760, 0xc42021fa40, 0x5efbd8585a9898d2, 0x448917a1ace19706, 0x8ee237ec0622eb45, 0xc9d306cd39e8d05d,
0xc44ee1c960, 0xc44ee1c990, ...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/find.go:31 +0x5a6 fp=0xc4d2cc79c8 sp=0xc4d2cc7750 pc=0x6fa366
github.com/restic/restic/internal/restic.FindUsedBlobs(0xc15640, 0xc42020e9c0, 0xc1d760, 0xc42021fa40, 0x260fdd5acba993c3, 0x3ed04f4eeab05c9f, 0xe5ef8da60b35f98, 0xd090ad85e968ef5f,
0xc44ee1c960, 0xc44ee1c990, ...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/find.go:31 +0x5a6 fp=0xc4d2cc7c40 sp=0xc4d2cc79c8 pc=0x6fa366
github.com/restic/restic/internal/restic.FindUsedBlobs(0xc15640, 0xc42020e9c0, 0xc1d760, 0xc42021fa40, 0x60f7906c006bf615, 0x1bd2d33fc9768849, 0xee593a9983a1f5bf, 0x9ab809619e8cc152,
0xc44ee1c960, 0xc44ee1c990, ...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/find.go:31 +0x5a6 fp=0xc4d2cc7eb8 sp=0xc4d2cc7c40 pc=0x6fa366
github.com/restic/restic/internal/restic.FindUsedBlobs(0xc15640, 0xc42020e9c0, 0xc1d760, 0xc42021fa40, 0x8f00b9047475f470, 0x2094345d9e4dbb28, 0x3905971b8623f05c, 0x14b3bcdc097489ee,
0xc44ee1c960, 0xc44ee1c990, ...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/find.go:31 +0x5a6 fp=0xc4d2cc8130 sp=0xc4d2cc7eb8 pc=0x6fa366
main.pruneRepository(0x7ffc3e67bcea, 0x39, 0x7ffc3e67bd34, 0x58, 0x0, 0x0, 0x0, 0x7ffc3e67bd99, 0x11, 0x0, ...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/cmd/restic/cmd_prune.go:191 +0xea3 fp=0xc4d2cc9060 sp=0xc4d2cc8130 pc=0x9d23e3
main.runForget(0x0, 0x0, 0x7, 0x4, 0x6, 0x1, 0x0, 0x0, 0x0, 0x0, ...)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/cmd/restic/cmd_forget.go:241 +0xece fp=0xc4d2cc9970 sp=0xc4d2cc9060 pc=0x9ca82e
main.glob..func10(0xf59720, 0xc420276160, 0x0, 0xb, 0x0, 0x0)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/cmd/restic/cmd_forget.go:24 +0xb5 fp=0xc4d2cc9b60 sp=0xc4d2cc9970 pc=0x9e4935
github.com/spf13/cobra.(*Command).execute(0xf59720, 0xc420282180, 0xb, 0xc, 0xf59720, 0xc420282180)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/spf13/cobra/command.go:762 +0x468 fp=0xc4d2cc9c50 sp=0xc4d2cc9b60 pc=0x6bae28
github.com/spf13/cobra.(*Command).ExecuteC(0xf59980, 0xffffffffffffffff, 0x0, 0x19)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/spf13/cobra/command.go:852 +0x30a fp=0xc4d2cc9d90 sp=0xc4d2cc9c50 pc=0x6bb83a
github.com/spf13/cobra.(*Command).Execute(0xf59980, 0x23, 0xc4201cfeb8)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/spf13/cobra/command.go:800 +0x2b fp=0xc4d2cc9dc0 sp=0xc4d2cc9d90 pc=0x6bb50b
main.main()
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/cmd/restic/main.go:86 +0x1d6 fp=0xc4d2cc9f88 sp=0xc4d2cc9dc0 pc=0x9e3ac6
runtime.main()
        /usr/lib/go-1.10/src/runtime/proc.go:198 +0x212 fp=0xc4d2cc9fe0 sp=0xc4d2cc9f88 pc=0x42ccc2
runtime.goexit()
        /usr/lib/go-1.10/src/runtime/asm_amd64.s:2361 +0x1 fp=0xc4d2cc9fe8 sp=0xc4d2cc9fe0 pc=0x457e61

goroutine 5 [syscall, 92 minutes]:
os/signal.signal_recv(0x0)
        /usr/lib/go-1.10/src/runtime/sigqueue.go:139 +0xa6
os/signal.loop()
        /usr/lib/go-1.10/src/os/signal/signal_unix.go:22 +0x22
created by os/signal.init.0
        /usr/lib/go-1.10/src/os/signal/signal_unix.go:28 +0x41

goroutine 6 [chan receive, 92 minutes]:
github.com/restic/restic/internal/restic.init.0.func1.1()
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/lock.go:257 +0xef
created by github.com/restic/restic/internal/restic.init.0.func1
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/lock.go:254 +0x35

goroutine 7 [select, 92 minutes, locked to thread]:
runtime.gopark(0xbb6a48, 0x0, 0xb84e9f, 0x6, 0x18, 0x1)
        /usr/lib/go-1.10/src/runtime/proc.go:291 +0x11a
runtime.selectgo(0xc42003ef50, 0xc420086240)
        /usr/lib/go-1.10/src/runtime/select.go:392 +0xe50
runtime.ensureSigM.func1()
        /usr/lib/go-1.10/src/runtime/signal_unix.go:549 +0x1f4
runtime.goexit()
        /usr/lib/go-1.10/src/runtime/asm_amd64.s:2361 +0x1

goroutine 8 [chan receive, 92 minutes]:
github.com/restic/restic/internal/restic.init.2.func1(0xc420086180)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/progress_unix.go:17 +0xa3
created by github.com/restic/restic/internal/restic.init.2
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/progress_unix.go:16 +0xab

goroutine 10 [IO wait, 2 minutes]:
internal/poll.runtime_pollWait(0x7f7d7829fbc0, 0x72, 0xc42004abe0)
        /usr/lib/go-1.10/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc4202146a8, 0x72, 0xffffffffffffff01, 0xc0ef60, 0xf14738)
        /usr/lib/go-1.10/src/internal/poll/fd_poll_runtime.go:85 +0x9b
internal/poll.(*pollDesc).waitRead(0xc4202146a8, 0xc4b4f12001, 0x4, 0x4)
        /usr/lib/go-1.10/src/internal/poll/fd_poll_runtime.go:90 +0x3d
internal/poll.(*FD).Read(0xc420214690, 0xc4b4f120c4, 0x4, 0x4, 0x0, 0x0, 0x0)
        /usr/lib/go-1.10/src/internal/poll/fd_unix.go:157 +0x17d
os.(*File).read(0xc42020a140, 0xc4b4f120c4, 0x4, 0x4, 0x18, 0x0, 0x0)
        /usr/lib/go-1.10/src/os/file_unix.go:226 +0x4e
os.(*File).Read(0xc42020a140, 0xc4b4f120c4, 0x4, 0x4, 0x18, 0x0, 0x0)
        /usr/lib/go-1.10/src/os/file.go:107 +0x6a
io.ReadAtLeast(0xc0d480, 0xc420144ae0, 0xc4b4f120c4, 0x4, 0x4, 0x4, 0xa6e780, 0xc42013a301, 0xc4b4f120c4)
        /usr/lib/go-1.10/src/io/io.go:309 +0x86
io.ReadFull(0xc0d480, 0xc420144ae0, 0xc4b4f120c4, 0x4, 0x4, 0xc42004aea8, 0x4056e7, 0xc42d7cc420)
        /usr/lib/go-1.10/src/io/io.go:327 +0x58
github.com/pkg/sftp.recvPacket(0xc0d480, 0xc420144ae0, 0x4051c5, 0xc42d7cc420, 0xc42004af70, 0x1, 0x985f32, 0xc445504001)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/pkg/sftp/packet.go:143 +0x86
github.com/pkg/sftp.(*conn).recvPacket(0xc420144ae0, 0xc42004af70, 0xc4000378eb, 0xc445504108, 0x1, 0x0, 0x0)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/pkg/sftp/conn.go:22 +0x37
github.com/pkg/sftp.(*clientConn).recv(0xc420144ae0, 0x0, 0x0)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/pkg/sftp/conn.go:64 +0xe5
github.com/pkg/sftp.(*clientConn).loop(0xc420144ae0)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/pkg/sftp/conn.go:49 +0x5b
created by github.com/pkg/sftp.NewClientPipe
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/pkg/sftp/client.go:128 +0x1c3

goroutine 18 [chan receive, 92 minutes]:
main.CleanupHandler(0xc4201fa060)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/cmd/restic/cleanup.go:62 +0x5d
created by main.init.0
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/cmd/restic/cleanup.go:24 +0x6d

goroutine 19 [IO wait, 92 minutes]:
internal/poll.runtime_pollWait(0x7f7d7829ff00, 0x72, 0xc420038c70)
        /usr/lib/go-1.10/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc420214568, 0x72, 0xffffffffffffff01, 0xc0ef60, 0xf14738)
        /usr/lib/go-1.10/src/internal/poll/fd_poll_runtime.go:85 +0x9b
internal/poll.(*pollDesc).waitRead(0xc420214568, 0xc4202b8001, 0x1000, 0x1000)
        /usr/lib/go-1.10/src/internal/poll/fd_poll_runtime.go:90 +0x3d
internal/poll.(*FD).Read(0xc420214550, 0xc4202b8000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/lib/go-1.10/src/internal/poll/fd_unix.go:157 +0x17d
os.(*File).read(0xc42020a120, 0xc4202b8000, 0x1000, 0x1000, 0x0, 0x0, 0xc420038d78)
        /usr/lib/go-1.10/src/os/file_unix.go:226 +0x4e
os.(*File).Read(0xc42020a120, 0xc4202b8000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0)
        /usr/lib/go-1.10/src/os/file.go:107 +0x6a
bufio.(*Scanner).Scan(0xc420038f30, 0xc115a0)
        /usr/lib/go-1.10/src/bufio/scan.go:208 +0xbf
github.com/restic/restic/internal/backend/sftp.startClient.func1(0xc115a0, 0xc42020a120, 0xb827c8, 0x3)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/backend/sftp/sftp.go:53 +0x1e6
created by github.com/restic/restic/internal/backend/sftp.startClient
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/backend/sftp/sftp.go:51 +0x1b9

goroutine 20 [syscall, 92 minutes]:
syscall.Syscall6(0xf7, 0x1, 0x2035, 0xc420039598, 0x1000004, 0x0, 0x0, 0x0, 0x0, 0x0)
        /usr/lib/go-1.10/src/syscall/asm_linux_amd64.s:44 +0x5
os.(*Process).blockUntilWaitable(0xc4202326c0, 0x0, 0x0, 0x0)
        /usr/lib/go-1.10/src/os/wait_waitid.go:31 +0x98
os.(*Process).wait(0xc4202326c0, 0x0, 0x0, 0x0)
        /usr/lib/go-1.10/src/os/exec_unix.go:22 +0x3c
os.(*Process).Wait(0xc4202326c0, 0x0, 0x0, 0x0)
        /usr/lib/go-1.10/src/os/exec.go:123 +0x2b
os/exec.(*Cmd).Wait(0xc420238580, 0x0, 0x0)
        /usr/lib/go-1.10/src/os/exec/exec.go:461 +0x5c
github.com/restic/restic/internal/backend/sftp.startClient.func2(0xc420238580, 0xc420144a80)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/backend/sftp/sftp.go:76 +0x2f
created by github.com/restic/restic/internal/backend/sftp.startClient
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/backend/sftp/sftp.go:75 +0x29e

goroutine 34 [select, 2 minutes]:
main.refreshLocks(0xf65c00, 0xc420136060)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/cmd/restic/lock.go:72 +0x221
created by main.lockRepository
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/cmd/restic/lock.go:49 +0x373

goroutine 98 [select, 15 minutes]:
github.com/restic/restic/internal/restic.(*Progress).reporter(0xc44ee282c0)
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/progress.go:169 +0x130
created by github.com/restic/restic/internal/restic.(*Progress).Start
        /build/restic-XDCNVl/restic-0.9.3+ds/obj-x86_64-linux-gnu/src/github.com/restic/restic/internal/restic/progress.go:96 +0x132

영ꡬ적 인 μ†”λ£¨μ…˜μ€ μ•„λ‹ˆμ§€λ§Œ, restic이 "νœ΄λŒ€ μ„±"μ΄μ–΄μ„œ λ‚΄κ°€ ν•œ 일은 λ‹¨μˆœνžˆ 퍼블릭 ν΄λΌμš°λ“œμ—μ„œ VM을 μŠ€ν•€ μ—…ν•˜λŠ” 것이 μ—ˆμŠ΅λ‹ˆλ‹€. vCPU와 RAM을 많이 μ œκ³΅ν•˜κ³  (16 코어와 64GB RAM 등을 μ‚¬μš©ν–ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€) κ±°κΈ°μ—μ„œ νœ΄μ‹μ„ μ·¨ν–ˆμŠ΅λ‹ˆλ‹€.

그것은 λͺ‡ μ‹œκ°„ λ™μ•ˆ μ‹€ν–‰λ˜μ—ˆκ³  λͺ‡ λ‹¬λŸ¬μ˜ λΉ„μš©μ΄ λ“€μ—ˆμ§€λ§Œ 적어도 λλ‚¬μŠ΅λ‹ˆλ‹€.

였래된 것을 정리 ν•œ ν›„ 이제 일반 μ„œλ²„μ—μ„œ forget --prune을 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ¬Όλ‘  퍼블릭 ν΄λΌμš°λ“œμ—μ„œ λ°±μ—… μ„œλ²„λ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

λ¬Όλ‘  퍼블릭 ν΄λΌμš°λ“œμ—μ„œ λ°±μ—… μ„œλ²„λ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

(Un) μ•ˆνƒ€κΉκ²Œλ„ .. μ–΄μ¨Œλ“  κ³ λ§ˆμ›Œμš”!

μ•ˆλ…•ν•˜μ„Έμš”

μ„œλ²„μ— λ©”λͺ¨λ¦¬κ°€ μΆ©λΆ„ν•˜λ”λΌλ„ λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. μ•½ 150Tλ₯Ό λ°±μ—…ν•˜κ³  λͺ‡ 개의 μŠ€λƒ… 샷을 μ œκ±°ν•˜λ €κ³ ν•©λ‹ˆλ‹€. 였λ₯˜ 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯ μ€ 첨뢀 된 슀크린 샷에 ν‘œμ‹œλ©λ‹ˆλ‹€.

μ•ˆμ •λœ μ‹€ν–‰ 0.9.3.
prune_outofmemory.txt

screenshot from 2019-01-20 11-24-52
screenshot from 2019-01-20 11-24-23

λ‚˜λŠ” 이것을 μ‹€ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

restic 0.9.4 (1107eef2) compiled with go1.10.4 on linux/arm

512MB RAM λ§ŒμžˆλŠ” ReadyNAS Duo v1 B2에 μ €μž₯된 총 130190 개의 파일이 689.646GiB (Restic 좜λ ₯에 따라)에 μžˆμŠ΅λ‹ˆλ‹€.

가지 μΉ˜κΈ°λŠ” μ‹œκ°„ (~ 32 μ‹œκ°„)이 걸리지 만 λ¬Έμ œμ—†μ΄ μ™„λ£Œλ©λ‹ˆλ‹€.
λ‚΄κ°€ ν•œ ν•œ κ°€μ§€λŠ” λ‹€μŒκ³Ό 같이 μ„€μ •ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

$ export GOGC=33
$ restic --option b2.connections=3 <other options here are omitted>

λ‚΄ Repoκ°€ ν΄λΌμš°λ“œμ— μžˆμœΌλ―€λ‘œ λͺ¨λ“  섀정에 λ¬Έμ œκ°€μžˆλŠ” 것은 μ•„λ‹κΉŒμš”?

λ­”κ°€ μ•„μ£Ό μ΄μƒν•œ 일이 λ²Œμ–΄μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€ ... κ·Έλž˜λ„ 지적 ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. prune κ°€ λ„ˆλ¬΄ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ, 이것이 μ–΄λ””μ—μ„œ μΌμ–΄λ‚˜λŠ”μ§€ μ™„μ „νžˆ μ–΄λ‘‘μŠ΅λ‹ˆλ‹€ ...

λˆ„κ΅°κ°€κ°€ restic을 ν”„λ‘œνŒŒμΌ λ§ν•˜κ³  μ €μž₯μ†Œμ—μ„œ 높은 λ©”λͺ¨λ¦¬ μ‚¬μš©μ˜ 원인을 μ‹λ³„ν•˜λŠ” 데 μ‹œκ°„μ„ 보내고 μ‹Άλ‹€λ©΄ 감사 ν•  것이며 μˆ˜μ • 속도λ₯Ό λ†’μ΄λŠ” 데 도움이 될 κ²ƒμž…λ‹ˆλ‹€.

μž¬λΆ€νŒ… 후에도 μ—¬μ „νžˆ 느리고 μ•½κ°„μ˜ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜μ—¬ 0.93으둜 정리할 수 μžˆμŠ΅λ‹ˆλ‹€.

screenshot from 2019-01-22 11-59-29

screenshot from 2019-01-22 11-59-14

λˆ„κ΅°κ°€ λ‚΄κ°€ν•΄μ•Ό ν•  일을 μ •ν™•νžˆ 말해 쀄 수 μžˆλ‹€λ©΄ ν”„λ‘œνŒŒμΌ 링과 ν…ŒμŠ€νŠΈλ₯Ό ν•  의ν–₯이 μžˆμŠ΅λ‹ˆλ‹€.
μ•½ 500GB의 데이터, 8GB RAMμ΄μžˆλŠ” VMμ—μ„œ λ°±μ—”λ“œλŠ” Amazon S3μž…λ‹ˆλ‹€.

@Olen 도와 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μœ μš©ν•œ κ²°κ³Όλ₯Ό μ–»μœΌλ €λ©΄ Go에 λŒ€ν•œ κ²½ν—˜μ΄ ν•„μš”ν•˜λ©° ν”„λ‘œμ„ΈμŠ€λŠ” 반볡적이고 λ‹€μ†Œ λ³΅μž‘ν•˜λ©° ν…μŠ€νŠΈλ‘œ μ„€λͺ…ν•˜κΈ°κ°€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€. μ•ˆνƒ€κΉκ²Œλ„ μš°λ¦¬λŠ” 큰 μ˜λ„μ—λ„ λΆˆκ΅¬ν•˜κ³  μ‚¬μš©μžλ‘œμ„œ λ§Žμ€ 도움이 될 μˆ˜μžˆλŠ” 단계에 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. :)

μ•Œμ•„λ‘λ©΄ ν₯미둜운 점은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. 정리 ν”„λ‘œμ„ΈμŠ€μ˜ μ–΄λŠ λ‹¨κ³„μ—μ„œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 손에 λ“€μ–΄μ˜€μ§€ μ•ŠλŠ”κ°€?

μ €μ—κ²ŒλŠ” restic check 이 prune. κ³Ό λ™μ‹œμ— 싀행될 λ•Œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

μ§€κΈˆκΉŒμ§€ prune 처럼 λ³΄μ΄μ§€λ§Œ λ©”λͺ¨λ¦¬ λ¬Έμ œμ—†μ΄ μ—¬μ „νžˆ μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€.

restic check λŠ” λͺ¨λ“  prune μž‘μ—… 전에 μ‹€ν–‰λ©λ‹ˆκΉŒ?
screenshot from 2019-01-23 18-16-13

κ·Έλ ‡λ‹€λ©΄ λͺ¨λ“  정리 μž‘μ—… 전에 restic 검사가 μ‹€ν–‰λ©λ‹ˆκΉŒ?

μ œλŒ€λ‘œ μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. restic check λ‹€μŒμ— restic prune μž…λ‹ˆκΉŒ?

prune λŠ” check 와 μœ μ‚¬ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ§€λ§Œ prune μ—λŠ” μ—¬λŸ¬ 단계 (인덱슀 λΉŒλ“œ, μ°Έμ‘° 된 데이터 μ°ΎκΈ°, 파일 λ‹€μ‹œ μ“°κΈ°, μ‚­μ œ, 인덱슀 λ‹€μ‹œ λΉŒλ“œ)κ°€ μžˆμ§€λ§Œ 두 가지 λ‹€λ₯Έ μž‘μ—…μ΄ μžˆμŠ΅λ‹ˆλ‹€

λͺ‡ 가지 λ‹€λ₯Έ μ„œλ²„μ—μ„œ ν™•μΈν•˜κ³  확인을 μ‹€ν–‰ν•˜λŠ” 것이 κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

restic check --no-lock
using temporary cache in /tmp/restic-check-cache-300914548
repository a63c6698 opened successfully, password is correct
created new cache in /tmp/restic-check-cache-300914548
load indexes
check all packs
check snapshots, trees and blobs
fatal error: runtime: out of memory

runtime stack:
runtime.throw(0xc0d786, 0x16)
    /usr/local/go/src/runtime/panic.go:608 +0x72
runtime.sysMap(0xc0f0000000, 0x4000000, 0x11e41d8)
    /usr/local/go/src/runtime/mem_linux.go:156 +0xc7
runtime.(*mheap).sysAlloc(0x11ca7a0, 0x4000000, 0x11ca7b8, 0x7ff95adeb1e0)
    /usr/local/go/src/runtime/malloc.go:619 +0x1c7
runtime.(*mheap).grow(0x11ca7a0, 0x1, 0x0)
    /usr/local/go/src/runtime/mheap.go:920 +0x42
runtime.(*mheap).allocSpanLocked(0x11ca7a0, 0x1, 0x11e41e8, 0x400)

etc etc

이것은 200GB μ €μž₯μ†Œ, 4GB RAM 및 ν˜„μž¬ 2.3GB μ—¬μœ  κ³΅κ°„μ΄μžˆλŠ” μ„œλ²„μ— μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ λ©”λͺ¨λ¦¬ λ¬Έμ œκ°€ λ°œμƒν–ˆμ§€λ§Œ check μžˆμŠ΅λ‹ˆλ‹€. μ²˜μŒμ—λŠ” λ¬Έμ œμ—†μ΄ prune λ₯Ό μ‹€ν–‰ν–ˆμ§€λ§Œ (130 개 μŠ€λƒ… μƒ·, 17 개 μŠ€λƒ… μƒ·κ³Ό 100GB둜 μΆ•μ†Œ 된 200GB λ¦¬ν¬μ§€ν† λ¦¬μ—μ„œ) 후속 κ²€μ‚¬μ—μ„œ λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν–ˆμŠ΅λ‹ˆλ‹€ (두 번 μ‹œλ„, λ™μΌν•œ κ²°κ³Ό).

using temporary cache in /data/backup/restic/restic-check-cache-567709739
created new cache in /data/backup/restic/restic-check-cache-567709739
create exclusive lock for repository
load indexes
check all packs
check snapshots, trees and blobs
fatal error: runtime: out of memory

그런 λ‹€μŒ 각 κ³  루틴에 λŒ€ν•œ μ—­ 좔적을 μΈμ‡„ν•©λ‹ˆλ‹€ (μ˜μ‹¬ ν•  μ •λ„λ‘œ 많게 λ³΄μ΄μ§€λ§Œ grep은 90 개λ₯Ό κ³„μ‚°ν•˜μ§€λ§Œ 일반적으둜 각 μ‹€μ œ μž‘μ—…μž μŠ€λ ˆλ“œμ™€ κ΄€λ ¨λœ κ³  루틴이 λͺ‡ 개 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€).

이것은 λ‹€μ†Œ 였래된 Atom μ‹œμŠ€ν…œμ— μžˆμŠ΅λ‹ˆλ‹€ (4GB RAM, μ•½ 2.5G 무료, μŠ€μ™‘μ€ λŒ€λΆ€λΆ„ 가득 μ°¬ 것 κ°™μŠ΅λ‹ˆλ‹€). Debian ν…ŒμŠ€νŠΈμ—μ„œ restic 버전 0.9.4 + ds-1을 μ‹€ν–‰ν•˜κ³ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

이것이 μ‹€μ œλ‘œ OP와 λ™μΌν•œ λ¬Έμ œμΈμ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 일뢀 정보λ₯Ό μΆ”κ°€ ν• λ§ŒνΌ μΆ©λΆ„νžˆ κ΄€λ ¨λ˜μ–΄μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

이것은 μ‹€μ œλ‘œ κ·€μ€‘ν•œ 데이터 ν¬μΈνŠΈμž…λ‹ˆλ‹€. 즉,이 문제λ₯Ό λ””λ²„κ·Έν•˜κΈ° 더 μ‰¬μš΄ 상황이 μžˆμŠ΅λ‹ˆλ‹€ ( check λŠ” 리포지토리λ₯Ό μˆ˜μ •ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€). 감사!

ν˜„μž¬ λ§ˆμŠ€ν„°μ—μ„œ 일반 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 이미 κ°μ†Œν–ˆμœΌλ©° 더 λ§Žμ€ μ΅œμ ν™”κ°€ 진행 μ€‘μž…λ‹ˆλ‹€.

μ£Όμš” 주제 : @ johndoe31415 ν˜„μž¬ λ§ˆμŠ€ν„°μ—μ„œ λ¬Έμ œκ°€ 아직 진행 쀑인지 확인해 μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

κ·Έλ ‡λ‹€λ©΄ 상황이 κ°œμ„ λ˜λ©΄ # 2718을 μ‹œλ„ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆκΉŒ?
그렇지 μ•Šλ‹€λ©΄ IMO이 λ¬Έμ œλŠ” μ’…κ²°λ˜μ–΄μ•Όν•©λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @aawsome- λΆˆν–‰νžˆλ„ λ‚˜λŠ” ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 이 였λ₯˜λ₯Ό μž¬ν˜„ν•˜λŠ” 데 μ›λž˜ μ‚¬μš©ν–ˆλ˜ μ»΄ν“¨ν„°λŠ” ν•œλ™μ•ˆ ν•΄μ²΄λ˜μ–΄ μ„€λͺ… 된 문제λ₯Ό μ „ν˜€ λ‚˜νƒ€λ‚΄μ§€ μ•ŠλŠ” ꡬ쑰가 λ‹€λ₯Έ μ €μž₯μ†Œλ₯Ό μ‚¬μš©ν•˜λŠ” λ‹€λ₯Έ μ»΄ν“¨ν„°λ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ£„μ†‘ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
4 / 5 - 1 λ“±κΈ‰