
我们部署一套高并发写入型的PostgreSQL系统到香港机房之后,最先遇到的瓶颈并不是网络、CPU或内存,而是磁盘I/O性能。特别是在执行大量并发写入、事务提交密集的OLTP场景时,传统的EXT4默认参数与I/O调度策略远远不能满足业务的低延迟、高吞吐要求。为此,我系统性地优化了底层块设备的I/O调度器与EXT4挂载参数,使写入吞吐从默认状态提升了接近2倍,极大缓解了系统写入压力。
下面我将完整分享这一套实践方案,覆盖内核调度策略选择、EXT4挂载参数优化、PostgreSQL写入参数调整以及验证效果的测试方法。
一、环境说明
- 服务器位置:香港沙田高性能机房
- 操作系统:Ubuntu 22.04 LTS
- 磁盘设备:PCIe Gen4 NVMe SSD(支持多队列)
- 文件系统:EXT4
- 数据库版本:PostgreSQL 15
- 场景类型:高并发写入(500+ TPS)、周期性批量更新、主从同步
二、优化目标与瓶颈识别
在未优化前,通过pgbench工具压测,系统在QPS突破400时明显出现write latency抖动,iowait升高,vmstat显示磁盘队列变长。
iostat -x 1
# r/s, w/s较高时await持续上升
问题初判为I/O调度器与EXT4参数不合理,导致调度排队、fsync操作延迟大幅抖动。
三、I/O调度器优化
3.1 查看当前I/O调度器
cat /sys/block/nvme0n1/queue/scheduler
# 多数系统默认是 [none] 或 [mq-deadline]
3.2 选择调度策略
在NVMe设备上,传统的 cfq/deadline 并不适用。推荐选择:
- none:无调度,交由设备自调度(适合现代NVMe,PostgreSQL重度fsync场景)
- mq-deadline:多队列优化的deadline调度器(更适合HDD或SATA SSD)
实测结果显示,在我们的PCIe NVMe设备上使用 none 可以显著降低fsync延迟。
3.3 设置永久I/O调度策略
通过udev规则实现:
cat > /etc/udev/rules.d/60-ioscheduler.rules <<EOF
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
EOF
udevadm control --reload
重启后生效。
四、EXT4挂载参数优化
4.1 原始挂载方式(默认):
UUID=xxxx /data ext4 defaults 0 2
4.2 优化参数说明
- noatime: 禁用访问时间更新,减少写入
- barrier=0: 关闭write barrier,提高吞吐(但需UPS供电保障)
- data=writeback: 最大写入并发性能,但降低一致性保障
- journal_async_commit: 异步提交日志,加速事务写入
- commit=100: 延迟提交时间,增加吞吐量
4.3 优化后的挂载方式
UUID=xxxx /data ext4 defaults,noatime,barrier=0,data=writeback,journal_async_commit,commit=100 0 2
重新挂载:
mount -o remount /data
五、PostgreSQL参数配套调整
配合文件系统优化,我们需要适当调整数据库写入相关参数。
# postgresql.conf 优化建议
synchronous_commit = off # 异步提交,加速写入
wal_writer_delay = 10ms # 提高写入频率
commit_delay = 10000 # 增加批处理机会
wal_compression = on # 降低磁盘写入压力
checkpoint_completion_target = 0.9 # 拉长检查点写入周期
此外,开启UNLOGGED表或逻辑分区也能在特定场景提升写入性能。
六、实测对比结果
测试方式
使用pgbench模拟500并发连接,每个事务包含10个更新语句,持续压测300秒。
pgbench -c 500 -j 32 -T 300 -N
测试数据
| 优化阶段 | TPS(平均) | fsync延迟(P95) | iowait |
|---|---|---|---|
| 默认配置 | 385 | 15ms | 高 |
| 调度器=none | 467 | 9ms | 中 |
| EXT4参数优化 | 566 | 5ms | 低 |
| PG配置调整后 | 648 | 3ms | 极低 |
七、注意事项与风险控制
- 使用 barrier=0 + data=writeback 存在一致性风险,必须搭配UPS/RAID写缓存保护。
- synchronous_commit = off 会导致事务在崩溃时丢失最后一批提交,需评估业务容忍度。
- 线上环境请先在备库或测试环境验证,逐步灰度推进。
我们通过底层块设备的I/O调度器调整与EXT4挂载参数精细化优化,将PostgreSQL在香港服务器上的高并发写入性能大幅提升,避免了盲目扩容带来的资源浪费。实践证明,很多性能瓶颈其实隐藏在系统的“底层细节”中,理解这些细节、合理调优,比盲目加硬件要高效得多。对于类似部署在香港的数据密集型系统而言,这一方案具备很强的通用性与可复制性。











