[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 ๋ฐฉ์์ ์กฐ์ ํ ์ ์๋ค
๊ทธ ์ต์
์ ๋ค์๊ณผ ๊ฐ๋ค.
- worker=์์ปค ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ค์ผ์ค๋ง
- sync=๋๊ธฐ ์ฒ๋ฆฌ (๋ ๊ฑฐ์ ํธํ)
- 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/