PostgreSQL 비동기 I/O

PostgreSQL asynchronous I/O

PostgreSQL 18은 여러 디스크 읽기를 겹쳐 요청하는 AIO 하위 시스템을 도입했습니다.

···
html
<div class="demo"><div class="head"><b>STORAGE READS</b><span id="aio">serial</span></div><div class="stage io"><div class="lane"><span>sync</span><div class="bars serial"><i></i><i></i><i></i></div></div><div class="lane"><span>AIO</span><div class="bars overlap"><i></i><i></i><i></i></div></div></div><div class="foot"><span id="iostatus">one request at a time</span><span>illustrative timing</span></div></div>
css
*{box-sizing:border-box}.demo{width:min(96vw,820px);height:min(94vh,350px);padding:clamp(8px,2vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);display:flex;flex-direction:column;gap:clamp(5px,1.5vmin,12px);font:600 clamp(12px,3.5vmin,15px)/1.25 var(--font-sans),sans-serif;overflow:hidden}.head,.foot,.row{display:flex;justify-content:space-between;align-items:center;gap:8px}.head b{color:var(--accent)}.head span,.foot,.muted{color:var(--muted)}.stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:8px}.cell,.pill{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(4px,1.2vmin,9px);text-align:center}.pill{border-radius:999px}.on{border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 17%,var(--surface))!important;color:var(--fg)!important}.bad{border-color:#e16a5d!important;background:color-mix(in srgb,#e16a5d 18%,var(--surface))!important}.foot{font-size:clamp(12px,3vmin,14px)}.io{flex-direction:column;align-items:stretch;justify-content:center}.lane{display:grid;grid-template-columns:50px 1fr;align-items:center;gap:6px}.bars{height:clamp(28px,7vmin,46px);position:relative;background:var(--bg);border:1px solid var(--line);border-radius:7px;overflow:hidden}.bars i{position:absolute;top:15%;height:70%;width:25%;background:color-mix(in srgb,var(--accent) 65%,var(--surface));border-radius:4px;transition:opacity .3s}.serial i:nth-child(1){left:5%}.serial i:nth-child(2){left:36%}.serial i:nth-child(3){left:67%}.overlap i:nth-child(1){left:5%}.overlap i:nth-child(2){left:18%}.overlap i:nth-child(3){left:31%}.bars:not(.active) i{opacity:.22}
js
let n=0;function tick(){document.querySelector('.serial').classList.toggle('active',!n);document.querySelector('.overlap').classList.toggle('active',!!n);document.getElementById('aio').textContent=n?'overlap':'serial';document.getElementById('iostatus').textContent=n?'requests in flight together':'one request at a time';n=1-n}tick();const t=setInterval(tick,1200);document.querySelector('.demo').onclick=()=>{clearInterval(t);tick()}

PostgreSQL 18의 비동기 I/O는 지원되는 작업에서 여러 읽기 요청을 기다리지 않고 함께 발행합니다. 순차 스캔, 비트맵 힙 스캔, VACUUM 등이 이 경로를 활용할 수 있습니다.

데모는 순차 대기와 요청을 겹치는 경우의 작업 막대를 비교합니다. 실제 이득은 저장 장치, 쿼리, io_method 설정에 따라 다르므로 측정이 필요합니다.

언제 쓰나

PostgreSQL 18에서 대량 읽기·VACUUM의 I/O 대기가 병목일 때 설정과 실측을 검토합니다.

페이지로 열기 ↗