린구스는 더 이상 별도의 버퍼 캐시를 두지 않는다. 하지만 2.2커널로 돌아가 보면, 리눅스에는 두 가지의 디스크 캐시, 즉 페이지 캐시와 버퍼 캐시가 있었다. 전자는 페이지르르, 후자는 버퍼를 캐시하는데 사용되었다. 또한 두 캐시는 전혀 통합되지 않아서, 어떤 디스크 블록이 동시에 두 캐시 모두에 들어 있을 수도 있었다. 이것은 메모리의 낭비는 말할 것도 없도, 두 캐시에 있는 동기화라는 큰 과제를 안겨주었다.
2.4커널 부터는 두 캐시는 통합되기 시작했고, 현재에는 하나의 캐시, 페이지 캐시만 남아 있다.
하지만 여전히 커널은 메모리에 있는 디스크 블록을 표현하기 위한 버퍼가 필요하다. 다행히도 디스크 블록의 페이지로의 매핑을 기술하는 버퍼가 있는데, 그것은 바로 페이지 캐시이다.
pdflush 데몬
쓰기 동작은 페이지 캐시를 통해 지연된다. 페이지 캐시에 속한 데이터가 저장공간의 것보다 더 최신 것이 되면, 해당 데이터는 dirty 해졌다고 한다.(DB에서 dirty 버퍼랑 똑같넹)
메모리에 쌓인 dirty페이지들은 언제가 디스크로 다시 쓰여져야 한다. 이러한 라이트백은 다음의 두가지 상황에서 이루어진다.
- 가용 메모리가 일정 한계 이하로 낮아질 경우, 커널은 가용 메모리를 늘리기 위해 dirty 페이지를 라이트백한다.
- dirty 데이터가 일정 한계 이상으로 ㄷ오래될 경우, 무한정 dirty 상태로 남아있는 것을 막기 위해 디스크로 라이트백한다.
2.6커널에서는 커널 스레드의 갱인 pdflush 백그라운드 라이트백 데몬 혹은 간단히 pdflush스레드들이 이러한 작업을 처리한다. 또는 pdflush가 "dirty page flush"의 줄임말이라는 얘기도 있다.
우선 pdflush 스레드는 시스템의 가용 메로리가 일정 수준 이하로 적어질 경우, dirty데이터를 디스크로 내보내야 한다.
이러한 백그라운드 라이트백의 목표는, 가용한 물리적 메로리가 소진되었을 때, dirty한 페이지들로부터 메모리를 회수하는 것이다. 메모리 소진 여부를 결정한느 수준은 sysctl 명령으로 dirty_background_ratio 값을 변경하여 조절할 수 있다.
가용 메모리가 이 경계 이하로 떨어지면, 커널은 wakeup_bdflush()를 호출하여 pdflush 스래드를 깨워 dirty페이지를 라이트백 하는 background_writeout() 함수가 수행되도록 한다. 이 함수는 하나의 매개변수를 갖는데, 그것은 라이트백을 시도할 페이지의 개수이다.
이 함수는 다음의 두 조건이 만족할 때까지 데이터를 기록한다.
- 지정된 최소 페이지 개수만큼 페이지가 기록된 경우
- 가용 메모리가 dirty_background_ratio 경계 이상이 된 경우
이 조건들은 pdflush가 가용 메모리가 적은 상황을 해결할 수 있도록 보장해준다. 이 조건들이 만족되기 전에 라이트백이 중단되는 유일한 경우는 더 이상 남아있는 dirty 페이지가 없는 경우 뿐이다.
한편 두 번째 목표를 위해 pdflush 스레드는 주기적으로 깨어나서 가장 오랜된 dirty 페이지들을 디스크로 내보낸다. 이것은 dirty페이지가 메모리에 너무 오랫동안 남아있는 상황을 방지해준다. 시스템 고장일 경우, 메모리는 휘발성이므로 메모리에 있던 dirty 페이지는 모두 소실된다. 따라서 주기적으로 페이지 캐시를 디스크와 동기화시켜야 하는것이다.
시스템이 부팅될 대, pdflush 스레드를 깨우기 위한 타이머가 설정되며, 이 때 스레드는 wb_kupdate() 함수를 실행한다. 이 함수는 dirty_expire_centisecs * 1/100초 이전에 수정된 모든 dirty 페이지를 라이트백 한다. 그 다음 다시 dirty_writeback_centiesecs * 1/100초 만큼의 만료시간을 지정하여 타이머를 재활성화한다. 이러한 식으로 pdflush 스레드는 주깆거으로 깨어나서 특정 시간보다 오래된 모든 dirty 페이지를 디스크로 내보낸다.
시스템 관리자는 이러한 경계값을 /proc/sys/vm이나 sysctl을 사용하여 설정할 수 있다.
pdflush 매커니즘은 mm/pdflush.c, 라이트백 매커니즘은 mm/page-writeback.c와 fs/fs-writeback.c에 구현돼있다.
2.4커널 부터는 두 캐시는 통합되기 시작했고, 현재에는 하나의 캐시, 페이지 캐시만 남아 있다.
하지만 여전히 커널은 메모리에 있는 디스크 블록을 표현하기 위한 버퍼가 필요하다. 다행히도 디스크 블록의 페이지로의 매핑을 기술하는 버퍼가 있는데, 그것은 바로 페이지 캐시이다.
pdflush 데몬
쓰기 동작은 페이지 캐시를 통해 지연된다. 페이지 캐시에 속한 데이터가 저장공간의 것보다 더 최신 것이 되면, 해당 데이터는 dirty 해졌다고 한다.(DB에서 dirty 버퍼랑 똑같넹)
메모리에 쌓인 dirty페이지들은 언제가 디스크로 다시 쓰여져야 한다. 이러한 라이트백은 다음의 두가지 상황에서 이루어진다.
- 가용 메모리가 일정 한계 이하로 낮아질 경우, 커널은 가용 메모리를 늘리기 위해 dirty 페이지를 라이트백한다.
- dirty 데이터가 일정 한계 이상으로 ㄷ오래될 경우, 무한정 dirty 상태로 남아있는 것을 막기 위해 디스크로 라이트백한다.
2.6커널에서는 커널 스레드의 갱인 pdflush 백그라운드 라이트백 데몬 혹은 간단히 pdflush스레드들이 이러한 작업을 처리한다. 또는 pdflush가 "dirty page flush"의 줄임말이라는 얘기도 있다.
우선 pdflush 스레드는 시스템의 가용 메로리가 일정 수준 이하로 적어질 경우, dirty데이터를 디스크로 내보내야 한다.
이러한 백그라운드 라이트백의 목표는, 가용한 물리적 메로리가 소진되었을 때, dirty한 페이지들로부터 메모리를 회수하는 것이다. 메모리 소진 여부를 결정한느 수준은 sysctl 명령으로 dirty_background_ratio 값을 변경하여 조절할 수 있다.
가용 메모리가 이 경계 이하로 떨어지면, 커널은 wakeup_bdflush()를 호출하여 pdflush 스래드를 깨워 dirty페이지를 라이트백 하는 background_writeout() 함수가 수행되도록 한다. 이 함수는 하나의 매개변수를 갖는데, 그것은 라이트백을 시도할 페이지의 개수이다.
이 함수는 다음의 두 조건이 만족할 때까지 데이터를 기록한다.
- 지정된 최소 페이지 개수만큼 페이지가 기록된 경우
- 가용 메모리가 dirty_background_ratio 경계 이상이 된 경우
이 조건들은 pdflush가 가용 메모리가 적은 상황을 해결할 수 있도록 보장해준다. 이 조건들이 만족되기 전에 라이트백이 중단되는 유일한 경우는 더 이상 남아있는 dirty 페이지가 없는 경우 뿐이다.
한편 두 번째 목표를 위해 pdflush 스레드는 주기적으로 깨어나서 가장 오랜된 dirty 페이지들을 디스크로 내보낸다. 이것은 dirty페이지가 메모리에 너무 오랫동안 남아있는 상황을 방지해준다. 시스템 고장일 경우, 메모리는 휘발성이므로 메모리에 있던 dirty 페이지는 모두 소실된다. 따라서 주기적으로 페이지 캐시를 디스크와 동기화시켜야 하는것이다.
시스템이 부팅될 대, pdflush 스레드를 깨우기 위한 타이머가 설정되며, 이 때 스레드는 wb_kupdate() 함수를 실행한다. 이 함수는 dirty_expire_centisecs * 1/100초 이전에 수정된 모든 dirty 페이지를 라이트백 한다. 그 다음 다시 dirty_writeback_centiesecs * 1/100초 만큼의 만료시간을 지정하여 타이머를 재활성화한다. 이러한 식으로 pdflush 스레드는 주깆거으로 깨어나서 특정 시간보다 오래된 모든 dirty 페이지를 디스크로 내보낸다.
시스템 관리자는 이러한 경계값을 /proc/sys/vm이나 sysctl을 사용하여 설정할 수 있다.
pdflush 매커니즘은 mm/pdflush.c, 라이트백 매커니즘은 mm/page-writeback.c와 fs/fs-writeback.c에 구현돼있다.