为什么要在飞牛NAS上优化数据库?
飞牛NAS作为一台高性能的私有云设备,常常被用来搭建各种服务,比如网站后台、CRM系统、个人记账应用,甚至是轻量级的ERP。在这些应用中,数据库(PostgreSQL或MySQL)是性能的“心脏”。很多用户发现,NAS上跑数据库应用时,初期很流畅,但随着数据量增加,响应变慢、CPU飙升、内存吃紧。这往往不是硬件不行,而是默认配置没有针对NAS环境做优化。
NAS的硬件特点是:CPU性能一般(如N100、N305、J4125等)、内存有限(通常8GB-32GB)、存储依赖网络或SATA SSD/HDD,且I/O延迟比服务器高。如果不调整数据库参数,默认配置会假设你有充足的内存和极快的磁盘,这显然不符合NAS场景。本文将手把手教你如何对PostgreSQL和MySQL进行关键调优,让飞牛NAS上的数据库应用“飞”起来。
准备工作
在开始之前,你需要确认两件事:
- 数据库版本:在飞牛NAS的终端或SSH中执行以下命令查看。
psql --version
mysql --version
- 配置文件位置:
- PostgreSQL:通常位于
/etc/postgresql/15/main/postgresql.conf(版本号可能不同)。
- MySQL/MariaDB:通常位于
/etc/mysql/mariadb.conf.d/50-server.cnf 或 /etc/my.cnf。
建议在修改前备份原文件,例如执行 cp /etc/postgresql/15/main/postgresql.conf /etc/postgresql/15/main/postgresql.conf.bak。
PostgreSQL 调优
调整共享缓冲区(shared_buffers)
PostgreSQL的共享缓冲区用于缓存数据页,默认值通常很小(如128MB)。对于NAS,建议设置为物理内存的25%,但不要超过8GB。例如,如果你的飞牛NAS有16GB内存,可以设置为4GB。
编辑配置文件,找到 shared_buffers 行:
shared_buffers = 4GB
注意:单位可以是MB或GB,不要漏掉等号后的空格。
优化工作内存(work_mem)
work_mem 控制排序和哈希操作的内存。默认4MB太低,会导致大量磁盘I/O。建议设置为8MB-32MB,取决于并发连接数。如果你同时有10个连接,每个连接分配16MB,总内存为160MB,在可控范围内。
work_mem = 16MB
调整检查点设置
NAS的磁盘通常比服务器慢,频繁的检查点写盘会拖慢性能。适当调大 checkpoint_timeout 和 max_wal_size,减少写盘频率。
checkpoint_timeout = 30min
max_wal_size = 4GB
min_wal_size = 1GB
关闭同步提交(可选)
如果你的数据重要性不是极端高(比如不是金融交易),可以关闭同步提交,减少每次写入的磁盘等待。
synchronous_commit = off
应用配置并重启
保存文件后,执行以下命令重启PostgreSQL服务:
sudo systemctl restart postgresql
MySQL/MariaDB 调优
配置InnoDB缓冲池大小
InnoDB是MySQL默认存储引擎,缓冲池大小直接影响读写性能。同样建议设置为物理内存的50%-70%。在16GB内存的NAS上,设置为8GB。
在配置文件中找到或添加:
[mysqld]
innodb_buffer_pool_size = 8G
优化查询缓存(Query Cache)
MySQL 5.7及之前版本支持查询缓存,但高并发下反而成为瓶颈。推荐关闭它,让操作系统缓存发挥作用。
query_cache_type = 0
query_cache_size = 0
调整临时表大小
临时表默认存储在磁盘上,调大 tmp_table_size 和 max_heap_table_size 可以让更多临时表驻留在内存中。
tmp_table_size = 64M
max_heap_table_size = 64M
减少磁盘I/O:调整日志文件大小
InnoDB的redo日志文件(ib_logfile)默认较小,频繁切换会导致写盘。建议设置为缓冲池大小的25%,例如缓冲池8GB,则日志文件合计2GB,每个文件大小1GB。
innodb_log_file_size = 1G
innodb_log_files_in_group = 2
注意:修改此参数需要先停掉MySQL,删除旧的日志文件,再启动。建议在低负载时操作。
优化连接数
NAS上应用并发通常不高,默认151连接数足够,但可以适当降低,防止内存浪费。
max_connections = 50
重启MySQL
sudo systemctl restart mariadb
验证调优效果
调优后,不要急着认定成功,建议用以下方式验证:
- 查看数据库状态:PostgreSQL执行
\l+ 或查询 pg_stat_activity;MySQL执行 SHOW STATUS;。
- 监控磁盘I/O:在NAS上执行
iostat -x 1 观察 await 和 %util 是否下降。
- 运行负载测试:使用
pgbench(PostgreSQL自带)或 sysbench(MySQL常用)模拟读写,观察延迟和吞吐量。
例如,用sysbench测试MySQL:
sysbench oltp_read_write --table-size=1000000 --mysql-user=root --mysql-password=yourpassword prepare
sysbench oltp_read_write --table-size=1000000 --mysql-user=root --mysql-password=yourpassword run
常见问题与注意事项
- 如果调大内存后,系统开始使用swap(交换空间),说明给数据库的内存过多,需要适当降低。
- 不要盲目复制网上大内存服务器的配置。NAS的内存通常有限,留出1-2GB给系统和其他服务更安全。
- 修改配置文件后,务必检查语法是否正确。PostgreSQL可以用
pg_ctl reload 测试,MySQL可以用 mysqld --validate-config。
总结
在飞牛NAS上优化数据库,核心思路是“内存换性能,减少I/O”。PostgreSQL和MySQL的关键参数都围绕缓冲池、工作内存和日志策略。通过本文的调整,你的NAS数据库应用应该能显著提升响应速度,降低CPU和磁盘压力。记住,每台NAS的硬件和负载不同,建议在调整后持续观察几天,再微调参数。数据库优化不是一次性工作,而是持续改进的过程。