[IT 심층 분석]
데이터베이스 서버의 SSD가 1년 만에 수명을 다한 이유: Write Amplification Factor 완전 해부
김민준 · IT 시스템 엔지니어|
데이터센터에서 관리하는 데이터베이스 전용 서버의 NVMe SSD가 구매한지 불과 14개월 만에 스마트(SMART) 상태에서 수명 잔여량이 1% 미만으로 경고를 내뿜기 시작했습니다. 엔터프라이즈급 SSD의 스펙상 보증 수명은 5년 이상인데 이렇게 빠르게 소모될 이유가 없었습니다. 이 이상한 드라이브 노화 현상을 파헤치는 과정에서 낸드 플래시(NAND Flash) 스토리지의 핵심 개념인 쓰기 증폭 인자(WAF, Write Amplification Factor)와 깊이 있게 마주하게 되었습니다.
낸드 플래시는 데이터를 수정할 때 해당 위치의 셀만 업데이트할 수 없습니다. 반드시 블록 단위로 지우고(Erase) 페이지 단위로 새롭게 써야 합니다. 사용자가 단 1KB의 데이터를 수정하더라도 SSD 내부에서는 해당 블록의 전체 데이터를 임시 공간에 복사하고 블록을 지운 후 수정된 내용을 포함해 전체를 다시 쓰는 과정이 일어납니다. 이렇게 호스트가 요청한 쓰기 양보다 SSD 내부에서 실제로 발생하는 물리적 쓰기 양이 몇 배 증폭되는 현상이 WAF입니다. WAF가 10이라면 1GB를 쓸 때마다 실제 낸드 셀에는 10GB의 소모가 일어나는 셈입니다.
이 데이터베이스 서버의 문제는 MySQL InnoDB의 트랜잭션 로그인 Redo Log와 더블 라이트 버퍼가 극도로 작게 설정되어 있어 유난히 많은 빈도로 동기 플러시가 발생하고 있었습니다. 각 트랜잭션 커밋마다 fsync를 호출하는 innodb_flush_log_at_trx_commit=1 설정이 SSD에게 폭풍같은 랜덤 소규모 쓰기를 퍼붓고 있었고 이것이 WAF를 끔찍하게 높이는 주범이었습니다. 대책으로 innodb_log_file_size와 innodb_log_buffer_size를 대폭 늘려 더 많은 양의 트랜잭션 로그를 메모리에 모아두었다가 한 번에 큰 단위로 플러시하도록 조정했습니다. 또한 운영체제의 I/O 스케줄러를 SSD에 최적화된 mq-deadline으로 변경하여 병합 가능한 소규모 I/O 요청들을 합쳐 하나의 큰 순차 쓰기로 변환하도록 유도했습니다. 신규 SSD로 교체 후 설정을 적용한 결과 WAF는 측정 기준으로 7.4에서 1.8 수준으로 낮아졌습니다.