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