Postgres导致CentOS交换

时间:2011-10-11 19:25:16

标签: postgresql swap

所有

我正在使用Postgresql 8.4运行CentOS 6.0,似乎无法弄清楚如何防止这么多的磁盘交换发生。我有12演出的RAM和4个处理器,我正在做一些简单的更新(一次1个表)。我想了一下,从我错误的脚本并行发生的插入导致了大量的内存使用,但是当我看到简单的更新导致它时,我基本上已经放弃了,并决定寻求帮助。

我在这里粘贴了conf文件。 http://pastebin.com/e0jdBu0J

您可以看到我将缓冲区设置得相对较低且连接数量很高。如果我将共享缓冲区设置为高于64兆,则DB服务将无法启动。任何人都知道这对我有什么影响吗?

谢谢, 亚当

2 个答案:

答案 0 :(得分:8)

如果您要进行交换,增加shared_buffers会使问题变得更糟;你将从正在耗尽和交换的部分中取出RAM,而不是将内存专用于数据库缓存。仅仅根据一般原则和稍后调整工作来修复SHMMAX等是值得的,但这对这个问题没有帮助。

猜测你的记忆狼吞虎咽的来源是一个废话。从“top -c”和ps查看数据以查找哪些进程正在使用大量数据要好得多。一个非常糟糕的查询可能会消耗比它应有的更多内存。如果你看到运行某些东西的PostgreSQL进程的内存使用量增加,请根据pg_stat_tables中的信息检查进程ID,看看它在做什么。

有几件事可能导致这类问题经常让人感到惊讶。如果您在单个事务中执行大量行更新,并且涉及外键检查或触发器,则可能会耗尽内存。在每种情况下要检查的事物队列都保存在RAM中,并且可能非常大。

您的PostgreSQL设置有两个可能相关的问题。如果您拥有比服务器中的核心更多的活动连接,则数据库实际上不能很好地工作;最佳性能通常是每个核心2到3个活动客户端。一旦你有超过几百个连接,各种各样的事情都会出错。有一些连接^ 2行为在性能方面变得丑陋,并且也存在一些内存问题。如果你真的需要1250个连接,你应该使用连接池,如pgBouncer或pgpool-II。

而且对于地球上的任何硬件来说,effective_io_concurrency = 1000都太高了。有用的值,在服务器中有多少个磁盘的小数倍。我不知道当你将它设置得那么高时,内存使用会发生什么,但是在那个范围内它没有得到很好的测试。正常设置更像是1到25. Tuning Your PostgreSQL Server中列出的参数比它更重要;并发值仅影响一种特定类型的表扫描。

答案 1 :(得分:1)

Centos 6似乎有一个非常保守的shmmax作为默认值 将共享缓冲区设置为postgres tuning resources

建议的缓冲区

请参阅for explanation and how to set

要进行实验,您可以(以root身份)使用sysctl -w kernel.shmmax = n 其中n是postgres在启动时尝试分配的启动错误消息的值。当您确定要永久使用的值时,请在/etc/sysctl.conf

中进行设置