14장 블록 입출력 계층. [88] DATE

Download Report

Transcript 14장 블록 입출력 계층. [88] DATE

14장 블록 입출력 계층

Sang-Bok, Heo

Contents 블록 장치 구조 버퍼와 버퍼 헤드 bio 구조체 요청 큐 입출력 스케줄러

2

블록 장치 구조 섹터(sector)

• • • • 가장 작은 단위 2의 거듭제곱 값의 크기 (일반적으로 512 Byte) 섹터보다 작은 단위로 접근/동작하는 장치는 없음 하드 섹터 / 장치 블록

블록(block)

• • • • • 논리적으로 접근할 수 있는 별도의 최소 단위 파일시스템 추상화 개념 커널은 블록 단위 / 물리적인 장치는 섹터 단위 블록의 크기는 페이지 크기를 넘을 수 없음 파일시스템 블록 / 입출력 블록 3

버퍼와 버퍼 헤드 버퍼

• • 각 버퍼는 하나의 블록에 대응 디스크상의 블록을 메모리상에 표현하는 객체 역할

버퍼 헤드

• 커널이 버퍼를 다루는 데 필요한 모든 정보를 보유 4

버퍼와 버퍼 헤드 buffer_head

• • • • b_count : 버퍼 사용 횟수 get_bh : 참조 횟수 증가, 버퍼 헤드에 메모리가 해제되기 않도록.

put_bh : 참조 횟수 감소 디스크상의 물리적인 불록 b_bdev가 가리키는 블록 장치에 있는 b_blocknr 번째 논리적 블록 b_page : 주어진 버퍼에 해당하는 물리적인 메모리 페이지 b_data : 메모리 상에 블록이 존재하는 주소 끝나는 주소 (b_data + b_size)

목적

• 디스크 상의 블록과 메모리 상의 물리적인 버퍼의 연결 관계 5

버퍼와 버퍼 헤드 bh_state 플래그

상태 플래그

BH_Uptodate BH_Dirty BH_Lock BH_Req BH_Uptodate_Lock BH_Mapped BH_New BH_Async_Read BH_Async_Write BH_Delay BH_Boundary BH_Write_EIO BH_Unwritten BH_Queit BH_Meta BH_Pri BH_Defer_Completion BH_PrivateStart

의미

버퍼에 유효한 데이터가 들어 있음 버퍼가 변경되었음 현재 버퍼에 대한 입출력 작업이 진행 – 동시 접근 금지 현재 버퍼가 입출력 요청을 처리 중 페이지의 첫 번째 BH에 의해 사용 디스크상의 블록이 할당된 유효한 버퍼 get_block() 함수를 통해 새로 할당만 된 버퍼 end_buffer_async_read() 통해 비동기식 읽기 작업 진행 end_buffer_async_write() 통해 비동기식 읽기 작업 진행 아직 버퍼에 해당하는 디스크상의 블록이 없다(지연 할당) 버퍼가 연속된 블록의 경계에 해당. 다음 블록은 연속 x 버퍼 쓰기 작업 중 입출력 오류 발생 디스크상에 버퍼를 위한 공간이 할당, 실제 데이터 미기록 버퍼에서 발생하는 오류를 무시 메타 데이터를 포함 REQ_PRIO와 함께 작업큐에 AIO 완료를 지연 유효한 상태 플래그가 아님, 코드에서 사용할 수 있는 첫 번째 비트를 표시하는데 사용 6

버퍼와 버퍼 헤드 문제점

• • 버퍼 헤드는 크고 다루기 힘든 자료구조 버퍼 헤드 관점에서 데이터를 조작하는 것은 간단/깔끔하지 않음 버퍼 대신 페이지와 주소 공간을 직접 다루는 방식 · address_space 구조체와 pdflush 데몬 버퍼 헤드는 하나의 버퍼만 기술 (16장-페이지 캐시와 페이지 지연 기록) 모든 입출력 작업의 전달자로 버퍼 헤드를 사용 · 커널은 큰 블록 입출력 작업을 여러 개의 buffer_head 구조체로 분할 처리 · 불필요한 공간 소모가 발생

개선

• bio 구조체 7

bio 구조체 bio

