deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

OpenBSD üzerinde PostgreSQL 18, kernel semaphore sınırları artırılana kadar initdb'de başarısız oluyor

Dev.to'da yayımlanan bir rehber, PostgreSQL 18'in OpenBSD üzerinde initdb'yi yanıltıcı bir disk alanı hatasıyla iptal ettiğini gösteriyor. Gerçek neden, kernel'ın düşük semaphore varsayılanları; kern.seminfo.semmni ve kern.seminfo.semmns değerlerinin yükseltilmesiyle çözülüyor.

OpenBSD üzerinde PostgreSQL 18, kernel semaphore sınırları artırılana kadar initdb'de başarısız oluyor

İlk adımda başarısız olan temiz bir kurulum

dev.to'da yayımlanan bir rehbere göre, paketlerden OpenBSD'ye PostgreSQL 18 kurmak isteyen herkes başlatma aşamasında bir duvara çarpacak. pkg_add postgresql-server ile sunucuyu kurmak normal şekilde çalışıyor; ancak /var/postgresql altındaki yeni bir veri dizinine, _postgresql kullanıcısıyla initdb çalıştırılarak veritabanı kümesi oluşturulmaya ilk teşebbüs edildiğinde işlem FATAL hatasıyla iptal oluyor: "could not create semaphores: No space left on device".

Mesaj yanıltıcı ve log'daki PostgreSQL'in kendi ipucu metni de buna dikkat çekiyor: Sorun bir disk alanı sorunu değil. Hata, semaphore setlerinin maksimum sayısına (SEMMNI) veya sistem genelindeki maksimum semaphore sayısına (SEMMNS) ilişkin kernel sınırının aşılacak olması durumunda ortaya çıkıyor.

Başarısız çalışmada görünür, daha sessiz ikinci bir belirti daha var. Bootstrap betiği sırasında çökmeden önce initdb, varsayılanlarını çoktan yalnızca 20 maksimum bağlantı ve 400kB shared buffer'a kadar geri çekmişti — bu, PostgreSQL'in dar kernel sınırlarını algılayıp kendini sığdırmak için küçülmeyi denediğinin bir işareti. Bu yeterli olmadı ve initdb, çıkarken kısmen oluşturulmuş veri dizinini sildi.

Semaphore sınırlarının yükseltilmesi

Çözüm iki sysctl komutu:

doas sysctl kern.seminfo.semmni=256 doas sysctl kern.seminfo.semmns=2048

Yazarın makinesinde bu, semaphore seti üst sınırını 10'dan 256'ya, toplam semaphore üst sınırını ise 60'tan 2048'e taşıdı. OpenBSD, modern bir PostgreSQL örneğinin istediğinin çok altındaki varsayılanlarla geliyor ve veritabanının semaphore tüketimi, bağlantı sayısıyla ölçekleniyor — aynı ipucu metni, kernel'a dokunmaya alternatif olarak max_connections değerinin düşürülmesini öneriyor.

Yeni sınırlar yürürlükteyken, ikinci initdb çalışması sorunsuz tamamlanıyor. PostgreSQL bu kez standart 100 bağlantı ve 128MB shared buffer varsayılanlarını seçiyor, dinamik paylaşımlı bellek uygulaması olarak POSIX'i belirliyor ve veri sayfası checksum'larını etkinleştiriyor.

Başarılı çalışmadan birkaç detay dikkati hak ediyor. Küme, C locale'i ve SQL_ASCII kodlamasıyla başlatılıyor ve initdb, yerel bağlantılar için "trust" kimlik doğrulamasının etkin olduğuna dair bir uyarı yayımlıyor — sunucuya yerel makinenin ötesinden erişilebilecekse, bunu pg_hba.conf ya da -A, --auth-local ve --auth-host seçenekleriyle değiştirmeye değer. Rehberdeki psql istemi sürümü 18.6 olarak bildiriyor.

Değişikliğin yeniden başlatmadan sonra da kalıcı olması

Çalışma zamanında ayarlanan sysctl değerleri yeniden başlatmalar arasında kalıcı olmuyor; bu yüzden rehber, her iki ayarı da /etc/sysctl.conf dosyasına ekliyor:

echo "kern.seminfo.semmni=256" | doas tee -a /etc/sysctl.conf echo "kern.seminfo.semmns=2048" | doas tee -a /etc/sysctl.conf

Komutları kopyalayanlar için küçük bir uyarı: Orijinal yazıda basıldığı haliyle ikinci satır, atamanın önünde "sysctl" kelimesini taşıyor; ancak /etc/sysctl.conf dosyasının beklediği biçim bu değil — dosya düz variable=value girdileri alıyor, dolayısıyla bu önekin atılması gerekiyor.

Bundan sonra rcctl start postgresql sunucuyu ayağa kaldırıyor ve _postgresql kullanıcısıyla psql ile bağlanmak, çalışan bir isteme ulaştırıyor.

Neden önemli

Bu küçük bir düzeltme ama iki tasarım felsefesinin kesişim noktasında duruyor. OpenBSD'nin muhafazakâr varsayılanları — sistem genelinde 10 semaphore seti ve 60 semaphore — onun minimal, varsayılan olarak güvenli duruşuna uygun; ancak her bağlantı slotu için bir semaphore isteyen veritabanı sunucularından daha eski. Çoğu Linux dağıtımı, PostgreSQL kullanıcılarının bu tür hataları hiç görmediği kadar yükseğe ayarlanmış kernel'larla geliyor; OpenBSD'de ise bununla karşılaştığınız ilk şey bu.

Sessiz düşürme davranışı, hatırlanmaya değer kısımdır. Tamamen başarısız olmadan önce initdb, varsayılanlarını normal bağlantı sayısının beşte birine ve küçücik bir buffer havuzuna kesmişti bile. Sınırın çok az altında kalan bir sistemde, çalışan ama patolojik biçimde küçük bir veritabanıyla ve bunu açıklayan bariz bir hata olmaksızın sonuçlanabilirdiniz.

OpenBSD dağıtımlarını otomatikleştirenler için pratik çıkarım, bu sysctl'leri başarısız bir initdb aracılığıyla keşfetmek yerine, en baştan temel imaja ya da yapılandırma yönetimine işlemektir.

  • #postgresql
  • #openbsd
  • #database
  • #sysadmin
  • #how-to