[Go] Concurrency: sync.Pool

sync.Pool์€ ๋™๊ธฐํ™” ํŒจํ‚ค์ง€์— ์žˆ์ง€๋งŒ, ์‹ค์งˆ์ ์ธ ์‚ฌ์šฉ์ฒ˜๋Š” ์‚ฌ์‹ค ๋™๊ธฐํ™”๋ณด๋‹จ GC ํŠœ๋‹์— ์žˆ๋‹ค.
sync ํŒจํ‚ค์ง€ ๊ธฐ๋Šฅ๋“ค์ด ๋Œ€๋ถ€๋ถ„ ๊ทธ๋ ‡์ง€๋งŒ, ๋ฉ€ํ‹ฐ ๊ณ ๋ฃจํ‹ด์—์„œ ์‚ฌ์šฉํ•ด๋„ thread-safeํ•œ ๊ธฐ๋Šฅ ๋‹จ์œ„๋‹ค.

๊ด€๋ จ ํฌ์ŠคํŠธ
https://blog.naver.com/sssang97/223232328524

Go์—์„œ ํ•ญ์ƒ ์ตœ์ ํ™”์˜ ์Ÿ์ ์ด ๋˜๋Š” ๊ฒƒ์ด GC๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์žฆ๊ณ  ๋ฌด๊ฑฐ์šด ํ• ๋‹น์€ ๋” ๋А๋ฆฐ GC์˜ ์›์ธ์ด ๋œ๋‹ค.
sync.Pool์€ ๋ฐ˜๋ณต์ ์ด๊ณ  ๋ฌด๊ฑฐ์šด ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ๋ฐ˜๋ณต๋  ๋•Œ, ํ• ๋‹น ์ตœ์†Œํ™”์— ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

๋Œ€๋žต์ ์ธ ์‚ฌ์šฉ๋ฒ•์€ ์ด๋ ‡๋‹ค.
ํ’€์—์„œ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•  New ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์ •์˜, ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์œ„์น˜์— ๋ณ€์ˆ˜๋กœ ๊น”์•„๋‘”๋‹ค.

Pool์—์„œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” Get ํ•จ์ˆ˜๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋•Œ ํ’€์— ๊ฐ€์šฉ ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด ์ •์˜ํ•œ New ํ•จ์ˆ˜๋กœ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์„œ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด๋ฅผ ๋‹ค ์ผ๋‹ค๋ฉด ๋‹ค์‹œ Pool์— ๋ฐ˜๋‚ฉํ•ด์ค€๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ์›๋ฆฌ๋Š” ์ด์ •๋„๋‹ค.
๊ทผ๋ฐ ์ด๊ฑธ ์“ฐ๋ฉด ๋Œ€์ฒด ๋ญ๊ฐ€ ์ข‹์€๊ฑธ๊นŒ?

์ด๊ฑด ์‚ฌ์‹ค ๊ฐ€๋ฒผ์šด ๋‹จ์ผ ํƒœ์Šคํฌ์˜ ์ž‘์—…์—์„œ๋Š” ํฐ ํšจ์šฉ์„ ๋ณด์ด์ง€๋Š” ๋ชปํ•œ๋‹ค.
์ด๊ฒŒ ์žฅ์ ์„ ๋“œ๋Ÿฌ๋‚ด๋Š” ํ™˜๊ฒฝ์€ ๊ณ ๋ฃจํ‹ด์ด ๋™์‹œ์— ๋Œ๋ฉด์„œ ๊ฐ™์€ pool์—์„œ ๋น„์Šทํ•œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์“ธ๋•Œ๋‹ค.
์ฝ”๋“œ๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด ์ด๋Ÿฐ ๋А๋‚Œ์ด๋‹ค.

์œ„์™€ ๊ฐ™์ด ํ’€์„ ํ†ตํ•ด ๊บผ๋‚ด์“ฐ๋ฉด ๋ชจ๋“  ๊ณ ๋ฃจํ‹ด๋งˆ๋‹ค ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋ฅผ ์ „๋ถ€ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
ํ’€์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐ”๋กœ ๊บผ๋‚ด์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ผ์ข…์˜ ์บ์‹œ์˜ ๊ฐœ๋…์ด๋ผ ๋ณด๋ฉด ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ๊ฐ์˜ ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ๊ฝค ๋ฌด๊ฒ๋‹ค๋ฉด ๊ฝค ๊ดœ์ฐฎ์€ ์„ฑ๋Šฅ ๊ฐœ์„ ์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.




