| pg_aios |
| pid |
해당 pid (vacuum worker, client backend, ...) |
| io_id |
io 핸들러번호 |
| io_generation |
해당 io 핸들러의 generation(?) |
| state |
-
HANDED_OUT, 코드에서 참조되었지만, 사용 사용 안됨
-
DEFINED, 실행을 위한 information necessary가 정의됨
-
STAGED, 실행 준비
-
SUBMITTED, 실행
-
COMPLETED_IO, 끝났지만, 결과 처리가 끝나지 않음
-
COMPLETED_SHARED, 공동 마침 처리 완료
-
COMPLETED_LOCAL, 백엔드 로컬 마침 처리 완료
|
| operation |
-
invalid, 아직 모름
-
readv, 벡터화된 읽기
-
writev, 벡터화된 쓰기
|
| off |
io 작업 시작위치 |
| length |
io 작업량 |
| target |
io 작업 객체, smgr, 릴레이션 io |
| handle_data_len |
io 작업 관련 데이터 길이. 또는, shared_buffers 및 temp_buffers의 io인 경우는 버퍼수 |
| raw_result |
저수준 작업 결과, null 이면 진행중 |
| result |
-
UNKNOWN 작업결과를 아직 알 수 없음
-
OK 작업 완료, 성공
-
PARTIAL 부분 작업 완료. 작업을 나눠 할 경우 나타남
-
WARNING 작업 중 경고 발생, 예, zero_damaged_pages = on 상태인데, 깨진 블록을 처리할 때 나타남
-
ERROR 작업 실패
|
| target_desc |
blocks 18632..18647 in file "base/5/16384" (작업 대상) |
| f_sync |
sync 했는지? |
| f_localmem |
로컬 메모리 처리했는지? |
| f_buffered |
버퍼링 된 io 작업인지? |
db에서 io 작업이 일어나면,
postgres=# select pid,state,operation,target,handle_data_len,result,target_desc from pg_get_aios();
pid | state | operation | target | handle_data_len | result | target_desc
-------+-----------+-----------+--------+-----------------+---------+--------------------------------------------
27172 | SUBMITTED | readv | smgr | 7 | UNKNOWN | blocks 27550..27556 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 2 | UNKNOWN | blocks 27563..27564 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 2 | UNKNOWN | blocks 27560..27561 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 3 | UNKNOWN | blocks 27539..27541 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 1 | UNKNOWN | block 27566 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 2 | UNKNOWN | blocks 27543..27544 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 1 | UNKNOWN | block 27570 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 5 | UNKNOWN | blocks 27576..27580 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 1 | UNKNOWN | block 27558 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 1 | UNKNOWN | block 27568 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 2 | UNKNOWN | blocks 27573..27574 in file "base/5/16384"
27172 | SUBMITTED | readv | smgr | 3 | UNKNOWN | blocks 27546..27548 in file "base/5/16384"
(12개 행)
형태로 보입니다. (큰 테이블의 50% 가량 빈공간 확보 작업을 위한 autovacuum 때 벌어진 모습니다.)
기본설정(io_method = worker, postgres 에서 aio 처리용 백그라운드 프로세스를 따로 실행해서 처리하는 방법)에서는
평균 읽기 속도: 324.649 MB/s, 평균 쓰기 속도: 334.911 MB/s
io_method = io_uring, uring 라이브러리를 이용해서 커널 시스템 콜을 백엔드 프로세스가 직접 호출하는 방법에서는
평균 읽기 속도: 337.129 MB/s, 평균 쓰기 속도: 351.133 MB/s
이런식으로 어떨 때, worker 모드가 어떨 때 io_uring 모드가 더 빠르게 처리합니다. 왔다 갔다하네요.
물론 단독으로 io를 100% 백엔드 프로세스가 다 쓰는 상황인 경우는
io_method = sync (기존 처리 방식) 일 때가 당연히 가장 빠릅니다.
평균 읽기 속도: 391.735 MB/s, 평균 쓰기 속도: 414.830 MB/s
이번 이 비동기식 입출력 기능은 다중 사용자 환경에서 디스크 읽기/쓰기 병목 현상이 심한 환경에서 비교를 해 보아야
새 기능 도입의 변화를 체감할 수 있을 것 같습니다.
|