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
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ı?
ç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. –'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. –
@a_horse_with_no_name Bunu 16MB’ya ayarlamayı denedim. Sonuçları rapor edecek. Bu arada bakacak başka bir şey var mı? –