Pool์˜ ๊ตฌ์กฐ์™€ ์›๋ฆฌ

pool์„ ์ž˜ ํ™œ์šฉํ•˜๋ ค๋ฉด GC์™€์˜ ๊ด€๊ณ„์„ฑ์— ๋Œ€ํ•ด์„œ๋„ ์–ด๋А์ •๋„ ์ดํ•ด๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ƒฅ ์“ด๋‹ค๊ณ  ๋ฌด์กฐ๊ฑด ๋นจ๋ผ์ง€๋Š”๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Pool ๊ตฌ์กฐ์ฒด๋ฅผ ๊นŒ๋ณด๋ฉด ์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

Pool์€ ํฌ๊ฒŒ 2๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
ํ•˜๋‚˜๋Š” local ํ’€, ํ•˜๋‚˜๋Š” victim ํ’€์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ดˆ๊ธฐํ™”ํ• ๋•Œ, ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ๋กœ์ปฌ ํ’€์— ์ ์žฌ๋œ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

golang ๋Ÿฐํƒ€์ž„์€ sync.Pool์— ๋Œ€ํ•ด ์•„๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์ง€์†์ ์œผ๋กœ ์ž์›์„ ํ†ต์ œํ•œ๋‹ค.

  1. GC ํƒ€์ž„์ด ๋Œ๋ฉด go ๋Ÿฐํƒ€์ž„์€ ๋‚ด๋ถ€์ ์œผ๋กœ local ํ’€์„ victim ํ’€๋กœ ์ด๋™์‹œํ‚จ๋‹ค. (์ด๋•Œ ๊ธฐ์กด victim ํ’€์€ ์ œ๊ฑฐ๋œ๋‹ค.)
  2. GC ํƒ€์ž„์ด ํ•œ๋ฒˆ ๋” ๋Œ๋ฉด local ํ’€์„ ๋˜ victim ํ’€๋กœ ๋ฐ€์–ด๋‚ด๊ณ , ๊ธฐ์กด victim ํ’€์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
    ์ถœ์ฒ˜ https://www.sobyte.net/post/2022-03/think-in-sync-pool/
    ์–ด์ฐจํ”ผ sync.Pool์€ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ์„ ํ•ด์„œ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ๋Šฅ์ ์ธ ๊ฒฐํ•จ์€ ๋ณ„๋กœ ์—†๋‹ค. ์„ฑ๋Šฅ์ ์ธ ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๋งŒ์„ ๋ฐœ์ƒ์‹œํ‚ฌ ๋ฟ์ด๋‹ค.

๊ทผ๋ฐ ์™œ ๊ตณ์ด ์ง€์šฐ๋Š”๊ฑธ๊นŒ? ์ด์œ ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค.
์ดˆ๊ธฐํ™”๋งŒ ๋ฌดํ•œ์ • ํ•˜๋‹ค๋ณด๋ฉด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋์—†์ด ์ ์žฌ๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฏธ์นœ๋“ฏ์ด ์Œ“์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ GC๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์•„๋ฌดํŠผ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€, GC ํƒ€์ž„์ด ๋‘๋ฉด ๋Œ๋ฉด ๊ธฐ์กด์— ํ• ๋‹น๋œ ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ์ฆ๋ฐœํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.
๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋Š” ์ •๋„๋Š” ๊ทธ ๋นˆ๋„์— ์–ผ๋งˆ๋‚˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

์ด ๊ธฐ๋ฒ•์€ CPU ์บ์‹œ ๊ตฌ์กฐ์—์„œ ๊ณง์ž˜ ์‚ฌ์šฉํ•˜๋Š” Victim cache ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์œ ๋ž˜ํ–ˆ๋‹ค.



์ฐธ์กฐ
https://medium.com/swlh/go-the-idea-behind-sync-pool-32da5089df72
https://pkg.go.dev/sync#Pool
https://www.sobyte.net/post/2022-03/think-in-sync-pool/
https://en.wikipedia.org/wiki/Victim_cache