온프레미스 SQL Server에서 AWS 이전 후 디스크 I/O 성능이 저하되는 원인과 대응
公開日 2026-09-07 · 更新日 2026-09-07 · 最終検証日 2026-09-07
結論
온프레미스의 물리 서버는 PCIe 버스 직결의 로컬 NVMe/SSD를 사용해 극도로 낮은 지연시간과 높은 I/O 처리 능력을 갖추고 있으나, AWS의 RDS/EC2에서 표준인 Amazon EBS는 네트워크를 경유해 연결되는 가상 블록 스토리지로, 인스턴스 크기와 볼륨 유형에 따라 IOPS와 처리량이 엄격하게 스로틀링됩니다. 이 차이를 인식하지 않고 이전하면 CPU 여유가 있어도 배치 및 인덱스 재구축이 스로틀링으로 지연되고, Provisioned IOPS를 과다 설정하면 비용만 증가하는 결과가 발생합니다. 대응은 디스크 I/O 발생량 자체를 줄이는 것이 기본으로, 버퍼 풀 최대화, 데이터 압축, 데이터 파일과 로그 파일의 물리적 분리, CDC 정리 지연에 의한 로그 비대화 대응이 실무의 중심이 됩니다.
この文書の適用条件
| 対象製品 | SQL Server(Amazon RDS for SQL Server / EC2상의 SQL Server) |
|---|---|
| 確認バージョン | SQL Server 2012 이상(CDC의 대응 에디션은 버전마다 다름으로 확인 필요) |
| 適用環境 | 온프레미스 물리 서버에서의 AWS 이전(Amazon RDS for SQL Server, EC2) |
| 必要権限 | 조회성 명령은 VIEW DATABASE STATE 상당의 참조 권한. sys.sp_cdc_cleanup_job의 수동 실행과 DBCC SHRINKFILE의 실행에는 db_owner(환경에 따라 sysadmin) |
| 実行影響 | 조회성 명령은 참조만. sp_cdc_cleanup_job은 CDC 변경 데이터의 삭제, DBCC SHRINKFILE은 로그 파일 크기의 변경을 수반함 |
| 再起動 | 불필요 |
| 最終検証日 | 2026-09-07 |
そのまま実行できるコマンド
- 対象
- SQL Server 2008 이상 / Amazon RDS for SQL Server
- 権限
- 대상 테이블에 대한 참조 권한(sp_estimate_data_compression_savings 의 실행 권한)
- 変更作業
- 없음(견적만 산출하며 실제 압축은 수행하지 않음)
- Production実行
- 가능
-- 대상: SQL Server 2008 이상 / Amazon RDS for SQL Server
-- 권한: 대상 테이블에 대한 참조 권한(sp_estimate_data_compression_savings 의 실행 권한)
-- 변경 작업: 없음(견적만 산출하며 실제 압축은 수행하지 않음)
-- Production 실행: 가능
USE [SampleDB];
GO
EXEC sys.sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'Orders',
@index_id = NULL,
@partition_number = NULL,
@data_compression = 'PAGE';추정 결과의 size_with_current_compression_setting 과 size_with_requested_compression_setting 의 차이가 압축으로 절감할 수 있는 디스크 사용량의 추정치입니다. 압축은 CPU 오버헤드를 대가로 디스크 I/O 횟수를 줄이므로, CPU에 여유가 있는 환경일수록 효과가 나기 쉽습니다.
- 対象
- SQL Server 2008 이상 / Amazon RDS for SQL Server
- 権限
- sys.databases 의 메타데이터 가시성
- 変更作業
- 없음(참조 전용)
- Production実行
- 가능
-- 대상: SQL Server 2008 이상 / Amazon RDS for SQL Server
-- 권한: sys.databases 의 메타데이터 가시성
-- 변경 작업: 없음(참조 전용)
-- Production 실행: 가능
SELECT name, log_reuse_wait_desc
FROM sys.databases
WHERE name = 'SampleDB';
-- 결과가 'REPLICATION'인 경우, CDC 또는 트랜잭션 레플리케이션이 미읽은 로그를 보유하고 있음`REPLICATION` 은 CDC와 트랜잭션 레플리케이션 양쪽 모두에 해당될 수 있는 값입니다. 대상 데이터베이스에서 CDC가 활성화되어 있는지는 `sys.databases.is_cdc_enabled` 로 별도 확인하고, 캡처 지연 자체를 자세히 추적하는 경우는 ‘SQL Server의 CDC에서 로그 스캔이 멈추지 않았는지 확인하는 방법’을 참조하세요.
- 対象
- SQL Server 2008 이상(CDC 대응 에디션) / Amazon RDS for SQL Server
- 権限
- db_owner(cdc.sp_cdc_cleanup_job 의 실행 권한)
- 変更作業
- 있음(유지 기간을 초과한 CDC 변경 테이블의 데이터를 삭제)
- Production実行
- 실행 가능. 다만 삭제 대상 데이터를 하류 연동이 아직 소비하고 있지 않은지를 사전에 확인할 것
-- 대상: SQL Server 2008 이상(CDC 대응 에디션) / Amazon RDS for SQL Server
-- 권한: db_owner(cdc.sp_cdc_cleanup_job 의 실행 권한)
-- 변경 작업: 있음(유지 기간을 초과한 CDC 변경 테이블의 데이터를 삭제)
-- Production 실행: 실행 가능. 다만 삭제 대상 데이터를 하류 연동이 아직 소비하고 있지 않은지를 사전에 확인할 것
USE [SampleDB];
GO
EXEC sys.sp_cdc_cleanup_job;정기 잡의 정리가 지연되고 있는 경우의 즉효적 대응입니다. 다만 이는 증상에 대한 대응이며, 정리 잡 자체가 왜 지연되었는지(잡 정지, 실행 시간 부족 등)는 별도로 조사하세요. 실행 전에 레플리케이션 대상이나 ETL 등 하류 연동이 유지 기간 내의 변경 데이터를 아직 읽고 있지 않은지를 반드시 확인합니다.
- 対象
- SQL Server 2008 이상 / Amazon RDS for SQL Server
- 権限
- sysadmin 또는 db_owner
- 変更作業
- 있음(로그 파일의 끝을 잘라서 파일 크기를 축소)
- Production実行
- 원칙 실행 가능. 다만 log_reuse_wait_desc 가 NOTHING 인 것을 확인한 뒤에 실행할 것
-- 대상: SQL Server 2008 이상 / Amazon RDS for SQL Server
-- 권한: sysadmin 또는 db_owner
-- 변경 작업: 있음(로그 파일의 끝을 잘라서 파일 크기를 축소)
-- Production 실행: 원칙 실행 가능. 다만 log_reuse_wait_desc 가 NOTHING 인 것을 확인한 뒤에 실행할 것
USE [SampleDB];
GO
-- 목표 크기(MB)를 지정하여 축소
DBCC SHRINKFILE (N'SampleDB_log', 1024);log_reuse_wait_desc 의 요인을 해소하기 전에 축소해도, 로그는 즉시 재확장합니다. 본 기술 자료에서는 SHRINK 계열의 연산을 영향의 크고 작음에 관계없이 모두 ‘높음’ 표시로 하고 있습니다. 데이터 파일 축소와 로그 파일 축소의 차이, TRUNCATEONLY의 용도 구분은 ‘DBCC SHRINKDATABASE와 DBCC SHRINKFILE의 차이와 실행 전에 확인해야 할 것’에서 자세히 다루고 있습니다.
結果の読み方
| 列 | 意味 | 確認するポイント |
|---|---|---|
| log_reuse_wait_desc | 트랜잭션 로그의 영역이 해제되지 않는 이유 | 'REPLICATION' 은 CDC 또는 트랜잭션 레플리케이션이 미읽은 로그를 보유하고 있음을 나타냅니다. 'NOTHING'이면 해제를 방해하는 요인이 없는 것입니다 |
| size_with_requested_compression_setting | 지정한 압축 방식을 적용한 경우의 추정 크기 | 현재 크기와의 차이가 클수록 디스크 I/O 절감과 스토리지 비용 절감의 여력이 큽니다 |
こういう状況で使います
- 온프레미스 이전 전과 동등 이상의 사양 AWS 인스턴스를 선택했는데 야간 배치 및 인덱스 재구축 소요 시간이 2배 이상으로 증가
- 대규모 데이터 적재 및 인덱스 재구축 중간에 데이터베이스 전체가 일시적으로 응답 없음
- CPU 사용률에는 여유가 있는데 배치 처리만 완료되지 않음
- 이전 후 스토리지 용량이 급격히 부족해져 RDS 자동 스토리지 확장이 잦아짐
- Provisioned IOPS(io2 등)를 증강해도 스토리지 비용만 불어나고 근본적인 개선에 이르지 못함
考えられる原因(可能性の高い順)
01
네트워크 연결형 스토리지(EBS)고유의 지연시간
온프레미스 물리 NVMe/SSD는 PCIe 버스에 직결되어 마이크로초 단위의 지연시간으로 작동하지만, AWS RDS/EC2에서 표준적인 Amazon EBS는 인스턴스와 전용 내부 네트워크 링크로 연결되는 가상 블록 스토리지입니다. 물리적 지연시간(수 밀리초 단위)이 구조적으로 반드시 발생합니다.
02
IOPS와 처리량의 스로틀링(대역 제한)
인스턴스 크기 및 볼륨 유형·할당 용량에 따라 1초당 처리할 수 있는 IOPS와 처리량(MB/s)의 상한이 엄격하게 정의되어 있습니다. gp2/gp3 등의 범용 볼륨은 기본 성능을 초과하면 버스트 잔량을 소비하며, 대규모 데이터 적재나 인덱스 재구축에서 상한에 도달하면 심한 스로틀링이 발생해서 DB 전체가 응답 불가능해집니다. 볼륨 측 IOPS를 io2 등으로 올려도 인스턴스 측 EBS 전용 대역폭(EBS-Optimized)이 병목이 되는 경우도 있습니다.
03
Provisioned IOPS의 과대 설정으로 인한 비용 비대화
I/O 성능 부족을 쉽게 해결하려고 고가의 io2/io2 Block Express 등의 Provisioned IOPS를 대량 확보하면, 스토리지 비용만으로 월 수십만~수백만 원 규모로 뛰어오르며 클라우드 이전에 의한 비용 절감 효과가 사라집니다.
04
CDC 정리 잡 지연에 의한 로그 미해제
대규모 배치 업데이트 발생 시 CDC의 정리 잡이 따라잡지 못하면, 트랜잭션 로그가 ‘CDC에 의해 아직 읽히지 않았다’는 표식이 붙어, CHECKPOINT나 로그 백업을 실행해도 로그 영역이 해제되지 않게 됩니다. 로그 파일이 자동 확장하여 스토리지 용량을 고갈시키고 RDS의 자동 스토리지 확장을 강제 발동시킵니다.
確認手順
- 1
기존 테이블의 압축 절감 효과를 추정한다
参照のみ`sys.sp_estimate_data_compression_savings` 로 디스크 I/O 절감과 스토리지 비용 절감의 여력이 얼마나 되는지를 확인합니다.
- 2
log_reuse_wait_desc 로 로그 미해제의 요인을 특정한다
参照のみ`sys.databases.log_reuse_wait_desc` 가 `REPLICATION` 으로 고정되어 있지 않은지를 확인합니다. 고정되어 있는 경우는 CDC 또는 트랜잭션 레플리케이션의 지연이 의심됩니다.
- 3
CDC가 활성화되어 있는지와 캡처 지연 확인
参照のみ`sys.databases.is_cdc_enabled` 로 CDC의 활성화 상황을 확인하고, 활성화되어 있는 경우는 `sys.dm_cdc_log_scan_sessions` 로 캡처 지연을 확인합니다(상세 대해서는 관련 기사를 참조).
- 4
EBS 볼륨과 인스턴스의 IOPS/처리량 계약값 확인
参照のみ볼륨 유형(gp3/io2 등)의 Provisioned IOPS·처리량과 인스턴스 측의 EBS 대역폭 상한을 AWS 콘솔 또는 CLI로 확인합니다.
- 5
수동으로 CDC 정리를 실행한다
中하류 연동이 유지 기간 내의 데이터를 소비 완료했음을 확인한 뒤 `sys.sp_cdc_cleanup_job` 을 실행하여 로그의 해제 가능 상태를 복원합니다.
- 6
로그 파일을 축소한다
高`log_reuse_wait_desc` 가 `NOTHING` 이 된 것을 확인한 뒤 `DBCC SHRINKFILE` 으로 로그 파일을 목표 크기까지 축소합니다.
対応方法
すぐに実施できる低リスクの対応
버퍼 풀을 최대화하여 디스크 읽기를 줄인다
低스토리지의 IOPS를 유료로 높이기 전에 인스턴스 크기를 확장하여 RAM 용량을 늘리고 SQL Server의 버퍼 풀 크기를 극대화합니다. 자주 참조되는 활성 데이터가 메모리 위에 캐시된 상태를 유지할 수 있으면, EBS의 I/O 병목이 크게 완화됩니다.
수동으로 CDC 정리를 실행하여 미해제 로그를 해소한다
中정기 잡을 기다리지 않고 `sys.sp_cdc_cleanup_job` 을 실행하여 로그의 해제 가능 상태를 복원합니다. 실행 전에 하류 연동이 데이터를 소비 완료했는지 확인합니다.
事前検討が必要な変更
데이터 파일과 로그 파일을 다른 EBS 볼륨에 분리한다
中데이터 파일(무작위 I/O 중심)과 트랜잭션 로그(순차 쓰기 중심)를 동일 EBS 볼륨에 혼재하면 I/O 대기열 경쟁이 발생합니다. 반드시 다른 EBS 볼륨에 분리하여 배치합니다.
PAGE/ROW 압축을 적용하여 I/O 발생량을 절감한다
中CPU 자원에 여유가 있는 경우, 데이터 압축으로 디스크에서 읽는 블록 크기와 로그에 쓰는 크기를 절감합니다. 사전에 `sp_estimate_data_compression_savings` 로 효과를 추정한 뒤 적용합니다.
읽기 레플리카로 참조 부하를 오프로드한다
中보고 쿼리나 배치 참조 처리가 마스터 DB의 I/O 대역폭을 압박하는 경우, 참조 전용 읽기 레플리카를 구축하여 트래픽을 분산시킵니다.
CDC 정리 잡 지연을 모니터링 대상에 추가한다
低정리 잡의 실행 성공 여부와 소요 시간을 모니터링하여, 지연이 상습화되기 전에 감지할 수 있도록 합니다.
再起動・サービス影響を伴う変更
로그 파일을 DBCC SHRINKFILE으로 축소한다
高log_reuse_wait_desc 가 NOTHING 인 것을 확인한 뒤 실시합니다. 요인을 해소하지 않고 축소하면 직후 재확장합니다. 실행 중에는 I/O를 소비하여 대상에 대한 쓰기가 느려집니다.
専門家のレビューが必要な作業
Provisioned IOPS(io2 등)의 필요 여부를 워크로드 전체로 재설계한다
専門家レビュー必須버퍼 풀 최대화·데이터 압축·파일 분리를 실시해도 여전히 부족한 경우에만 검토합니다. 쉬운 증가는 월 비용을 크게 올리기 때문에, 워크로드 전체의 I/O 패턴을 분석한 뒤 전문가 리뷰를 경유하세요.
!注意事項
- DBCC SHRINKFILE의 실행은 log_reuse_wait_desc 가 NOTHING 인 것을 확인한 뒤 실시하세요. 요인이 남아 있는 상태에서 축소하면 즉시 재확장합니다.
- sys.sp_cdc_cleanup_job 으로 유지 기간을 초과한 CDC 변경 데이터를 삭제하기 전에, 하류 연동(레플리케이션 대상이나 ETL)이 해당 기간의 데이터를 아직 소비하고 있지 않은지를 확인하세요.
- Provisioned IOPS(io2 등)를 쉽게 증강하기 전에, 먼저 버퍼 풀의 최대화와 데이터 압축으로 디스크 I/O 발생량 자체를 줄일 수 없는지를 검토하세요.
- 이 기사의 압축률이나 비용 절감액의 기준은 워크로드와 데이터 내용에 따라 달라지며, 모든 환경에서 동일한 효과가 나는 것은 아닙니다.
これで解決しない場合に確認すること
EBS 볼륨의 IOPS/처리량 버스트가 고갈되지 않았는지 확인했는가
gp2/gp3의 버스트 잔량을 소진하지 않았는지를 CloudWatch 지표로 확인합니다.
인스턴스 측의 EBS 대역폭(EBS-Optimized)이 병목이 되고 있지 않은지 확인했는가
볼륨 측 IOPS를 올려도 인스턴스의 EBS 전용 대역폭 상한에 도달하면 기대한 성능은 나오지 않습니다.
CDC 정리 잡의 실행 기록과 오류를 확인했는가
정리 잡이 정기적으로 성공하고 있는지, 실패나 건너뛰기가 이어지고 있지 않은지를 잡 기록에서 확인합니다.
AWS Direct Connect의 필요 여부를 포함한 네트워크 지연 시간을 측정했는가
온프레미스 잔존 애플리케이션과 AWS 위의 DB 간 통신 지연이 다른 병목이 되고 있지 않은지를 확인합니다.
この文書の根拠と限界
実運用で確認した内容
이 기사는 Amazon EBS의 IOPS/처리량 사양, SQL Server의 CDC·DBCC SHRINKFILE의 공개 사양, 및 복수의 유사 이전 건에서 공통으로 관측되는 경향을 일반화한 기술입니다. 압축률이나 비용 절감액의 구체적인 수치는 환경에 따른 추정치이며, 특정 고객의 사례나 내부 Issue 번호는 포함하지 않습니다.
よくある質問
AWS 이전 후 디스크 I/O가 느려지는 것은 인스턴스 크기 선택 실수입니까?
반드시 그런 것은 아닙니다. 온프레미스의 물리 NVMe/SSD와 AWS의 네트워크 연결형 스토리지(EBS)는 구조 자체가 다르며, 동등 사양의 인스턴스를 선택해도 IOPS·처리량의 스로틀링에 의해 성능 상한이 생깁니다. 우선 이 구조적 차이를 반영한 설계(버퍼 풀 최대화, 파일 분리, 압축)를 검토하세요.
Provisioned IOPS(io2 등)를 늘리면 해결합니까?
해결되는 경우도 있지만 비용이 급격히 불어나기 쉬운 대응입니다. 먼저 버퍼 풀의 최대화로 디스크 읽기 자체를 줄이고, 데이터 압축으로 I/O 발생량을 절감한 뒤, 그래도 부족한 경우에만 검토할 것을 권장합니다.
CDC를 사용하지 않는데도 로그 파일이 비대해지는 경우도 동일한 대응으로 좋은가요?
`log_reuse_wait_desc` 가 `REPLICATION` 이 되는 원인은 CDC와 트랜잭션 레플리케이션 양쪽 모두 해당될 수 있습니다. 먼저 `sys.databases.is_cdc_enabled` 로 CDC의 활성화·비활성화를 확인하고, CDC를 사용하지 않는 경우는 트랜잭션 레플리케이션의 구성, 또는 일반적인 로그 파일 사용률 확인 절차를 참조하세요.
DBCC SHRINKFILE은 언제 실행해도 좋습니까?
`log_reuse_wait_desc` 가 `NOTHING` 이 된 것을 확인한 후입니다. CDC의 정리 지연이 원인인 경우는, 먼저 `sys.sp_cdc_cleanup_job` 을 실행하여 로그를 해제 가능 상태로 만들어 주세요. 데이터 파일의 축소와 로그 파일의 축소에서는 영향이 다르므로, 실시 전에 관련 기사와 비교하여 검토하세요.
この文書がカバーする質問
- 온프레미스 SQL Server를 AWS로 이전했더니 느려진 원인을 알고 싶다
- AWS 이전 후 스토리지 비용이 급등하는 이유가 알고 싶다
- CDC 때문에 로그 파일이 계속 늘어나는 경우의 대응법을 알고 싶다
リスク表示の意味
- 参照のみデータと設定を変更しません。
- 低影響は限定的ですが、権限と負荷の確認が必要です。
- 中性能・ロック・コストに影響する可能性があります。
- 高障害・データ損失・復旧作業が発生する可能性があります。
- 専門家レビュー必須本番適用前に別途レビューが必須です。
GIIPの対応範囲
‘디스크 I/O 90% 초과’와 같은 리소스 임계값의 알림만으로는, 어떤 쿼리나 처리가 I/O를 압박하고 있는지, 월당 실제로 얼마만큼의 불필요한 비용이 발생하는지는 알 수 없습니다. GIIP에서는 스토리지 I/O·IOPS 소비량·CDC 정리 잡의 실행 상황·로그 파일의 증감을 동일 시계열로 보유하여, 원인을 비용($) 기반으로 특정할 수 있도록 하고 있습니다. Provisioned IOPS의 증강과 같은 비가역적이며 고비용인 판단은, 실행 전의 SQL과 롤백 절차를 명시한 뒤 실시 가능 여부를 인간이 확인하는 운용으로 하고 있습니다.
執筆・技術検証
GIIP プロダクション運用チーム
大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。
関連サービス
AWS 이전 후 디스크 I/O 성능을 진단한다
同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。
AWS 이전 후 디스크 I/O 성능을 진단한다