IL-0439 Cybozu · 2018-06-28 (게시일)database
블록 디바이스와 파일 시스템을 확장할 때마다 데이터베이스 접근이 한동안 느려졌다
Cybozu 는 자사 시스템의 데이터 일부를 SQLite 에 저장한다. 이 데이터가 놓인 블록 디바이스는 원격 서버의 LVM 볼륨에 대응하는 iSCSI 디바이스 두 개를 RAID1 로 묶은 것이다. 데이터베이스가 커져 파일 시스템의 빈 공간이 모자라면, 이 블록 디바이스의 크기를 늘리고 그 위의 파일 시스템 크기를 늘렸다. 그때마다 데이터베이스 접근이 한동안 느려져 고객이 쓰는 애플리케이션의 응답이 나빠졌다. free 와 sar 로 보니 블록 디바이스를 늘린 뒤 페이지 캐시가 크게 줄었고, 성능 저하와 함께 스토리지 접근이 생겼다. 페이지 캐시는 스토리지 디바이스의 데이터를 메모리에 복사해 두고 읽기와 쓰기를 메모리 속도로 처리하게 하는 커널 기능이다.
운영 본부의 한 엔지니어가 커널 소스를 조사했다. 블록 디바이스 크기 변경 처리에서 불리는 check_disk_size_change() 함수는 크기가 바뀌면 축소든 확장이든 flush_disk() 를 불러, 그 디바이스 위 파일 시스템의 페이지 캐시를 무효화했다. flush_disk() 호출을 넣은 커밋을 git blame 으로 찾아 설명을 읽었다. 축소 때 대상 영역을 읽고 쓰는 중이면 I/O 오류가 나고, 확장은 축소 직후 확장하는 특수한 경우에만 문제가 될 수 있다는 내용이었다. 관련 소스를 모두 조사해 보니 커널 안의 상호 배제 때문에 축소 직후 확장해도 그 문제는 일어날 수 없었고, 확장 때의 무효화는 필요 없었다.
운영 본부의 두 엔지니어는 크기가 줄어들 때만 flush_disk() 를 부르는 fs/block_dev.c 패치를 만들었고, 개발 환경에서 시험한 뒤 운영 환경에 적용해 사내 문제를 풀었다. 두 엔지니어 가운데 커널 소스를 조사하지 않은 다른 한 사람이 이 패치를 upstream Linux 커널에 넣는 작업을 했다. 처음 보낸 [RFC PATCH] fs: don't flush pagecahce when expanding block device 에는 아무도 답하지 않았지만, 패치와 글을 단순하게 다듬어 여러 번 다시 보낸 끝에 몇 달 뒤 next tree 를 거쳐 v4.17 에 들어갔다.
- 심각도
- –
- 영향 범위
- Database access slowed down temporarily after each filesystem expansion, showing as slower application responses for customers
- 영향 사용자
- –
- 지역
- –
- 감지까지
- –
- 복구까지
- –
증상
SQLite 데이터베이스가 놓인 파일 시스템의 크기를 늘린 뒤 데이터베이스 접근이 한동안 느려졌다. 이 현상은 고객이 쓰는 애플리케이션의 응답 속도 저하로 나타났고, Cybozu 는 오랫동안 이 문제를 겪었다.
확장은 두 단계였다. 먼저 파일 시스템이 놓인 블록 디바이스의 크기를 늘리고, 그다음 그 위의 파일 시스템 크기를 늘렸다. 느려지는 것은 두 번째 단계 뒤였다.
free 명령과 sar 명령으로 통계를 보니 첫 번째 단계 뒤 시스템의 페이지 캐시 양이 크게 줄어 있었다. 두 번째 단계 뒤에는 데이터베이스 접근 성능이 떨어지는 것과 함께 스토리지 디바이스 접근이 생겼고, 성능이 회복되면서 스토리지 접근도 줄었다.
커널에서 이 동작을 피하는 설정 항목을 찾았지만 없었다.
증상 지연 시간 증가
원인
- 촉발
- 데이터베이스가 커져 빈 공간이 모자라자 파일 시스템이 놓인 블록 디바이스의 크기를 늘리고 그 위의 파일 시스템 크기를 늘렸다.
감지
파일 시스템 확장 뒤 데이터베이스 접근이 느려진 것이 고객이 쓰는 애플리케이션의 응답 속도 저하로 드러났다.
조치
- 블록 디바이스 크기가 줄어들 때만 flush_disk() 를 부르고 늘어날 때는 페이지 캐시를 무효화하지 않도록 fs/block_dev.c 의 check_disk_size_change() 를 고치는 패치를 만들었다.
- 이 패치를 넣은 커널을 개발 환경에서 시험한 뒤 운영 환경에 적용해 사내 문제를 풀었다.
후속 조치
- 자사 시스템을 받치는 OSS 의 개선에 기여하고 나중에 OS 를 올릴 때 수정 패치를 일일이 백포트하지 않으려고, 패치를 upstream Linux 커널에 넣는 작업을 했다. 패치는 v4.17 에 들어갔다.
교훈
Cybozu 는 소스 수정의 수고가 바뀐 줄 수에 비례하지 않는다고 했다. 이번 수정은 2천만 줄에 이르는 Linux 커널 소스에서 4줄을 더하고 2줄을 지운 것에 지나지 않았지만, 거기까지 여러 시행착오가 있었다. 코드를 쓴 의도를 모를 때는 주석이나 변경 때의 커밋 설명을 보는 것이 정석이라고도 했다.
출처
관련 사례
같은 원인 · 공통 리눅스 커널, 데이터베이스
IL-0451Aurora MySQL 에서 인덱스를 INVISIBLE 로 바꿀 때마다 Reader 3대의 버퍼풀이 무효화돼 CPU 와 ReadIOPS 가 튀었다Daangn · 2026같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0281PostHog US 리전 Logs 제품의 ClickHouse 클러스터가 S3 에 둔 로그 데이터를 거의 다 지워 3일보다 오래된 로그가 사라졌다PostHog · 2026같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0150DynamoDB DNS 자동화의 경쟁 조건이 us-east-1 리전 엔드포인트의 DNS 레코드를 비워 DynamoDB 와 EC2 인스턴스 시작이 실패했고, 그 여파로 EKS, ECS, Fargate 의 컨테이너 시작과 클러스터 스케일링이 14시간 넘게 막혔다Amazon Web Services · 2025같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 리눅스 커널
IL-0527OpenStreetMap.org 의 복제 diff 생성이 invalid memory alloc request size 오류로 16시간 멈춤OpenStreetMap Foundation · 2025같은 원인 · 공통 데이터베이스
IL-0329Postgres 17 업그레이드 뒤 다시 켠 PGAudit 가 마이그레이션 중 락을 쥔 채 멈춰, 서비스 전반이 느려지고 데이터베이스가 2분 동안 내려갔다incident.io · 2025같은 원인 · 공통 데이터베이스
IL-0138nvidia-dkms-390 드라이버 빌드 실패로 망가진 커널 헤더가 몇 주 동안 방치됐다가, 정전 뒤 재부팅하자 하나뿐인 마스터 노드가 커널 패닉에 빠져 홈랩 쿠버네티스 클러스터가 6일 동안 멈췄다.Barush Mendez · 2025같은 원인 · 공통 리눅스 커널
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0024무거운 API 요청이 MongoDB 에 과부하를 걸고 취소되지 않은 요청이 쌓여 Hugging Face Hub 가 사흘 동안 세 번 멈췄다Hugging Face · 2024같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0112나중에 회수된 EKS 노드 AMI 로 노드를 교체한 뒤 노드가 PLEG is not healthy 를 보고하며 NotReady 를 오갔고 파드 네트워크 타임아웃이 났다DFDS · 2022같은 원인 · 공통 리눅스 커널
IL-0385큰 MySQL 테이블의 스키마 마이그레이션 마지막 단계에서 읽기 복제본 다수가 semaphore deadlock 에 걸려 GitHub 핵심 서비스가 2시간 50분 저하됐다GitHub · 2021같은 원인 · 공통 데이터베이스
같은 원인 · 공통 리눅스 커널
IL-0196Redis Operator 로 레플리카를 늘리면서 메모리 한도를 낮추자 데이터를 가진 유일한 Redis 파드가 재시작됐고, Sentinel 이 빈 레플리카를 마스터로 올려 데이터가 모두 지워졌다.Palark · 2020같은 원인 · 공통 데이터베이스
같은 원인 · 공통 리눅스 커널
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 리눅스 커널
같은 원인 · 공통 데이터베이스
IL-0277Elastic Cloud us-east-1 의 ZooKeeper 조정 계층이 쿼럼을 잃어 Elasticsearch 배포에 6시간 넘게 접속하지 못하고 Kibana 는 18:44 UTC 까지 불안정했다Elastic · 2019같은 원인 · 공통 리눅스 커널
IL-0388Redis 고가용 클러스터의 primary 노드가 내려간 뒤 Discord API 가 느려지고 길드 일부가 오프라인으로 보이며 접속이 실패했다Discord · 2017같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0439
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0439/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.