Postgres DISK IO 非常高。我该怎么做才能立即降低它?

Postgres DISK IO 非常高。我该怎么做才能立即降低它?

我知道比我正在使用的磁盘更快的磁盘会有所帮助,但这将需要更长的时间,我正在尝试使用一些紧急措施来减少磁盘 IO。atop 几乎一直在红色上报告 DSK 使用情况。这是针对 postgres 8.3 的。

我的 shared_buffers 设置为 24MB,但服务器有 16GB 的 RAM,尚未充分利用。我的第一个想法是为数据库提供尽可能多的 RAM,但我不确定如何做到这一点(这是一个专用的数据库服务器)。

任何不需要重新启动的解决方案都是更好的,但我会采取目前我能得到的解决方案。

谢谢!

答案1

24MB shared_buffers 设置是保守的默认值,我认为对于具有 16GB RAM 的专用数据库,它需要更高。但是,是的,您必须重新启动服务器才能调整其大小。http://wiki.postgresql.org/wiki/Performance_Optimization是性能配置指南的一个很好的起点。将 shared_buffers 设置为 4GB 或 6GB 似乎更合理。

请注意,在 Linux 上,您需要调整 kernel.shmmax sysctl 设置(在 /etc/sysctl.conf 中或只需写入 /proc/sys/kernel/shmmax)以分配这么大的共享内存块。如果不这样做,您将收到一个错误,指出请求了多少内存,您必须将 kernel.shmmax 设置为高于该值。

由于您有大量内存,您可能还会考虑将默认的 work_mem 设置得更高,这将使诸如排序和哈希(group/order/distinct 等)之类的操作倾向于在内存中工作,而不是使用临时文件。您无需重新启动服务器即可执行此操作,只需更新配置文件,重新加载服务即可新的会话将获得新的设置。会话的默认工作内存为 1MB,您可以计算一次可以使用的最大内存,work_mem * max_client_connections并估计会产生什么影响。

您还应该增加effective_cache_size来向规划器表明内核FS层很可能在postgresql的共享缓冲区之外的内存中缓存大量页面。

等等。希望这能给你带来好的开始。

答案2

使用以下方法重新挂载磁盘诺亚泰

答案3

除了此处给出的建议之外,您可能还想查看自动清理设置。默认情况下,它会在大约 50 次更新后触发,如果您的数据库正在进行大量更新/插入,这可能会触发不必要的清理语句,从而产生大量 IO。

答案4

如果postgresql的diskio很高,你应该检查正在运行的语句,特别是对于执行“磁盘排序”的语句,并设置适当的索引。

只要谷歌一下“Postgresql 性能调优”,你就会找到足够的信息来指导你如何开始。

相关内容