2015-04-07 22 views
11

Postgres 9.1.15'i çalıştıran bir sunucum var. Sunucuda 2GB RAM ve takas yok. Zaman zaman Postgres bazı SELECT'lerde "bellek yetersiz" hatalarını almaya başlayacak ve PostGres veya 'a bağlı olan istemcilerin bazılarını yeniden başlatana kadar devam edecek. Garip olan şu ki, bu durumda, free hala 500 MB'lık boş bellek olduğunu bildiriyor.Postgres boş belleğe sahip olmasına rağmen bellek hatalarından kurtulur

select version();:

PostgreSQL 9.1.15 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit 

uname -a:

max_connections = 100 
shared_buffers = 500MB 
work_mem = 2000kB 
maintenance_work_mem = 128MB 
wal_buffers = 16MB 
checkpoint_segments = 32 
checkpoint_completion_target = 0.9 
random_page_cost = 2.0 
effective_cache_size = 1000MB 
default_statistics_target = 100 
log_temp_files = 0 

ben pgtune gelen bu değerleri var (I:

Linux db 3.2.0-23-virtual #36-Ubuntu SMP Tue Apr 10 22:29:03 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux 

postgresql.conf (her şey/default dışarı yorum) "karışık uygulama türlerini" seçti ve wi uğraşıyor Onları okuduklarımdan çok, gerçek bir ilerleme kaydetmeden. Şu anda tipik bir sayı olan 68 bağlantı var (henüz pgbouncer kullanmam veya başka bir bağlantı havuzu kullanıyorum).

/etc/sysctl.conf

:

OOM katil Postgres sunucusu öldürdü sonra ilk bir iki hafta önce yaklaşık 2 overcommit_memory değişti
kernel.shmmax=1050451968 
kernel.shmall=256458 

vm.overcommit_ratio=100 
vm.overcommit_memory=2 

. Bundan önce sunucu uzun süre iyi çalışıyordu. Şimdi aldığım hatalar daha az felaket ama daha da sıkıcı çünkü onlar çok daha sık oluyorlar.

Ben "bellek yetersiz" çalışmasına postgres neden ilk etkinliği saptayarak pek şanslı değil - her seferinde farklı gibi görünüyor. Bu düşene En son kez günlüğe ilk üç satır vardı:

2015-04-07 05:32:39 UTC ERROR: out of memory 
2015-04-07 05:32:39 UTC DETAIL: Failed on request of size 125. 
2015-04-07 05:32:39 UTC CONTEXT: automatic analyze of table "xxx.public.delayed_jobs" 
TopMemoryContext: 68688 total in 10 blocks; 4560 free (4 chunks); 64128 used 
[... snipped heaps of lines which I can provide if they are useful ...] 

--- 

2015-04-07 05:33:58 UTC ERROR: out of memory 
2015-04-07 05:33:58 UTC DETAIL: Failed on request of size 16. 
2015-04-07 05:33:58 UTC STATEMENT: SELECT oid, typname, typelem, typdelim, typinput FROM pg_type 
2015-04-07 05:33:59 UTC LOG: could not fork new process for connection: Cannot allocate memory 
2015-04-07 05:33:59 UTC LOG: could not fork new process for connection: Cannot allocate memory 
2015-04-07 05:33:59 UTC LOG: could not fork new process for connection: Cannot allocate memory 
TopMemoryContext: 396368 total in 50 blocks; 10160 free (28 chunks); 386208 used 
[... snipped heaps of lines which I can provide if they are useful ...] 

--- 

2015-04-07 05:33:59 UTC ERROR: out of memory 
2015-04-07 05:33:59 UTC DETAIL: Failed on request of size 1840. 
2015-04-07 05:33:59 UTC STATEMENT: SELECT... [nested select with 4 joins, 19 ands, and 2 order bys] 
TopMemoryContext: 388176 total in 49 blocks; 17264 free (55 chunks); 370912 used 

bundan önce kazasında, bir kaç saat önce, kazadan hemen ilk üç çizgiler olarak son sorgunun üç örneği vardı. Bu sorgu çok sık koþulur, bu yüzden sorunlar, çünkü o sadece hata günlüğünde gelirse bu sorgunun çünkü ya makul karmaşık SEÇ her zaman çalıştırmak alıyorum eğer emin değilim. ,

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 15956 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 15956 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 
Deneyip bir çökme var free sonraki zaman kesin rakamları elde edersiniz

: http://explain.depesz.com/s/r00

Bu ulimit -a postgres'in kullanıcı neye benzediği: O burada bunun analiz etmek, açıklamak diyordum Bu arada bu sahip olduğum tüm bilgilerin bir braindump.

Buradan nereye gideceğiniz hakkında herhangi bir fikir var mı?

+0

çekirdeği ayrılmış eğer süreçlere bellek söz vardır AFAIK 50'ye overcommit_ratio ayarlamalısınız. Bu, yazım denetleyicisinden yazılan kopyalanan bellek bölgelerini 'fork() içerir. Bu yüzden bellek şu anda bir sürecin adres alanına eşlenmemiş olma anlamında özgür olsa bile, işlenir. Bence. Burada tamamen el sallıyor olabilirim. Ayrıca, paylaşılan belleğin muhasebesi ile ilgili kernel'in tuhaflığının söz konusu olması da mümkündür. –

+1

'maintenance_work_mem = 128MB' bellek kısıtlamalarınız nedeniyle oldukça büyük görünüyor. Otomatik bir analiz başladığında problemin ortaya çıkması, bu parametrenin çok büyük olduğunu da gösterir. –

+0

@a_horse_with_no_name Bunu 16MB’ya ayarlamayı denedim. Sonuçları rapor edecek. Bu arada bakacak başka bir şey var mı? –

cevap

2

Hata yükseldiğinde herhangi bir takas belleği olup olmadığını kontrol edebilir misiniz?

Linux masaüstümdeki takas belleğini tamamen siliyorum (sadece başka şeyleri test etmek için ...) ve aynı hatayı aldım! Eminim ki bu senin de neler olduğuyla ilgili.

+0

Bu mesajı aldım ve bende de takas var. Bu hatanın nedeni olabilir mi? – alfonx

3

Sadece geri çalışan bir ~ 2.5 GB düz metin SQL dosyası ile aynı sorun koştum. Digital Ocean sunucumu 64 GB RAM'e kadar ölçeklendirdim, 10 GB'lık bir takas dosyası oluşturdum ve tekrar denedim. 50 GB boşta bir bellek yetersizliği hatası ve kullanımda bir takas yok.

Ben (yeniden başlatma gerektirir) kullanıyordum küçük 1 GB örneğine benim sunucuyu geri ölçekli ve ben sinirli olduğundan daha ben bunu başka bir nedenle bir şans daha vermeye karar verdim. İthalata başladım ve geçici takas dosyamı tekrar oluşturmayı unuttum.

İçeri aktarmanın ortasında oluşturdum. psql, çökmeden önce daha lot yaptı. 5 ek tablo ile yaptı.

Psql'de bir bellek ayırma hatası olması gerektiğini düşünüyorum.

1

Paylaşılan_buffers boyutunuzla aynı boş bellek boyutunu bildirmeniz biraz şüpheli. Doğru değerleri aradığına emin misin? kilitlenme sırasında

Çıktı free komutunun yanı sıra içerik yararlı olacağını/proc/meminfo

sen Olacak overcommit_ratio için 100. görürseniz 2'ye overcommit_memory ayarı kadar etkili olmadığını dikkat temelde bellek paylaşımını boyut takasına (bu durumda 0) ve fiziksel belleğin% 100'ünü sınırlar; bu, paylaşılan bellek ve disk önbellekleri için herhangi bir alanı hesaba katmaz.

Muhtemelen onlar asla kullanmak için gidiyoruz bile

+0

Sanırım bu, soruyu nasıl yazdığımda bir tesadüf. Zor bir değerden ziyade, 500MB'den daha fazla serbestti ("bellek yığınları" gibi). Yani, bence bu 'overcommit_ratio' üzerinde iyi bir nokta - bununla uğraşacak. –

İlgili konular