Stefan Fercot:PostgreSQL临时文件的内存磁盘
内容提要
在调试CREATE INDEX操作的性能问题时,发现并行查询可能会产生临时文件,通过将临时文件移动到内存中的tmpfs目录,可以加快索引创建速度。调整tmpfs大小可以提高系统性能。
延伸解读
并行查询与临时文件的关系
文章指出,PostgreSQL 在执行并行查询(包括并行索引创建)时,每个工作进程有独立内存,可能因排序或哈希表而使用磁盘临时文件。即使提高 maintenance_work_mem 至 2GB,临时文件依然存在,因为并行工作进程的内存限制独立。禁用并行查询后临时文件消失,但创建时间与使用并行时相近(约4.3秒 vs 4.5秒),说明并行并非总是更快。
将临时文件移至 tmpfs 的配置步骤
要利用内存加速临时文件,需创建表空间并挂载 tmpfs。步骤包括:创建目录 /var/pgsql_tmp,执行 CREATE TABLESPACE tbstmp LOCATION '/var/pgsql_tmp',然后在 /etc/fstab 中添加 tmpfs 挂载项,指定大小(如 size=2G)和属主。之后通过 SET temp_tablespaces TO 'tbstmp' 使临时文件使用内存目录。注意,需重新加载 systemd 并挂载,且表空间子目录需持久化以避免重启后重建。
性能提升与持久化设置
配置 tmpfs 后,重新创建索引的耗时从约4.5秒降至约3.9秒,提升明显。若要使更改对所有临时文件永久生效,可执行 ALTER SYSTEM SET temp_tablespaces TO 'tbstmp' 并重载配置。通过查询 pg_settings 可确认设置已生效。但需注意,tmpfs 大小应根据系统内存容量和需求调整,避免内存耗尽影响系统稳定性。
Q&A
如何提高PostgreSQL的索引创建速度?
通过将临时文件移动到内存中的tmpfs目录,可以加快索引创建速度。
在PostgreSQL中,如何配置tmpfs目录?
需要创建一个表空间并将其位置设置为tmpfs目录,然后通过ALTER SYSTEM设置temp_tablespaces使其生效。
调整maintenance_work_mem的大小有什么效果?
尝试调整maintenance_work_mem的大小以消除临时文件,但未能成功。
禁用并行查询执行对临时文件有什么影响?
禁用并行查询执行后,临时文件消失,创建时间略有减少。
如何使tmpfs配置对所有临时文件永久生效?
通过ALTER SYSTEM设置temp_tablespaces,可以使该更改对所有临时文件永久生效。
调整tmpfs大小对系统性能有什么影响?
根据系统容量和需求调整tmpfs大小,可以提高性能。