dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/postgresql-could-not-resize-shared-memory
PostgreSQL
PG 14 - 17Bellek & Docker
6 dk okuma
ERROR: could not resize shared memory segment: No space left on device

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

Docker'da /dev/shm 64 MB sınırı, parallel query kaynaklı shared memory hatası, work_mem hesabı ve doğru düzeltme sırası.

İnceleyen:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Test Edilen Sürümler: PostgreSQL 14.10, 15.6, 16.4, 17.0 (Ubuntu 24.04 LTS / Docker 26.1)

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 27 Ekim 2026
Test Edilen SürümlerPostgreSQL 14.10, 15.6, 16.4, 17.0 (Ubuntu 24.04 LTS, Docker 26.1, Kernel 6.8)
Gerekli YetkiSUPERUSER veya pg_read_all_stats / pg_signal_backend
Risk Seviyesi
Mediumİşlemdeki oturumları pg_terminate_backend ile sonlandırmak uygulama katmanında rollback yaratır
Beklenen Çıktıpg_stat_activity sorgusunda bağlantı sayısının güvenli eşik altına inmesi
Geri Dönüş (Rollback) Planı:Geçici session timeout parametrelerini sıfırlama, pgbouncer reload veya pool boyutunu eski haline alma
PostgreSQL Docs: Connections
İ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.

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (20)