본문 바로가기
IT/Linux_리눅스

[Linux] 리눅스의 Dirty Page

by 능보테 2021. 3. 11.
728x90
반응형

안녕하세요. 이번 포스팅에서는 리눅스 /proc/meminfo 에서 Dirty Page 항목이 무엇을 의미하는지 이것이 시스템 I/O에 어떤 영향을 주는지 알아보도록 하겠습니다.

 

 


 

0. Dirty Page란?????

리눅스에서는 파일 I/O가 발생할 때, 커널은 PageCache를 이용해서 디스크에 있는 파일의 내용을 메모리에 저장하고 이를 필요할 때마다 메모리에 접근해서 사용합니다.

 

이를 통해서 디스크에 접근할 때보다 메모리에 접근할 때의 빠른 속도의 이점을 활용하고 시스템의 성능을 향상시킬 수 있습니다.

 

dirty page는 이러한 캐시의 내용들 중 하나입니다.

위의 간략한 예제 그림을 보면 PageCache에 a, b, c 파일이 올라가있고 이는 디스크에 1:1로 대응합니다.

만약 초기상태에서 b에 해당하는 파일에 쓰기작업이 이뤄졌다고 해봅니다.

 

b 파일의 내용이 d로 바뀌는 순간에 PageCache와 디스크에 있는 1:1대응 내용이 서로 다르게 됩니다.

 

그래서 커널은 해당 메모리 영역에 대해서 디스크에 있는 내용과 달라졌음을 표시하는 Dirty bit를 켜고 바로 이 영역을 dirty page라고 하게 됩니다.

 

즉, DirtyPage는 Page Cache 에 있는 Page 중에서도 쓰기 작업이 이뤄진 메모리라고 할 수 있습니다.

 

이 상태에서는 PageCache와 디스크 사이의 내용이 다르기 때문에 시스템이 꺼진다면 디스크에 쓰지 못한 내용은 사라지게 되고 이는 파일의 내용에 대한 정합성이 깨지게 됩니다.

 

이 dirty page로 표시된 메모리들을 생성될 때마다 디스크에 쓰면 이는 I/O를 크게 일으켜 성능을 저하시킬 수 있습니다.

 

그래서 page writeback(dirty page 동기화)라 부르는 작업을 통해 몇 가지 조건이 됬을때 dirty page를 디스크로 동기화합니다.

 

I/O가 많이발생하는 서버에서는 dirty page를 언제 얼마나 백그라운드 동기화시키느냐가 이 중요한 성능 튜닝의 요소가 됩니다.

 

커널의 버전마다 차이가 있겠지만 보통 flush 라는 단어가 들어간 쓰레드들(ex. pdflush, flush, bcflush...)등이 동기화 작업을 진행합니다.


1. Dirty Page 관련 커널 파라미터

dirty와 관련된 커널의 파라미터를 살펴보겠습니다.
아래의 명령어를 입력하면 dirty 와 관련된 파라미터들을 볼 수 있습니다.

sysctl -a | grep -i dirty

차례대로 하나씩 나열해 보겠습니다.

  1. vm.dirty_background_ratio: dirty page의 내용을 백그라운드로 동기화할 때, 그 기준이 되는 비율을 의미합니다. 전체 메모리 양에 이 값을 곱해서 나온 기준 값보다 dirty page 크기가 커지면 백그라운드에서 dirty page의 내용을 디스크로 동기화합니다.예를 들어, 전체 메모리가 8GB라면, dirty page의 크기가 0.8GB가 되었을 때 백그라운드 동기화를 진행합니다.
  2. vm.dirty_background_bytes:
    위의 vm.dirty_background_ratio 는 전체 메모리 대비 비율을 의미하지만, bytes는 절대적인 byte의 값을 의미합니다.
    예를 들어, 이 값을 특정값으로 지정하면 dirty page의 크기가 그 값이 됬을 때, 동기화를 진행합니다.
  3. vm.dirty_ratio:
    만약 이 값이 10으로 설정되어 있고 전체 메모리가 8GB라고 한다면 어떤 프로세스가 I/O 작업을 하던 중 dirty 페이지의 크기가 0.8GB 가 되면 그 프로세스의 I/O 작업을 모두 멈추고 dirty page를 동기화합니다. dirty page에 대한 hard limit이라 할 수 있습니다.
  4. vm.dirty_bytes:
    vm.dirty_ratio 와 비슷한 방식으로 사용되지만 절대적인 byte의 양을 기준으로 동기화합니다.
  5. vm.dirty_writeback_centisecs:
    이 값은 flush 커널 쓰레드를 몇 로 간격으로 깨울 것인지를 결정합니다.
    값은 1/100초를 기준으로 설정되므로 1초를 설정하려면 100을 입력해야합니다.
    이러면 1초에 한 번 flush 커널 쓰레드가 꺠어나서 동기화를 진행합니다.
  6. vm.dirty_expire_centisecs:
    vm.dirty_writeback_centisecs 값에 의해서 깨어난 flush 커널 쓰레드가 디스크에 싱크시킬 dirty page의 기준을 찾을 때 이 값을 사용합니다.
    이 값도 1/100초의 값으로 입력되야하고 dirty page로 분류된 후 입력값동안 디스크로 동기화되지 않은 페이지들을 디스크에 동기화시킵니다.

 


 

 

본 포스팅의 내용 및 이미지를 무단 전재, 재배포 또는 복사를 금지합니다.

인용 시 출처와 같이 공개해주세요!

도움이 되셨다면 댓글 또는 공감 부탁드립니다!

728x90
반응형

댓글