• • • 현재 진행 중인 블록 입출력 동작을 세그먼트 리스트로 표현 세그먼트 : 메모리상에 연속된 버퍼 모음 버퍼 모음을 사용함으로써 메모리의 여러 곳에 분산 저장된 단일 버퍼의 블록 입출력 동작을 처리 할 수 있음 분산-수집 입출력(scatter-gather I/O) 목적 : 진행 중인 블록 입출력 작업을 표현 하는 것 구조체의 대부분 항목은 이와 관련된 정보를 저장하기 위한 것 중요 : bi_io_vec, bi_vcnt, bi_idx 8

bio 구조체 bio

9

입출력 벡터 bi_io_vec

• bio_vec 구조체 배열을 가리킴 블록 입출력 작업의 대상이 되는 세그먼트 리스트를 저장하는데 사용 해당 세그먼트를 나타내는 형태의 벡터 벡터 배열 전체가 버퍼 전체를 나타냄

정리

• • • • • 블록 입출력 요청은 bio 구조체로 표현 각 요청은 하나 이상의 블록으로 구성(bio_vec 구조체 배열에 저장) b_io_vec : 입출력 동작의 첫 번째 세그먼트를 가리킴 총 bi_cnt 개수 만큼의 세그먼트가 리스트에 들어 있음 현재 처리중인 세그먼트를 가리키도록 bi_idx 항목이 갱신 bi_idx 항목은 현재 처리 중인 bio_vec를 가리킴 10

신구 버전 비교 버퍼헤드와 bio구조체 간의 차이점

• • buffer_head 구조체 하나의 버퍼를 표현, 디스크상의 한 블록을 나타냄 입출력 요청을 블록 크기 단위로 쪼갰다가 합치는 불필요한 작업 발생 bio 구조체 입출력 작업을 표현 작업 대상에는 하나 이상의 메모리 페이지가 들어 있을 수 있음

bio 사용시 장점

• • • • 포인터를 다루지 않고 물리적 페이지만 다루므로 상위 메모리를 쉽게 표현 가능 일반 페이지 입출력과 직접 입출력을 모두 표현 가능 분산-수집 형태의 블록 입출력 작업을 쉽게 처리할 수 있음 최소한의 정보만 들어 있어서 버퍼헤드에 비해 훨씬 더 가벼움 11

요청 큐 요청 큐

• • • • request_queue 구조체로 표현 입출력 요청의 이중 연결 리스트와 관련 정보 포함 블록 장치 드라이버는 큐의 앞 부분에서 요청을 꺼내 해당 블록 장치에 전달 요청 큐에 내용이 있으면 큐에 들어 있는 항목은 하나의 입출력 요청을 의미함

입출력 요청

• • • • • struct request 구조체로 표현 하나 이상의 bio 구조체를 가지고 있음 연속된 여러 개의 블록으로 구성될 수 있음 인접한 블록/인접하지 않은 메모리 각 Bio 구조체에는 여러 개의 세그먼트가 들어 있을 수 있음 한 요청에는 여러 개의 bio 구조체가 들어 있을 수 있음 12

입출력 스케줄러 입출력 스케줄러

• • • • 요청이 발생하자마자 순서 그대로 전달 시 성능이 좋지 않음 느린 디스크 탐색을 최소화하는 것은 시스템 성능에 중요함 디스크 입출력 자원을 시스템의 대기 중인 블록 입출력 요청에 분배 커널은 요청 큐에 대기 중인 요청들을 병합하고 정렬 대기 중인 여러 블록 입출력 요청에 대해 블록 장치를 가상화 디스크 탐색 시간을 최소화 하기 위해 13

입출력 스케줄러 하는 일

• • • • • 블록 장치의 요청 큐를 관리 큐에 들어 있는 요청의 순서 결정 각 요청을 언제 블록 장치로 보낼 것인지 결정 전체 성능을 얻는 다는 목적 전체 성능을 개선 시키기 위해 불공정하게 처리 할 수 있음 병합 둘 이상의 요청을 하나로 합침 개별 탐색 시간을 최소화하는 것이 아닌 전체 탐색 시간을 최소화 디스크 헤드의 이동 방향을 일정하게 유지 엘리베이터 알고리즘 14

