요약
- Mendel Rosenblum과 John Ousterhout의 Sprite LFS는 수많은 작은 무작위 쓰기를 큰 순차 전송으로 변환했지만, 무효화된 구버전은 여전히 세그먼트 클리닝을 통해 회수해야 했다.
- 이 논문의 가장 오래 지속되는 기여는 회계 방식이었다. 쓰기 비용에는 새 버전을 추가하는 지연 시간뿐 아니라 클리너가 읽고 다시 쓰는 데이터까지 포함되었다.
- 이후 구현들은 이 거래의 양면을 모두 보여주었다. 클리닝은 진짜 유휴 시간에 실행되는 경우가 많았지만, 디스크가 가득 차고 무작위 갱신이나 여유 공간이 부족하면 애플리케이션 성능을 크게 떨어뜨릴 수도 있었다.
완료된 추가(append)는 완료된 쓰기가 아니다
작은 갱신을 거의 즉시 승인해 주는 스토리지 서비스를 상상해 보라. 그 포그라운드 경로는 우아하다. 변경 사항을 버퍼에 담고, 다른 변경들과 합쳐서 하나의 긴 순차 구간으로 기록한다. 영수증은 쓰기가 빨랐다고 말한다. 하지만 구버전이 공간을 더는 차지하지 않게 되었는지, 다음 쓰기 폭주를 위한 빈 세그먼트가 준비되어 있는지, 복구가 저렴한 비용으로 어느 버전이 현재인지 식별할 수 있는지에 대해서는 말해 주지 않는다.
이 영수증과 실제 운영 현실 사이의 간극이 바로 로그 구조 파일 시스템이 열어준 영역이다. 1992년 논문에서 Mendel Rosenblum과 John K. Ousterhout는 단순히 파일 시스템을 “로그처럼” 쓰자고 제안한 것이 아니라, Sprite에서 실제로 만들고, 측정하고, 쓰기 경로의 겉보기 단순함에 대가를 지불하는 메커니즘을 드러냈다. John Ousterhout의 경력은 운영체제, 분산 시스템, 프로그래밍 언어, 스토리지에 걸쳐 있지만, 이 사례가 특히 시사적인 이유는 클리너를 포함해야만 설계 논리가 성립하기 때문이다.
핵심 조치는 명확했다. Sprite LFS는 파일 데이터와 메타데이터를 버퍼링한 뒤, 큰 순차 전송으로 디스크에 기록했다. 수많은 작은 동기식 무작위 쓰기가 하나의 비동기 실행으로 바뀔 수 있었다. 읽기는 로그를 훑지 않았다. 기존 인덱스는 여전히 현재 블록을 가리켰고, 아이노드 맵이 각 아이노드의 현재 디스크 위치를 기록했다. 따라서 순차 쓰기는 무작위 접근의 포기를 의미하는 것이 아니라 배치 전략이었다.
첫 쓰기가 저렴했던 이유는 LFS가 구버전을 제자리에서 갱신하는 대신 새 버전을 썼기 때문이다. 그로 인해 구버전은 죽었지만 사라진 것은 아니었다. 로그가 디스크를 한 바퀴 돌면서 죽은 블록은 살아 있는 블록 사이에 구멍으로 섞여 남았다. 흩어진 구멍을 직접 재사용하면 이 설계가 의존하는 큰 순차 전송이 무너진다. Sprite LFS는 대신 디스크를 큰 세그먼트로 나누고 세그먼트 단위로 회수했다.
클리너는 이 아키텍처의 나머지 절반이다
세그먼트 클리닝은 후보 세그먼트를 읽고, 어느 블록이 여전히 살아 있는지 판단하고, 그 살아 있는 블록들을 압축된 실행 구간으로 복사한 뒤, 기존 세그먼트를 해제한다. 세그먼트 요약 레코드는 저장된 각 블록이 어느 파일의 어느 논리 블록이었는지 알려 준다. 클리너는 이 식별 정보를 현재 메타데이터와 비교해 생존 여부를 판정한다. 이 요약들은 충돌 이후 복구가 로그를 롤포워드하는 데도 도움을 준다.
이는 시스템 성능 모델 밖의 잡무가 아니다. 모든 덮어쓰기의 미결제 절반이다. 세그먼트가 대부분 죽어 있다면, 클리닝은 조금의 복사로 많은 빈 공간을 확보한다. 대부분 살아 있다면, 클리너는 세그먼트의 상당 부분을 읽고 다시 써야 작은 이득을 얻는다. 따라서 용량 사용률은 그 자체가 성능 설정이기도 하다. 더 많은 공간을 비워 두면 시스템이 저렴한 세그먼트를 찾을 여유가 커진다.
Rosenblum과 Ousterhout는 “쓰기 비용”으로 이 전송량을 가시화했다. 그 공식에서 유용한 새 바이트가 분모이고, 이를 수용하기 위해 필요한 디스크 트래픽—클리너의 읽기와 다시 쓴 살아 있는 데이터를 포함—이 분자였다. 쓰기 비용 1은 새 데이터만 이동하는, 사실상 도달 불가능한 이상이다. 쓰기 비용 10은 대략 원시 대역폭의 10분의 1만 새 데이터에 남는다는 뜻이다. 이 지표는 낮은 지연 시간의 추가(append)가 미래로 넘겨진 작업을 숨기는 것을 허용하지 않는다.
클리너에는 온도 판단도 필요하다. 항상 가장 덜 사용된 세그먼트를 고르는 탐욕적 정책은 그럴듯했지만, 지역성 때문에 의외로 약했다. 차가운 블록이 반쯤 사용된 세그먼트에 갇혀 남는 동안, 뜨거운 블록은 복사된 직후 다시 변경될 수 있었다. 논문의 비용-편익 정책은 세그먼트 사용률과 가장 어린 블록의 나이를 결합해 대략(1-u) × age / (1+u)를 계산했다. 나이는 안정성의 대리 지표였다. 차가운 세그먼트는 더 많은 살아 있는 데이터를 담고 있더라도 클리닝하고, 뜨거운 세그먼트는 더 비워질 때까지 기다린다.
보고된 시뮬레이션에서, 연구된 워크로드에 대해 이 분리 방식은 탐욕적 클리닝 대비 쓰기 비용을 최대 절반가량 줄였다. 그러나 나이는 미래에 대한 지식이 아니었다. 그것은 운영상의 가설이었다. 워크로드 체제가 바뀌면 어제의 차가운 자료가 다시 뜨거워질 수 있고, 시스템은 잘못된 분류의 대가를 치른다.
벤치마크 경계가 중요했다
원 논문이 이례적으로 유용했던 이유는 가장 강한 수치가 어디서 멈추는지 보여주었기 때문이다. 마이크로벤치마크에는 클리닝이 포함되지 않았다. 그것들은 포그라운드 경로의 최선 사례 이점을 보여줬을 뿐, 안정 상태에 대한 판정이 아니었다. 더 강한 근거는 4개월간의 실제 운영에서 나왔다. Sprite 시스템은 약 1.2에서 1.6 사이의 쓰기 비용과 최대 순차 대역폭의 약 70% 수준의 장기 쓰기 성능을 보고했다. 이는 해당 환경에서 설득력 있는 운영 중 시스템 근거였지, 보편적 상수가 아니었다.
복구에는 별도의 계산이 있었다. Sprite LFS는 관련 아이노드 맵 상태를 식별하는 체크포인트를 기록한 뒤, 세그먼트 요약을 이용해 이후 로그 내용을 롤포워드했다. 체크포인트가 자주일수록 평상시 작업량이 늘고, 드물수록 충돌 후 검사해야 할 자료가 많아진다. 빠른 승인, 완료된 체크포인트, 유한한 복구 스캔은 서로 연관된 영수증이지만 서로 교환 가능하지는 않다.
저자들은 또한 경험의 한계와 열린 질문에 대해 솔직했다. 이는 이후 로그 구조화를 둘러싸고 형성된 신화보다 더 중요하다. 설계가 신뢰를 얻는 길은 자신의 측정이 어느 현실을 커버하는지—이 구현, 이 워크로드, 이 사용률, 이 시간 구간—명시하는 것이다. 미래의 모든 장치를 말하는 것이 아니다.
반증이 교훈을 완성했다
다음 세대의 연구는 Sprite 결과를 단순히 확인하지 않았다. Margo Seltzer, Keith Bostic, Marshall Kirk McKusick, Carl Staelin은 BSD용 로그 구조 파일 시스템을 구현했다. 그들의 연구는 클러스터링을 통해 기존 파일 시스템이 LFS의 일부 이득을 따라잡을 수 있음을 보여주었다. LFS의 가장 뚜렷한 이점은 수많은 아주 작은 파일을 포함한 메타데이터 집약적 워크로드에서 나타났고, 대형 파일 성능은 비슷했다.
클리닝이 결정적이었다. 1995년 비교 연구에서, 테스트한 디스크가 절반쯤 찼을 때 클리너 오버헤드는 트랜잭션 처리 성능을 33% 이상 낮췄다. 그 논문은 또한 최대 40%까지 성능이 저하되었다는 이전 측정을 논의했다. 휴리스틱 클리닝에 대한 또 다른 연구는, 가장 무거운 시스템에서 단순한 정책이 클리닝의 97%를 백그라운드로 수행할 수 있음을 보여주었다. 두 결과 모두 참일 수 있다. “백그라운드”는 부채가 존재하는지가 아니라 언제 갚아지는지를 말한다. 기계에 여유가 있으면 부채는 사용자가 디스크를 놓고 경쟁하기 전에 상각될 수 있다. 그러나 수집이 계속되고 디스크가 차오르며 유휴 구간이 사라지면, 같은 작업은 포그라운드 경합이 된다.
적응형 LFS 연구는 이 경계를 더욱 선명하게 했다. 빈번한 작은 쓰기, 캐시에 흡수되는 읽기, 충분한 유휴 시간은 유리했다. 유휴 시간이 거의 없는 꽉 찬 디스크에서의 무작위 갱신은 그렇지 않았다. 세그먼트 크기, 클리너 정책, 캐싱 선택, 읽기 배치를 바꾸면 유용한 영역을 넓힐 수 있었지만, 어떤 설정도 이 거래 자체를 없애지는 못했다.
이것이 Ousterhout의 LFS 연구를 순차 I/O에 대한 슬로건이 아니라 제도적 엔지니어링으로 읽어야 하는 이유다. 이 설계는 얇고 이해하기 쉬운 포그라운드 규칙을 만든 뒤, 미뤄진 기계 작업을 측정 가능하게 만들었다. 성공적인 추가 기록은 현실의 한 층만을 기술한다. 클리너 여유, 복구 상태, 용량 예비분은 다른 층들을 기술한다.
출처
- Mendel Rosenblum, John K. Ousterhout, “The Design and Implementation of a Log-Structured File System”
- Mendel Rosenblum, LFS 박사학위논문 및 기술 보고서
- John Ousterhout의 Sprite 회고
- Stanford의 John Ousterhout 프로필
- Seltzer 등, 유닉스용 로그 구조 파일 시스템 BSD 구현
- Margo Seltzer 등, “File System Logging Versus Clustering”
- Blackwell 등, 휴리스틱 클리닝 알고리즘
- Matthews 등, LFS의 적응형 방법
회원 브리핑
프로필 심층 컨텍스트
올바른 멤버십 등급으로 로그인하면 전체 브리핑과 출처 노트를 볼 수 있습니다.
Strategic Circle 전용
Strategic Circle
모든 독자에게 공개됩니다. 가입 후 로그인하면 프로필 브리핑를 열람할 수 있습니다.
Strategic Circle 가입하기Leadership Alliance 전용
Leadership Alliance
자격을 갖춘 IP 자산 소유자 및 운영진을 위한 콘텐츠입니다. 로그인하면 Leadership Alliance 브리핑을 열람할 수 있습니다.
Leadership Alliance 가입하기





