Skip to content
VDS · 数据库

按您的档位配置数据库内存

VDS-1…VDS-6 对应的 PostgreSQL 和 MySQL 具体缓冲区数值,以及在数据库、应用和系统之间分配内存的规则。

更新于 2026年8月23日

默认数据库设置是为了在任何环境下都能启动,而不是为了跑得快。在 8 GB 内存的 VDS-3 上,PostgreSQL 开箱即用只使用 128 MB 作为缓存——这意味着它几乎什么都从磁盘读取,尽管它本可以从内存中读取。

分配原则

大致按以下比例划分该档位的内存:

  • 系统和服务进程——10–15%;
  • 应用程序(PHP-FPM、Node、gunicorn)——按 worker 数量分配;
  • 数据库——剩下的全部,但不超过总内存的 60–70%。

绝不要把全部内存都给数据库:系统会进入 swap,NVMe 也帮不了您——延迟会增长数十倍。

当前已用内存:

free -h
ps -eo pmem,rss,comm --sort=-rss | head

一小时、一天、一周和一个月的内存图表可在面板 /hosting/vds/m/<id> 的“概览”中查看——它们显示的是真实峰值,而不是当前时刻。

PostgreSQL

/etc/postgresql/17/main/postgresql.conf:

档位shared_bufferseffective_cache_sizework_memmaintenance_work_memmax_connections
VDS-1 (2 GB)384MB1GB8MB96MB40
VDS-2 (4 GB)1GB2GB12MB256MB60
VDS-3 (8 GB)2GB5GB16MB512MB100
VDS-4 (16 GB)4GB10GB24MB1GB150
VDS-5 (24 GB)6GB16GB32MB2GB200
VDS-6 (32 GB)8GB22GB48MB2GB250

再加上通用的 NVMe 设置:

random_page_cost = 1.1
effective_io_concurrency = 200

work_mem 是按每次排序操作分配的,而不是按每个连接:一百个带复杂排序的并行查询会把它成百倍地放大。不要设置得太高。

应用方式:systemctl restart postgresql(修改 shared_buffers 必须重启)。

MySQL 和 MariaDB

档位innodb_buffer_pool_sizeinnodb_log_file_sizemax_connections
VDS-1512M128M60
VDS-21G256M100
VDS-33G512M150
VDS-48G1G200
VDS-512G1G250
VDS-618G2G300
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% 意味着数据库内存不足。

常见错误

现象原因
修改后数据库无法启动请求的内存超过了可用内存——请检查日志
进程被 OOM 杀死数据库、应用程序和系统加起来超过了该档位的内存
“优化”后反而变慢了work_mem 设置得太高,机器正在使用 swap
磁盘持续被读取缓冲区太小,工作数据集放不下

如果调整内存后仍然撞墙,问题在于数据量,而不是配置。您只能升级套餐,并按已付费期限的剩余天数按比例补差价;不支持降级,所以请慎重选择下一档位。