입출력 스케줄러 리누스 엘리베이터

• • • • 병합과 정렬 모두를 수행 요청이 추가될 때, 병합이 가능한 후보가 있는 지 확인 병합 : 전방/후방 병합 방식. 후방병합이 많이 발생 전방 병합 : 새 요청이 기존 요청의 바로 앞 후방 병합 : 새 요청이 기존 요청의 바로 뒤 병합 실패 시 큐의 삽입 가능한 위치를 찾음 찾으면 새 요청을 그 곳에 추가 못 찾으면 큐의 끝 부분에 추가 오래된 요청이라면 끝에 추가 · 다른 오래된 요청이 미처리 상태에 머무르는 것을 방지 15

입출력 스케줄러 데드라인 입출력

• • • • • • • 요청이 미처리 상태에 머무는 현상을 막는 방법을 찾음 리누스 엘리베이터 스케줄러 탐색 시간 최소화에 대한 집중은 미처리 현상을 발생 시킴 요청을 항상 섹터 위치에 따라 큐에 추가 요청에 대한 만료시간이 존재 읽기요청 500ms, 쓰기요청 5s 정렬 큐 디스크의 물리적 위치에 따른 정렬 상태를 유지하는 요청 큐 특별 큐 특별 읽기 FIFO 큐, 특별 쓰기 FIFO 큐 정렬 큐의 앞에 있는 요청 -> 처리 큐에 넣음 -> 디스크 드라이브에 보냄 16

입출력 스케줄러 데드라인 입출력

• • 스케줄러 요청이 지연되는 시간을 보장하지 않음 쓰기 요청으로 인해 읽기 요청이 미처리 상태를 방지 읽기 요청의 만료 시간이 쓰기 요청의 만료 시간보다 작음 디스크 읽기 FIFO 큐 쓰기 FIFO 큐 정렬 큐 17

입출력 스케줄러 예측 입출력 스케줄러

• • • • 읽기 지연 시간을 계속 제공, 훌륭한 전체 성능을 제공 데드라인 입출력 스케줄러의 동작을 기본으로 함 세 개의 큐, 처리 큐, 각 요청의 만료 시간 예측 휴리스틱(anticipation heuristic) 추가 요청을 전달한 다음 바로 다른 요청을 처리하러 돌아가지 않음 수 밀리 초 동안 아무 일도 하지 않음(기본 값 : 6ms) 다른 읽기 요청을 받을 수 있음 인접 영역에 해당하는 요청은 바로 처리 탐색 횟수와 기간을 최소화, 읽기 지연 시간 최소화 서버에 이상적인 스케줄러 18

입출력 스케줄러 완전 공정 큐(Complete Fair Queuing) 입출력 스케줄러

• • • • • 특별한 부하 조건을 위해 설계된 입출력 스케줄러 멀티미디어를 다루는 경우 입출력 요청을 프로세서에 따라 특정 큐에 할당 각 큐 내부에서 인접한 요청은 병합/정렬 섹터 위치에 따른 정렬 상태를 유지 순차 방식(round robin)으로 큐의 요청을 처리 설정된 개수(기본 값 : 4)의 요청을 꺼냄 다양한 상황에서 좋은 성능을 보임 데스크탑 환경에서 추천, 리눅스의 기본 입출력 스케줄러 19

입출력 스케줄러 무동작 입출력 스케줄러(noop I/O scheduler)

• • • 별다른 동작을 하지 않음(noop) 병합 동작만 수행 큐에 새로운 요청이 추가될 때 인접한 요청이 있으면 병합 플래시 메모리와 같은 블록 장치를 위한 것 탐색을 위해 치러야 하는 대가가 없는 임의 접근이 가능한 장치 전용 20

입출력 스케줄러 입출력 스케줄러 선택

• • • 2.6 커널에 들어 있는 네 가지 입출력 스케줄러 기본적으로 완전 공정 큐 입출력 스케줄러 사용 커널 명령행 옵션으로 elevator=‘ ‘

인자

as cfq deadline noop

입출력 스케줄러

예측 입출력 스케줄러 완전 공정 큐 입출력 스케줄러 데드라인 입출력 스케줄러 무동작 입출력 스케줄러 21