-
Linux Dirty page가 I/O에 미치는 영향커널(Kernel) 2022. 12. 19. 00:26
환경 정보
OS: ubuntu18.04
Dirty page
커널은 page cache를 이용해서 디스크의 정보를 메모리에 잠시 저장하고,
필요할 때마다 메모리에 접근하여 속도를 향상시킬 수 있다.
이때 디스크에 쓰기 작업이 필요한 경우,
디스크에 직접 쓰지 않고 만들어놓은 페이지 캐시에 쓰는데 이렇게 write가 일어난 페이지를 dirty page라 한다.
dirty page가 최종적으로 저장되기 위해서는 더티 페이지가 발생한 메모리 영역은 디스크에 동기화되어야 한다.
보통은 커널 스레드가 flush를 하여 더티 페이지를 디스크에 동기화하며,
I/O가 많이 발생하는 서버는 더티 페이지가 언제 얼마나 동기화되느냐가 성능 튜닝의 중요한 요소가 된다.
Dirty page 커널 파라미터
sysctl -a | grep -i dirty
vm.dirty_background_ratio: 더티 페이지의 내용을 백그라운드로 동기화할 때의 비율을 의미한다.
10이라 되어 있으면, 현재 시스템에서 16GB의 메모리를 사용하고 있다고 했을 때
1.6GB의 더티 페이지가 생기면 디스크에 동기화한다.
vm.dirty_background_bytes: dirty_background_ratio와 동일하며 절대적인 bytes를 의미한다.
vm.dirty_ratio: vm.dirty_background_ratio와 유사한데 더 강하게 제한을 건다.
지정된 비율만큼 dirty page가 생겼을 때 프로세스가 하던 I/O 작업을 모두 멈추고, 동기화 작업을 수행한다.
vm.dirty_bytes: dirty_ratio와 유사하며 비율이 아닌 절대적인 bytes를 의미한다.
vm.dirty_writeback_centisecs: flush 커널 스레드를 몇 초 간격으로 깨울 것인지를 의미한다.
위 이미지에서는 500 x (1/100) = 5초에 한 번씩 깨어나서 더티 페이지를 디스크에 동기화한다.
vm.dirty_expire_centisecs: flush 커널 스레드를 언제 깨울지를 나타낸다.
위 이미지에서는 43200 x (1/100) = 432초 동안 더티 페이지 상태인 페이지들을 디스크로 동기화시킨다.
백그라운드 동기화
diry page 동기화는 크게 백그라운드 동기화, 주기적인 동기화, 명시적인 동기화로 구분할 수 있다.
1. 백그라운드 동기화
관련 파라미터로는 vm.dirty_background_ratio와 vm.dirty_background_bytes가 있다.
더티 페이지를 생성할 때마다 현재까지 생성된 dirty page와 전체 메모리의 비율을 바탕으로 동기화를 한다.
2. 주기적인 동기화
관련 파라미터로는 vm.dirty_writeback_centisecs와 vm.dirty_expire_centisecs가 있다.
해당 값들을 조절하여 특정 주기로 flush 커널을 깨워 디스크 동기화를 수행한다.
3. 명시적인 동기화
명시적인 동기화는 명령어를 통해 명시적으로 동기화시키는 것을 의미한다.
sync, fsync 명령을 이용해서, 현재 생성되어 있는 더티 페이지를 명시적으로 디스크에 쓰는 것이다.
I/O에 따른 dirty page 설정 방법
동기화와 관련해서 중요한 부분은 flush 커널 스레드를 얼마나 자주 깨울 것인지, 얼마나 많은 양을 동기화할 것인지이다.
flush 커널 스레드가 깨어나는 주기를 줄여 더티 페이지 동기화를 너무 빨리 시키면,
너무 자주 깨어난 flush 커널 스레드가 스케줄링에 대한 오버헤드를 만들어 성능에 영향을 줄 수 있다.
반면에 더티 페이지 동기화를 너무 천천히 시키면,
나중에 동기화해야 할 더티 페이지가 많아져서 시스템에 영향을 줄 수 있다.
따라서 더티 페이지 동기화는 워크로드와 시스템 구성에 맞게 설정해주어야 한다.
Reference
Devops와 SE를 위한 리눅스 커널 이야기
반응형'커널(Kernel)' 카테고리의 다른 글
Linux I/O 스케줄러(cfq, deadline, noop) (0) 2022.12.26 Application 튜닝해서 성능 최적화하기 (0) 2022.12.26 Linux TCP 재전송과 타임 아웃 (0) 2022.12.18 Linux TCP Keepalive 정리 (0) 2022.12.11 Linux TIME_WAIT 소켓 정리 (0) 2022.12.11