- FreeBSD/EC2 유지관리와 릴리스 엔지니어링이 한 사람의 자원봉사 시간 안에서 충돌하던 상황에서, Amazon의 1년 후원이 릴리스 운영과 EC2 플랫폼 개선을 동시에 가능하게 함
- 후원은 GitHub Sponsors를 통한 명목상 월 40시간 규모였지만 실제 작업은 평균 월 50시간이었고, EC2 이슈·릴리스 진행·기타 릴리스 엔지니어링이 대략 20/20/10시간으로 나뉨
- 1년 동안 FreeBSD 13.4, 14.2, 13.5, 14.3 릴리스를 관리하면서 AWS Graviton의 전원 종료 신호 처리와 EC2 디바이스 핫플러그 같은 우선순위 작업도 병행함
- 부팅 성능 회귀를 잡기 위해 2018년 이후 주간 EC2 AMI 빌드를 벤치마크했고, 루트 디스크 크기·EFI 엔트로피 시딩·ZFS 트랜잭션 그룹·IMDSv2 IPv6 변경에서 지연 원인을 찾아 수정함
- 후원 종료 뒤에도 역할은 계속되지만, 릴리스 직전 문제를 직접 고치거나 EC2 기능 목록을 계속 전진시키기에는 투입 가능한 시간이 줄어듦
후원 전 병목과 시간 배분
- FreeBSD/EC2 유지관리는 2010년 Amazon EC2에서 FreeBSD를 처음 부팅시킨 이후 이어졌고, 2023년 11월에는 FreeBSD 릴리스 엔지니어링 리드 역할까지 추가됨
- Antithesis와 FreeBSD/EC2 Patreon의 소액 후원만으로는 두 역할을 감당하기 어려웠음
- 구현할 기능 목록이 정체됨
- 이상 현상을 발견해도 조사할 시간이 없어 미루는 일이 늘어남
- 2024년 초에는 FreeBSD/EC2 플랫폼의 “좋은 오너” 역할을 하기 어렵다는 우려가 커짐
- 2024년 4월 Amazon에서 예산을 가진 담당자를 찾으면서 일정·범위·절차 논의가 진행됐고, Amazon이 GitHub Sponsors를 통해 1년간 후원하기로 함
- 후원 대상은 FreeBSD 릴리스 엔지니어링과 FreeBSD/EC2 개발을 합친 월 40시간 규모였음
- 두 작업은 서로 의존성이 있어 하나만 후원하는 방식은 현실적이지 않다고 전달함
- 실제 투입은 평균 월 50시간 정도로 늘어남
- 평균적으로 EC2 전용 이슈 20시간, FreeBSD 릴리스 진행 20시간, 기타 릴리스 엔지니어링 관련 작업 10시간이었지만 월별 편차가 컸음
분기 릴리스 운영과 빌드 개선
- 2024년 7월 발표한 FreeBSD 분기 릴리스 일정에 따라 1년 동안 4개 릴리스를 관리함
- FreeBSD 13.4: 2024년 9월
- FreeBSD 14.2: 2024년 12월
- FreeBSD 13.5: 2025년 3월
- FreeBSD 14.3: 2025년 6월 10일 릴리스 예정
- 각 릴리스에는 코드 병합 독려, 머지 요청 승인·거부, 다른 팀과의 조율, 이미지 빌드·테스트, 공지문 작성, 릴리스 빌드 문제 수정이 포함됨
- 일반적으로 3개 Beta, 1개 Release Candidate, 최종 Release를 빌드함
- 대부분의 작업은 릴리스 전월, 즉 각 분기의 두 번째 달인 “Beta Month”에 몰림
- FreeBSD 13.5는 33.5시간, FreeBSD 14.2는 79시간이 걸림
- 안정 브랜치 후반으로 갈수록 깨지는 항목이 줄어 릴리스 작업량도 줄어드는 경향이 있음
- FreeBSD 14.1은 추적하지 않았지만 릴리스 엔지니어링 시간이 100시간에 가까웠을 것으로 보이며, FreeBSD 15.0은 그보다 훨씬 많을 가능성이 큼
- 일반 릴리스 엔지니어링에서는 릴리스 빌드 병렬화도 진행함
- EC2 AMI 수가 많아지면서 실제 빌드보다 VM 이미지에 FreeBSD를 설치하는 시간이 큰 비중을 차지함
- 릴리스 코드를 병렬화했지만 산발적인 빌드 실패가 생겼고, 전체 릴리스 빌드가 약 24시간 걸려 원인 분리가 어려웠음
- 최종 원인은 파일 설치 전에 디렉터리를 생성해야 하는 Makefile 한 줄 누락이었음
- 수정 뒤 릴리스 빌드는 약 22시간에서 약 13시간으로 줄었고, 빌드 시간 때문에 미루던 EC2 AMI flavour 확장도 가능해짐
- 빌드 재현성 문제는 EC2를 활용해 정기적으로 확인하기 시작함
- 주간 스냅샷 이미지 테스트 과정에서 EC2 인스턴스를 띄워 자신의 AMI를 빌드하게 함
- diffoscope로 생성된 디스크 이미지와 원본 이미지를 비교함
- 정기 테스트를 통해 여러 이슈를 발견했고, 일부는 직접 고치고 일부는 다른 개발자에게 넘김
FreeBSD/EC2의 Graviton 전원 처리와 핫플러그
- Amazon이 FreeBSD/EC2에서 우선순위로 요청한 주요 기능은 AWS Graviton 인스턴스용 power driver와 디바이스 핫플러그였음
- Graviton 전원 드라이버는 EC2 API가 운영체제에 종료를 알리는 경로를 처리함
- 이 기능이 없으면 FreeBSD는 종료 신호를 무시하고, 몇 분 뒤 EC2가 타임아웃 후 가상 전원을 끊음
- Graviton 시스템의 “전원 버튼”은 GPIO 핀이며, 세부 정보는 ACPI
_AEI객체에 들어 있음 - ACPI에서 해당 정보를 찾아 PL061 GPIO 컨트롤러 드라이버로 구성 정보를 전달하도록 코드를 추가함
- GPIO 핀이 assert되면 컨트롤러가 인터럽트를 생성하고, ACPI “power button” 이벤트가 발생해 시스템 종료로 이어짐
- EC2가 제공하는 ACPI 테이블은 해당 GPIO 핀을 “Pull Up”으로 설정하라고 지정하지만, PL061 컨트롤러에는 pullup/pulldown 저항이 없음
- Linux는 GPIO 구성 실패를 조용히 무시해 문제가 드러나지 않았음
- FreeBSD는 구성 실패 뒤 디바이스를 비활성화했음
- 향후 Graviton 시스템에서 EC2 버그가 수정될 것으로 보지만, 현재는 FreeBSD/EC2 AMI에
ACPI_Q_AEI_NOPULLquirk를 넣어_AEI객체의 GPIO PullUp 플래그를 무시함
- 핫플러그, 특히 핫 언플러그는 여러 EC2 인스턴스 유형에서 서로 다른 문제가 겹쳐 더 많은 작업이 필요했음
- 일부 Graviton 시스템은 PCI attach 중 가상 IRQ 예약을 누수했고, EBS 볼륨을 67회 attach/detach한 뒤 IRQ가 고갈되어 FreeBSD 커널 패닉이 발생함
- 원인은 레거시 PCI 인터럽트 라우팅 코드였고, EC2에서 해당 코드를 끄는 부트 로더 설정을 추가함
- 일부 Graviton 시스템은 OS가 디바이스 사용을 끝내고 eject 준비가 됐는지 판단하는 신호로 PCI 디바이스 전원 상태를 사용했음
- 이는 EC2 버그로 판단되며, 현재는
ACPI_Q_CLEAR_PME_ON_DETACHquirk로 eject 전에 PCI 전원 관리 레지스터의 일부 비트를 바꿈
- 이는 EC2 버그로 판단되며, 현재는
- 최신 세대 EC2 인스턴스의 x86과 Graviton에서는 PCIe unplug 뒤 FreeBSD
nvme드라이버가 패닉을 일으킴- 이 문제는
nvme드라이버 유지관리자에게 전달함
- 이 문제는
- 일부 x86·Graviton EC2 인스턴스에서는 eject 뒤 PCI 버스에 “ghost” 디바이스가 남아 새 디바이스 attach를 막음
- Nitro 펌웨어가 PCI 버스 관리와 PCI 디바이스 관리를 비동기로 수행해, 디바이스가 unplug됐지만 PCI 버스가 몇 ms 동안 여전히 존재한다고 보고하는 창이 있었음
- Linux는 버스를 주기적으로 스캔해 대개 이 경쟁에서 지지만, FreeBSD는 detach 직후 PCI 버스를 즉시 다시 스캔해 ghost를 보는 경우가 많았음
- 현재는
ACPI_Q_DELAY_BEFORE_EJECT_RESCANquirk로 eject 신호 뒤 PCI 버스 재스캔 전 10ms 지연을 추가함
- 일부 Graviton 시스템은 PCI attach 중 가상 IRQ 예약을 누수했고, EBS 볼륨을 67회 attach/detach한 뒤 IRQ가 고갈되어 FreeBSD 커널 패닉이 발생함
- PCIe는 디바이스 eject 요청을 위한 “attention” 버튼을 누른 뒤 5초 지연을 요구하고, 두 번째 버튼 입력이 있으면 eject 요청을 취소함
- EC2에는 물리 버튼을 누르는 사람이 없고 가상 버튼을 다시 누르는 메커니즘도 없어 이 지연은 불필요함
- 부트 로더 tunable을 추가해 EC2에서 타임아웃을 0으로 설정함
- 핫플러그 테스트 스크립트로 EC2 인스턴스를 띄운 뒤 EC2 API로 EBS 볼륨을 반복적으로 plug/unplug하고, FreeBSD가 300회 연속 attach/detach하는지 확인할 수 있게 함
- 향후 EC2 인스턴스 유형에 사전 접근할 수 있다면 핫플러그 동작 여부를 확인하는 데 활용 가능함
부팅 성능 회귀 추적과 AMI 확장
- Amazon의 최우선 작업 두 가지 외에도 EC2 전용 시간의 절반가량은 다른 FreeBSD/EC2 문제에 쓰임
- 2023년 말과 2024년 초에는 FreeBSD/EC2 인스턴스가 때때로 예상보다 오래 부팅됐고, 주간 스냅샷 테스트에서 인스턴스 실행 뒤 SSH 접속 시도 전 대기 시간을 늘려야 했음
- 성능 문제를 다루기 위해 2018년 이후 주간 EC2 AMI 빌드의 부팅 시간을 벤치마크함
- 이 과정에서 EC2 인스턴스 1만 개 이상을 실행함
- FreeBSD boot performance plots를 생성하기 시작함
- 새 데이터 수집과 플롯 갱신은 주간 스냅샷 테스트 과정에 포함됨
- 여러 부팅 지연 원인을 찾아 수정함
- 2024년 첫 주부터 FreeBSD 부팅이 약 3배 느려졌고, 원인은 루트 디스크 크기를 5GB에서 6GB로 늘린 커밋으로 추적됨
- Amazon 쪽 확인 결과, 루트 디스크 크기를 8GB로 늘리면 이전 수준의 성능이 복구됨
- Graviton 2 계열에서는 커널 엔트로피 시딩 문제로 부팅이 길어짐
- FreeBSD 커널은 보안 난수 생성을 위한 엔트로피가 부족하면 더 많은 엔트로피를 모을 때까지 부팅을 멈춤
- EFI 부트 로더를 통해 Nitro 펌웨어에서 보안 시드를 받는 코드가 있었지만 EC2에서는 실행되지 않았고, Graviton 2에서는 2048바이트 요청이 매우 느렸음
- 부트 메뉴 Lua 코드에 있던 요청을 적절한 부트 로더 Lua 위치로 옮겨 메뉴 비활성화 여부와 관계없이 실행되게 함
- 64바이트 EFI 엔트로피를 받아 PBKDF2로 2048바이트 API 입력에 맞게 확장하도록 바꾸면서 FreeBSD
arm64/base/UFS부팅 시간이 약 25초에서 약 8초로 줄어듦
- ZFS 이미지는 UFS보다 부팅이 길었고, 지연 폭은 디스크 크기가 아니라 디스크의 데이터 양에 따라 달라졌음
makefs가 모든 것을 단일 트랜잭션 그룹에 넣고, ZFS attach 시 최근 트랜잭션 그룹을 순회하며 검증하면서 디스크의 모든 파일 메타데이터를 읽고 처리했음- Mark Johnston이 파일시스템에 더 높은 트랜잭션 그룹을 기록하도록 해 단일 트랜잭션 그룹이 “최근”으로 간주되지 않게 해결함
- ZFS 이미지 부팅 시간은 약 22초에서 약 11초로 줄어듦
- 2024년 12월
net/aws-ec2-imdsv2-get포트의 IPv6 지원 추가 뒤 부팅 문제가 빠르게 포착됨- 이 포트는 EC2 Instance MetaData Service용 명령줄 인터페이스를 제공함
- IPv6를 먼저 시도했지만 기본 IMDS 인스턴스 구성은 IPv4-only였고, 기본 TCP 타임아웃 75초도 그대로였음
- 수정 뒤 IPv4를 먼저 시도하고 타임아웃을 100ms로 줄임
- 2024년 첫 주부터 FreeBSD 부팅이 약 3배 느려졌고, 원인은 루트 디스크 크기를 5GB에서 6GB로 늘린 커밋으로 추적됨
- FreeBSD AMI flavour도 확장함
- 기존에는
base와cloud-init만 있었음 smallAMI는 debug symbol, LLDB, 32비트 라이브러리, FreeBSD 테스트, Amazon SSM Agent, AWS CLI를 제거해 디스크 사용량을 약 5GB에서 약 1GB로 줄임builderAMI는 사용자가 맞춤형 FreeBSD AMI를 쉽게 만들 수 있는 FreeBSD AMI Builder AMIs를 제공함
- 기존에는
- 4개 AMI flavour, 2개 파일시스템, 2개 아키텍처, 3개 FreeBSD 버전 조합으로 주간 스냅샷 빌드가 늘어나면서 오래된 이미지와 관련 EBS 스냅샷을 정리함
- FreeBSD 릴리스 엔지니어링 AWS 계정은 Amazon 후원을 받지만 누군가의 비용은 발생함
- 셸 스크립트를 작성해 336TB의 EBS 스냅샷을 제거할 수 있었음
후원 종료 뒤 남는 작업과 제약
- 큰 프로젝트 외에도 여러 작은 작업이 이어짐
- 주간 스냅샷 빌드에서 발견한 빌드 깨짐 수정
- ENA 드라이버 패치 리뷰
- Dave Cottlehuber가 OCI Container를 빌드하고 저장소에 업로드하는 기능을 추가하도록 지원
bsdec2-image-upload도구가 내부 AWS 오류를 더 부드럽게 처리하도록 개선- 우연히 발견한 AWS 보안 이슈 보고
- 후원 종료 뒤에도 FreeBSD 릴리스 엔지니어링 리드와 FreeBSD/EC2 플랫폼 유지관리자 역할은 계속됨
- FreeBSD 15.0은 12월 도착 예정
- 2026년에는 14.4, 15.1, 14.5, 15.2가 이어질 예정
- 투입 가능한 시간이 줄어들면서 릴리스 직전 문제를 직접 고치는 방식은 어려워짐
- 늦게 들어오는 기능은 릴리스에 맞춰 고쳐지기보다 제거될 가능성이 커짐
- FreeBSD 14.2부터 OCI Containers를 포함할 수 있었던 것은 후원된 시간으로 필요한 조각들이 온전하게 들어가도록 확인할 수 있었기 때문임
- EC2 쪽은 부팅 성능 회귀 테스트가 마련되어 관련 문제를 잡아낼 가능성이 있지만, 기능 구현 목록은 추가 시간이 없으면 정체될 수 있음
- EBS 볼륨 확장 시 파일시스템 자동 확장
- 다중 네트워크 인터페이스와 네트워크 인터페이스 핫플러그의 자동 구성 개선
- 롤링 “pre-patched” AMI
- 패키지 설치와 데몬 실행 등을 위한 EC2 user-data 파일 생성 웹사이트
- FreeBSD/Firecracker 작업 재개와 지원 플랫폼화
- Amazon 후원은 대부분의 오픈소스 개발자가 받는 것보다 훨씬 큰 기회였고, 후원이 끝나는 아쉬움과 함께 그동안의 작업 결과에 대한 감사가 남음