티어에 맞춘 데이터베이스 메모리 설정
VDS-1…VDS-6용 PostgreSQL과 MySQL의 구체적인 버퍼 값, 그리고 데이터베이스, 애플리케이션, 시스템 간 메모리 분배 규칙을 설명해요.
업데이트 2026년 8월 23일
기본 데이터베이스 설정은 어디서든 시작할 수 있도록 설계된 것이지, 빠르게 동작하도록 설계된 것이 아닙니다. 메모리 8GB의 VDS-3에서 PostgreSQL은 기본 설정으로 캐시에 128MB를 사용합니다. 즉, 메모리에서 읽을 수 있음에도 불구하고 거의 모든 것을 디스크에서 읽습니다.
메모리 할당 규칙
티어의 메모리를 대략 다음과 같이 나눕니다.
- 시스템 및 서비스 프로세스 — 10–15%;
- 애플리케이션(PHP-FPM, Node, gunicorn) — 워커 수에 따라;
- 데이터베이스 — 남은 전부, 단 전체 메모리의 60–70%를 넘지 않도록.
데이터베이스에 메모리를 전부 주지 마세요. 시스템이 스왑에 들어가고, NVMe도 도움이 되지 않습니다. 지연 시간이 수십 배로 늘어납니다.
현재 사용 중인 양:
free -h
ps -eo pmem,rss,comm --sort=-rss | head
1시간, 1일, 1주, 1개월의 메모리 그래프는 제어판 /hosting/vds/m/<id>의 "개요"에서 볼 수 있습니다. 현재 순간이 아니라 실제 피크를 보여줍니다.
PostgreSQL
/etc/postgresql/17/main/postgresql.conf:
| 티어 | shared_buffers | effective_cache_size | work_mem | maintenance_work_mem | max_connections |
|---|---|---|---|---|---|
| VDS-1 (2 GB) | 384MB | 1GB | 8MB | 96MB | 40 |
| VDS-2 (4 GB) | 1GB | 2GB | 12MB | 256MB | 60 |
| VDS-3 (8 GB) | 2GB | 5GB | 16MB | 512MB | 100 |
| VDS-4 (16 GB) | 4GB | 10GB | 24MB | 1GB | 150 |
| VDS-5 (24 GB) | 6GB | 16GB | 32MB | 2GB | 200 |
| VDS-6 (32 GB) | 8GB | 22GB | 48MB | 2GB | 250 |
추가로 일반적인 NVMe 설정입니다.
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem은 연결당이 아니라 정렬 작업당 할당됩니다. 복잡한 정렬을 수행하는 병렬 쿼리 100개가 있으면 이 값이 수백 배로 늘어납니다. 너무 높게 설정하지 마세요.
적용: systemctl restart postgresql (shared_buffers를 변경하려면 반드시 재시작해야 합니다).
MySQL 및 MariaDB
| 티어 | innodb_buffer_pool_size | innodb_log_file_size | max_connections |
|---|---|---|---|
| VDS-1 | 512M | 128M | 60 |
| VDS-2 | 1G | 256M | 100 |
| VDS-3 | 3G | 512M | 150 |
| VDS-4 | 8G | 1G | 200 |
| VDS-5 | 12G | 1G | 250 |
| VDS-6 | 18G | 2G | 300 |
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 2000
버퍼 풀이 핵심 파라미터입니다. 작업 데이터 세트가 여기에 들어가면 디스크를 거의 읽지 않습니다.
효과 확인
SELECT sum(blks_hit)*100/sum(blks_hit+blks_read) FROM pg_stat_database;
MySQL의 경우 SHOW ENGINE INNODB STATUS와 Innodb_buffer_pool_reads 대 Innodb_buffer_pool_read_requests의 비율을 확인하세요. 캐시 적중률이 95% 미만이면 데이터베이스에 메모리가 부족한 것입니다.
흔한 실수
| 증상 | 원인 |
|---|---|
| 수정 후 데이터베이스가 시작되지 않음 | 사용 가능한 것보다 많은 메모리를 요청함 — journal을 확인하세요 |
| 프로세스가 OOM으로 종료됨 | 데이터베이스, 애플리케이션, 시스템의 합계가 티어의 메모리를 초과함 |
| "최적화" 후 느려짐 | work_mem이 너무 높게 설정되어 머신이 스왑 중임 |
| 디스크를 계속 읽음 | 버퍼가 너무 작아 작업 세트가 들어가지 않음 |
메모리를 튜닝한 후에도 여전히 한계에 부딪힌다면, 문제는 설정이 아니라 데이터의 양입니다. 유료 기간의 남은 일수에 대해 일할 계산한 결제로 플랜을 업그레이드하는 것만 가능하며, 다운그레이드는 제공되지 않으니 다음 티어를 신중하게 선택하세요.