[PostgreSQL] Asynchronous I/O

Postgresql 18 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๊ธฐ์กด์˜ ํ‹€์„ ๊นจ๊ณ , ๋น„๋™๊ธฐ์‹ I/O๋ฅผ ์ „๋ฉด ๋„์ž…ํ•˜๋Š” ์ตœ์ ํ™”๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

๊ธฐ์กด์—๋Š” ๋™๊ธฐ ๋ฐฉ์‹์˜ I/O๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋งŒ ํŒŒ์ผ์ด๋‚˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ–ˆ์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜๋„ ์„ฑ๋Šฅ์ด ์ถฉ๋ถ„ํžˆ ๊ดœ์ฐฎ์•˜๋˜๊ฒŒ ์‹ ๊ธฐํ•˜๋‹ค.

์•„๋ฌดํŠผ 18 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๋น„๋™๊ธฐ I/O๊ฐ€ ๊ธฐ๋ณธ ๋™์ž‘์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  I/O ๋ฐฉ์‹์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์กฐ์ ˆํ•  ์ˆ˜๋„ ์žˆ๋‹ค.




I/O ์กฐ์ ˆ ์˜ต์…˜: io_method

์ƒ๊ธฐํ–ˆ๋“ฏ์ด, pg 18์—์„œ๋Š” io_method๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ I/O ๋ฐฉ์‹์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค
๊ทธ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. worker=์›Œ์ปค ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์Šค์ผ€์ค„๋ง
  2. sync=๋™๊ธฐ ์ฒ˜๋ฆฌ (๋ ˆ๊ฑฐ์‹œ ํ˜ธํ™˜)
  3. io_uring=๋ฆฌ๋ˆ…์Šค io_uring ์‚ฌ์šฉ

๊ธฐ๋ณธ ๋™์ž‘์€ io_method=worker๋‹ค. ์ž์ฒด์ ์ธ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์›Œ์ปค๋ฅผ ๋ช‡๊ฐœ ๋‘๊ณ ์„œ ์ง์ ‘ ์Šค์ผ€์ค„๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์€ ์„ฑ๋Šฅ์ด ์šฐ์›”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” io_uring์ด ์ž์ฒด ๊ตฌํ˜„ worker๋ณด๋‹ค ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ €์กฐํ•  ๋•Œ๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฑด ์ง€๊ธˆ ์‹œ์ ์—์„œ๋Š” ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค.




์„ฑ๋Šฅ

์‹ค์ œ ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ๋ฅผ ๋ณด๋ฉด, work I/O๊ฐ€ sync I/O๋ณด๋‹ค 2๋ฐฐ ์ •๋„ ๋น ๋ฅด๊ธฐ๋„ ํ•˜๋‹ค.

๋‹น์—ฐํžˆ sync๊ฐ€ ์ œ์ผ ๋А๋ฆฌ๊ณ , io_uring์ด ์ค‘๊ฐ„ ์ง€์ ์˜ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค€๋‹ค.
๊ทธ๋ฆฌ๊ณ  worker๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅธ๊ฑด ํ™•์‹คํ•œ๋ฐ, ์›Œ์ปค ๊ฐœ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์žก๋А๋ƒ์— ๋”ฐ๋ผ์„œ ํญ์ด ์ข€ ์ƒ๊ธด๋‹ค. ๋„ˆ๋ฌด ์ ๊ฒŒ ์žก์œผ๋ฉด ๋А๋ ค์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์˜ˆ์ „์— ๋งŒ๋“ค์–ด๋†จ๋˜ ๋ฒค์น˜๋งˆํฌ๊ฐ€ ์žˆ์–ด์„œ ๊ทธ๊ฑฐ์—๋„ ์ ์šฉํ•ด๋ดค๋Š”๋ฐ, ์—„์ฒญ ํฌ์ง„ ์•Š์ง€๋งŒ ์œ ์˜๋ฏธํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์žˆ์—ˆ๋‹ค. 17 vs 18์ด๊ณ , 1000๋งŒ๊ฐœ์˜ KV ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์šฐ๊ฒจ๋„ฃ๋Š” APPEND ๋ฒค์น˜๋งˆํฌ์˜€๋‹ค.

ํ™•์‹คํžˆ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋Š˜๊ธด ๋Š˜๊ณ , ๋ ˆ์ดํ„ด์‹œ ์ธก๋ฉด์—์„œ๋„ ์ข€ ๋” ๋นจ๋ผ์ง„ ๊ฒƒ ๊ฐ™๋‹ค.




์›Œ์ปค ๊ฐœ์ˆ˜ ์˜ต์…˜: io_workers

์ด์ œ๋Š” ๊ธฐ๋ณธ ๋™์ž‘์ด worker I/O๋กœ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ์›Œ์ปค ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ๋„ ํŠœ๋‹ํฌ์ธํŠธ๊ฐ€ ๋œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” io_workers.

์•„์ง ์‹คํ—˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง„ ์•Š์•„์„œ ๋”ฑ ๋ญ๋ผ ์งš์–ด์„œ ์ถ”์ฒœํ•˜๊ธฐ๋„ ์–ด๋ ต๊ณ , pg๊ฐ€ ์ž๋™์œผ๋กœ ํ•˜๋“œ์›จ์–ด ์ตœ์ ๊ฐ’์„ ์„ธํŒ…ํ•ด์ฃผ์ง€๋„ ์•Š๋Š”๋‹ค.

ํ™•์‹คํ•œ ๊ฒƒ์€ ์ ์€ ๊ฒƒ๋ณด๋‹ค๋Š” ๋งŽ์€๊ฒŒ ์ข‹์€๋ฐ, ์ฝ”์–ด ์ˆ˜๋ณด๋‹ค๋Š” ๊ฐ™๊ฑฐ๋‚˜ ์ ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๋Œ€์ฒด๋กœ๋Š” ์ฝ”์–ด ๊ฐœ์ˆ˜์˜ 25% ์ •๋„๋ฅผ ์›Œ์ปค ๊ฐœ์ˆ˜๋กœ ์žก๊ณ  ๋ณด๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณผ๋งŒํ•˜๋‹ค. ๊ทธ ์ด์ƒ์€ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ฝ”์–ด ๊ฐœ์ˆ˜๋กœ ๋งž์ถ”๋Š” ๊ฒƒ๋„ ์ด๋ก ์ ์œผ๋กœ๋Š” ๊ดœ์ฐฎ๋‹ค.




ํ•œ๊ณ„

io_method๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ/๋™๊ธฐ ์„ ํƒ ๊ธฐ๋Šฅ์€ ์•„์ง ๋ชจ๋“  ๋ถ€๋ถ„์— ์ ์šฉ๋˜์ง„ ์•Š๋Š”๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์˜ˆ์™ธ๋Š” ์ธ๋ฑ์Šค ์Šค์บ” ๋ถ€๋ถ„์ด๋‹ค. ์ถ”ํ›„์— ๋ฐ˜์˜๋  ์ˆ˜๋„ ์žˆ์œผ๋‚˜, ์ง€๊ธˆ์€ ์•„๋‹ˆ๋‹ค.



์ฐธ์กฐ
https://wiki.postgresql.org/wiki/AIO
https://vondra.me/posts/tuning-aio-in-postgresql-18/