dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/PostgreSQL/Hata Kodları (Errors)/postgresql-could-not-resize-shared-memory
[Teşhis]PostgreSQL PG 14 - 17Advanced
6 dk okuma

PostgreSQL "could not resize shared memory segment" Çözümü

PostgreSQL "could not resize shared memory segment" — Bellek Nerede Bitiyor?

Yazar / Standart:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
ERROR: could not resize shared memory segment: No space left on device
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

plaintext
ERROR: could not resize shared memory segment "/PostgreSQL.24167" to 1048576 bytes: No space left on device

Mesaj "no space left on device" der ve insanı disk arızalarına yönlendirir. Oysa burada dolan şey disk değil, paylaşımlı bellek (`/dev/shm`). Bu hata özellikle konteyner ortamlarında patlar: Docker varsayılan olarak /dev/shm için 64 MB ayırır ve paralel sorgular bu alanı hızla tüketir.

Hatanın ikinci varyantı:

plaintext
ERROR: out of memory DETAIL: Failed on request of size 1048576.

Bu ise palloc başarısız olduğunda görülür — yani süreç gerçekten RAM bulamıyordur. İki mesajı karıştırmamak gerekir: birincisi paylaşımlı bellek (/dev/shm), ikincisi süreç sanal belleğidir.


▸Nedeni ayırt eden kontrol

Konteyner içinde şunu çalıştırın:

bash
df -h /dev/shm

Çıktı 64M ise tanı kesindir.


▸Adım adım çözüm

1. Konteyner `/dev/shm` payını yükseltin (asıl düzeltme).

bash
docker run --shm-size=1g ...

docker-compose.yml karşılığı:

yaml
services: postgres: image: postgres:17 shm_size: 1gb

Bu ayar, sorgu planını bozmadan ve performansı düşürmeden sorunu kökten çözer. İlk adım bu olmalıdır.

2. Paralel sorguyu geçici olarak sınırlayın (acil ilk yardım).

sql
SET max_parallel_workers_per_gather = 0;

Bu komut hatayı derhal keser ama paralel sorgunun getirdiği hızı kaybedersiniz. Kalıcı çözüm değil, müdahale aracıdır.

3. `work_mem`'i doğru hesaplayın. Buradaki klasik hata, work_mem'i "bağlantı başına bellek" sanmaktır. work_mem operatör başına geçerlidir: 3 sıralama içeren bir sorgu, 3 × work_mem kullanabilir.

plaintext
uygun work_mem ≈ (RAM − shared_buffers) / (max_connections × 3)

Örnek: 32 GB RAM, 8 GB shared_buffers, 200 bağlantı → (32 − 8) / (200 × 3) ≈ 40 MB. Global work_mem'i 256 MB yapmak, 200 bağlantıda teorik 150 GB'lık talep yaratır ve Linux OOM Killer'ı devreye sokar.

4. Raporlama sorguları için oturum bazlı yükseltin. Global ayarı büyütmek yerine oturumda geçici artırın:

sql
SET work_mem = '256MB'; -- ağır rapor sorgusu RESET work_mem;

5. `out of memory` varyantında Linux overcommit kontrolü.

bash
free -m cat /proc/sys/vm/overcommit_memory

overcommit_memory = 2 (katı mod), PostgreSQL'in bellek taleplerini beklenmedik biçimde reddedebilir.


▸Bunu bir daha yaşamamak için

Konteynerde çalışan her PostgreSQL için /dev/shm boyutunu dağıtım şablonlarınıza (Terraform / Helm / Compose) zorunlu kılın. work_mem'i asla "büyük olsun hızlı olsun" mantığıyla ayarlamayın.

PostgreSQL Diğer Üretim Rehberleri

Aynı veritabanı motoruna ait doğrulanmış diğer içerikler.

Tümünü Gör