所有
我正在使用Postgresql 8.4运行CentOS 6.0,似乎无法弄清楚如何防止这么多的磁盘交换发生。我有12演出的RAM和4个处理器,我正在做一些简单的更新(一次1个表)。我想了一下,从我错误的脚本并行发生的插入导致了大量的内存使用,但是当我看到简单的更新导致它时,我基本上已经放弃了,并决定寻求帮助。
我在这里粘贴了conf文件。 http://pastebin.com/e0jdBu0J
您可以看到我将缓冲区设置得相对较低且连接数量很高。如果我将共享缓冲区设置为高于64兆,则DB服务将无法启动。任何人都知道这对我有什么影响吗?
谢谢, 亚当
答案 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
中进行设置