2011-10-11 51 views
0

所有,Postgres的交換導致在CentOS

我運行CentOS的6.0 PostgreSQL的8.4和似乎無法弄清楚如何防止這麼多的盤交換的發生。我有12演出的RAM和4個處理器,我正在做一些簡單的更新(每次一張表)。我想了一會兒,從我錯誤的腳本中並行發生插入導致大量內存使用,但當我看到簡單更新導致它時,我基本上扔了毛巾,並決定尋求幫助。

我在這裏粘貼了conf文件。 http://pastebin.com/e0jdBu0J

你可以看到我設置的緩衝區相對較低,連接數量很高。如果我將共享緩衝區設置爲高於64兆,那麼數據庫服務將不會啓動。任何人有一個想法可能是什麼原因導致我?

感謝, 亞當

+0

必須是你的CentOS配置。共享緩衝區可以很容易地設置爲512MB,並且4GB不是沒有聽說過的。你應該發佈你得到的錯誤信息,如果你超出64MB –

+0

這裏雅去... http://pastebin.com/FsyawN3S我跟着Postgresql推薦的設置在這裏http://www.postgresql.org/docs/8.4 /static/kernel-resources.html,但它仍然交換。 – aeupinhere

+0

這是我的/etc/sysctl.conf文件。 http://pastebin.com/TUMcPequ – aeupinhere

回答

8

如果你要進入交換,增加shared_buffers會使問題變得更糟;你將會把RAM從運行和交換部分拿走,而不是將內存專用於數據庫緩存。這是值得修正的SHMMAX等只是在一般原則和後來的調整工作,但這不會幫助解決這個問題。

猜測你的記憶吞噬源的識別是一個廢話。最好從「top -c」和ps查看數據,以查找哪些進程正在使用大量進程。對於一個非常糟糕的查詢來說,它可能會消耗更多內存。如果你看到內存使用量激增,以運行一些PostgreSQL進程,請檢查進程ID與pg_stat_tables中的信息,看看它在做什麼。

有幾件事情會導致這類問題,這往往讓人感到驚訝。如果您在單個事務中執行大量行更新,並且涉及外鍵檢查或觸發器,則可能會導致內存不足。在每個這種情況下檢查的事情隊列都保存在RAM中,並且可能會非常大。

PostgreSQL設置有兩個可能相關的問題。如果您的活動連接數多於服務器中的內核數量,那麼數據庫實際上並不會很好地工作;最佳性能通常是每個核心有2到3個活動客戶端。一旦你有超過幾百個連接,各種各樣的事情就會出錯。有一些連接^ 2的行爲在性能方面變得很糟糕,並且也有一些內存問題。如果你真的需要1250個連接,你應該使用連接池,比如pgBouncer或者pgpool-II。

對於地球上的任何硬件,effective_io_concurrency = 1000都太高了。有用的值是你在服務器中有多少個磁盤的一小部分。我不知道會發生什麼情況,只要將內存使用量設置得很高,但在該範圍內測試得並不好。正常設置更像1到25.在Tuning Your PostgreSQL Server列出的參數比它重要得多;併發值僅影響一種特定類型的表掃描。

+0

絕對精彩的寫作,先生!我以此爲出發點,顯然在配置上過於沉悶。 http://thesteve0.wordpress.com/2011/01/25/quick-note-on-tuning-postrgres/ – aeupinhere

1

CentOS 6的似乎有一個非常保守SHMMAX作爲違約postgres tuning resources

看到for explanation and how to set建議 設置你的共享緩衝區了這一點。

要實驗,您可以(以root用戶身份)使用sysctl -w kernel.shmmax = n 其中n是postgres在啓動時嘗試分配的啓動錯誤消息的值。當你確定你希望永久使用的值時,將其設置在/etc/sysctl.conf中。

+0

謝謝加文!我把所有東西都湊成了4個演出,並且仍然在光盤上進行了很多交換。我將共享緩衝區大小增加到2個演出,並且服務確實啓動了,但它沒有解決問題。 – aeupinhere

+0

Howe你看到/確定交換正在進行嗎? – nos

+0

@nos我正在尋找交換髮生在接近實時使用頂部-c – aeupinhere