Postgresql 在CentOS上导致交换的Postgres

Postgresql 在CentOS上导致交换的Postgres,postgresql,swap,Postgresql,Swap,全部, 我正在用Postgresql 8.4运行CentOS 6.0,似乎不知道如何防止发生如此多的磁盘交换。我有12千兆内存和4个处理器,我正在做一些简单的更新(一次一个表)。有一分钟,我认为我出错的脚本中并行发生的插入导致了大量内存使用,但当我看到简单的更新也导致了内存使用时,我基本上放弃了,决定寻求帮助 我把conf文件粘贴在这里 您可以看到,我将缓冲区设置得相对较低,而连接量设置得较高。如果我将共享缓冲区设置为高于64兆,DB服务将不会启动。有人知道是什么原因让我这么做的吗 谢谢, 亚当

全部,

我正在用Postgresql 8.4运行CentOS 6.0,似乎不知道如何防止发生如此多的磁盘交换。我有12千兆内存和4个处理器,我正在做一些简单的更新(一次一个表)。有一分钟,我认为我出错的脚本中并行发生的插入导致了大量内存使用,但当我看到简单的更新也导致了内存使用时,我基本上放弃了,决定寻求帮助

我把conf文件粘贴在这里

您可以看到,我将缓冲区设置得相对较低,而连接量设置得较高。如果我将共享缓冲区设置为高于64兆,DB服务将不会启动。有人知道是什么原因让我这么做的吗

谢谢,
亚当

Centos 6似乎默认了一个非常保守的shmmax 将共享缓冲区设置为

要进行实验,您可以(作为root用户)使用sysctl-w kernel.shmmax=n
其中n是postgres在启动时尝试分配的启动错误消息的值。当您确定要永久使用的值,然后在/etc/sysctl.conf中设置该值时,如果要进行交换,则增加共享_缓冲区会使问题变得更糟;您将从即将用完的部件中取出RAM并进行交换,而不是将内存专用于数据库缓存。就一般原理和以后的调优工作而言,修复SHMMAX等是值得的,但这无助于解决这个问题

猜测你的记忆吞噬源的身份是一件糟糕的事情。查看来自“top-c”和ps的数据,找出哪些进程使用了大量的数据,这要好得多。一个非常糟糕的查询可能会消耗比它应该消耗的更多的内存。如果您看到运行某个东西的PostgreSQL进程的内存使用突然增加,请对照pg_stat_表中的信息检查进程ID,以查看它在做什么

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

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


而有效io并发=1000对于地球上的任何硬件来说都太高了。这方面的有用值是服务器中磁盘数量的小倍数。我不知道当你把它设置到这么高的时候,内存使用会发生什么,但是在这个范围内,它并没有得到很好的测试。正常设置更像1到25。在中概述的参数比实际情况重要得多;并发值仅影响一种特定类型的表扫描。

必须与CentOS配置一致。共享缓冲区可以轻松设置为512MB,4GB也不是闻所未闻。你应该张贴错误消息,你得到如果你超过64MB这里你去。。。我在这里遵循了Postgresql推荐的设置,但它仍然可以交换。你能提供你过度使用交换的证据吗?谢谢Gavin!我把所有的东西都增加到了4个Gig,仍然在经历大量的光盘交换。我将共享缓冲区大小增加到2 Gig,服务确实启动了,但它没有解决手头的问题。您是如何看到/确定交换正在进行的?@不,我正在使用top-cAbsolutely奇妙的writeup查看几乎实时发生的交换,先生!我以此为出发点,显然在配置上做得太过火了。