디스크를 타겟으로 만들어진 시스템
특징 : 로그 스트럭쳐 : 모든 쓰기를 로그형태로 쓴다. 뒤에 차곡차곡 붙여 쓴다.
OUT OF PLACE , APPEND으로 쓴다.
LFS vs FFS
dir1/file1 , dir2/file2 생성
FFS : 8개의 랜덤 write가 발생
LFS : 파일데이터 => 아이노드 => 디렉토리데이터 => 아이노드 ... 순차적
시퀀셜하게 쓰면 성능에 좋다. 이러면 아이노드가 고정된 위치가 아니다.
세그먼트 컨셉 도입
LFS : 슈퍼블럭 , 체크포인트 영역(마지막에 쓰여진 메타데이터 정보,위치) , 세그먼트들
새로운 데이터를 쓴다면 세그먼트에 로그형태로 쓴다.
세그먼트가 다 차면 가비지 컬렉션 발생 => 세그먼트 클리닝
세그먼트들을 회수해서 valid을 따로 빼냄
그리디 : 유틸라이제이션이 가장 작은거 선택. 세그먼트 1 ,2 ,3 이 있을 때 0.1, 0.5 , 0.3 일 때 클리닝 비용이 seg1이 가장 작다. 그러므로 1을 선택하면 greedy 방식
세그먼트 나이 고려. 가장 최근 : 가장 핫하다. 나이가 적을수록 냅둔다.
cold 데이터중에 util이 작은 것
클리닝 오버헤드가 크지 않나?
re-read인 경우 성능이 좋지 않다.
- 플래시 특성 : 로그 스트럭쳐
슈퍼블럭, 체크포인트 리전 (고정위치)
슈퍼블럭 : 파일시스템 정보
체크포인트 리전 : 아이노드 위치, 세그먼트 정보(usage , summary)
세그먼트는 로그 구조로 이루어짐(apped형식)
아이노드의 일부는 디렉토리 , 일부는 파일아이노드
overwrite가 안되니 다른 페이지에 작성했을 것 => 이 위치를 가리키는 포인터 블럭도 수정을 해야한다. => 파일 아이노드 , 아이노드 맵 , 체크포인트까지 수정해야한다.
클리닝 오버헤드 : 퍼포먼스 이슈
노드 블럭 : 주소 변환(NAT) , Wandering Tree Problem 해결
멀티 헤드 로깅 : 여러 세그먼트들을 쓰고 동시에 플러시 (병렬유닛 최대로 활용)
핫 콜드 분화 : 클리닝 오버헤드 줄임
<그림.F2FS의 내부구조>
슈퍼블럭 , 체크포인트 , 세그먼트 summary ,NAT , seg usage
메타데이터와 일반데이터로 구분함.
hot/cold 분화, hot이면 다시 참조될 확률이 높다.
cold : 대부분 valid
====> LFS에서의 성능그래프가 그려짐
세그먼트를 모아서 => 섹션 , 섹션을 모아서 => 존으로 관리
스레디드 로깅 : 이용률이 높을 때 , Copy하는 오버헤드가 없고 점프하면서 쓴다.
노멀 로깅 : 세그먼트 클리닝 => valid를 한쪽으로 모으고 나머지를 free한다.