vol*_*mar 3 postgresql performance profiling
我的Postgres在负载(500MB)下达到最大允许内存并运行14个进程.一旦加载结束,Postgres仍然保留分配的内存并运行14个进程.由于我在同一台机器上运行Apache和Tomcat,我想Postgresql释放分配的内存.可能吗?
谢谢!
基本上,您需要以两种方式查看系统内存,尤其是Postgres内存.
第一个是运行应用程序所需的内存.这实际上是所有应用程序在生产中运行时的静态内存负载.如果在所需负载下没有足够的内存,则说明内存不足.现代系统可以在"危机"时使用交换,但仅此而已.简单地说,如果你使用交换,你会遇到内存危机,你应该希望它很快消失.
一旦拥有应用程序所需的基本内存,所有剩余的系统内存基本上都专用于磁盘缓存.
使用托管Postgres的系统,您有两种磁盘缓存.你有内核文件系统缓存,你有Postgres内部缓存.
Postgres内部缓存不会被释放.这不是它的工作原理.你在配置中告诉它,它可以使用XXX量的RAM用于它的目的,它会保留它.在这种状态下,Postgres并不关心系统上还有什么.
如果缓存是内核缓存,并且文件系统活动突然出现不是Postgres,那么内核将缓存最近的页面并刷新旧页面.内核缓存将看到整个系统,而Postgres只看到DB活动.
所以.
在Postgres世界观中,内核缓存与它的缓冲区缓存竞争.考虑这种情况.Postgres要求一块磁盘.内核抓取阻塞并缓存它.与此同时,Postgres抓取从内核中取出该块,并缓存它.现在,该块被冗余地缓存.如果内核更好地使用该缓存内存块,它会将其刷新到Postgres块中,然后加载新块.同时,Postgres将在其内部缓存中保留该块.
如果你有一台专门的Postgres机器,那么没有什么理由可以有很多内核缓存.由于所有磁盘I/O都是Postgres I/O,因此内核缓存比Postgres缓存冗余且效率低.当Postgres缓存一个块时,它必须封送字节,更新它的内部结构以及它所做的任何其他事情.缓存后,它不再需要执行任何操作.因此,以这种方式,Postgres缓存的块比内核缓存的块更有效,因为将块从内核缓存移动到Postgres有一些费用.
但是,如果你有一个混合使用的机器,那么内核和Postges缓存必须要解决它.如果你有一个足够小的数据库,可以将大部分日常操作数据放入RAM中,那么你应该有足够的缓冲空间来处理Postgres中的内存,因此大部分操作都来自内存.以这种方式,Postgres将加载其正常的"忙"页面一次,并缓存它们,然后再也不要向内核询问它们.完成后,内核可以使用其缓冲区缓存来处理所有辅助的其他系统请求.
在另一个极端,你给Postgres很少的专用缓冲区缓存,并且它只依赖于内核缓存.通过这种方式,每次来自内核缓存的每个块都要贵一些,但它每次都比从磁盘读取它要便宜得多.通过这种方式,内核可以判断哪些进程更值得缓存注意.
在实践中,为Postgres决定一个良好的操作稳定状态并将其留在那里.任何活动高峰(比如报表或其他任何内容的大表扫描)都会被内核缓存减轻,当峰值结束时,内核可以恢复该内存以供其他用途使用.
所以,底线,Postgres不会回馈任何记忆.只要你付出尽可能多的奉献精神.
| 归档时间: |
|
| 查看次数: |
4279 次 |
| 最近记录: |