Bilgi bankamızda arama yapmak için sorunuzu yazın...
Netx Teknik Ekibi · Yayın: 29.10.2026
Bir VDS'e kaç web sitesi sığacağını disk alanı ya da site adedi söylemez. Sınırı, yoğun saatte aynı anda çalışan dinamik isteklerin bellek ve işlemci tüketimi, veritabanlarının sık okunan verisi ve önbelleğin bu isteklerin ne kadarını PHP'ye uğratmadan karşıladığı çizer. Hesap bu yüzden ölçümle başlar: her sitenin tepe saatteki eşzamanlı istek sayısını ve PHP işçisi başına belleğini bulun, bellek bütçesini toplayın, işlemci ihtiyacını saniyedeki istek sayısı ile istek başına işlemci süresinden çıkarın. Önbellekli bir tanıtım sitesiyle bir WooCommerce mağazası aynı terazide tartılmaz.
Disk dolmadan çok önce başka bir kaynak tükenir. Pratikte beş etken birlikte çalışır ve her birinin ölçüldüğü yer farklıdır.
| Etken | Neden belirleyici? | Nereden ölçülür? |
|---|---|---|
| Eşzamanlı dinamik istek | Her biri bir PHP işçisini (worker) istek bitene kadar meşgul eder | Erişim günlüğü, PHP-FPM durum sayfası |
| İşçi başına bellek | İşçi sayısıyla çarpılınca en büyük bellek kalemine dönüşür | ps, varsa smem |
| Veritabanının çalışma kümesi (sık okunan veri) | Bellekte tutulamayan veri her sorguda diskten okunur | information_schema, InnoDB durum sayaçları |
| Önbellek isabet oranı | İsabet eden istek PHP'ye ve veritabanına hiç ulaşmaz | Yanıt başlıkları, önbellek eklentisinin raporu |
| Disk G/Ç | Yedek, içe aktarma ve belleğe sığmayan sorgular aynı diski paylaşır | iostat -x, pidstat -d |
Listenin ilk iki satırı çarpan gibi davranır. Yirmi sitenin her birine "ne olur ne olmaz" diye on işçi izni verirseniz kâğıt üzerinde iki yüz işçilik bir bellek borcu doğar, sunucu da bunu ancak siteler aynı anda yüklenmediği sürece ödeyebilir. Sunucu boyutunu ilk kez seçiyorsanız darboğazı bulma adımlarını VDS seçerken mevcut kullanımı ölçme yöntemi yazısında anlattık. Paylaşımlı cPanel paketlerinde gördüğünüz "web sitesi" değeri ise başka bir şeydir: sağlayıcının hesap başına koyduğu bir sınırdır ve cPanel paketindeki site sınırının anlamını ayrıca ele aldık.
Siteler bugün başka bir hostingte ya da sunucuda çalışıyorsa elinizde altın değerinde bir veri var. Üç değer toplamanız yeterli: tepe dakikadaki PHP isteği, işçi başına bellek ve veritabanlarının boyutu.
Erişim günlüğünden statik dosyaları ayıklayıp dakika başına istek sayısını çıkarabilirsiniz. Aşağıdaki komut Apache ve Nginx'in yaygın "combined" günlük biçimini varsayar:
grep -v -E '\.(css|js|png|jpe?g|gif|svg|webp|woff2?|ico)' access.log \
| awk '{print substr($4, 2, 17)}' \
| sort | uniq -c | sort -rn | head -5
Çıktıdaki her satır bir dakikayı ve o dakikadaki istek sayısını gösterir; 412 29/Oct/2026:11:42 gibi bir satır, o dakikada statik olmayan 412 istek geldiği anlamına gelir. Bu sayı bir üst sınırdır. Sayfa önbelleğinden dönen istekler de günlüğe yazılır ama PHP'ye ulaşmaz.
Eşzamanlılığa geçmek için basit bir ilişki kullanılır: aynı anda meşgul işçi sayısı ≈ saniyedeki PHP isteği × ortalama yanıt süresi. Dakikada 300 PHP isteği saniyede 5 eder. İstekler ortalama 0,4 saniye sürüyorsa aynı anda ortalama iki işçi çalışır. Tepe anlarında bunun birkaç katı görülür, o yüzden kararı ortalamaya değil ölçülmüş en yüksek değere bağlayın.
Günlükten daha doğrudan bir kaynak, PHP-FPM'in kendi durum sayfasıdır. Havuz ayarında pm.status_path tanımlanırsa sayfada active processes, max active processes, max children reached ve listen queue değerleri görünür. Bu sayfayı yalnız sunucunun kendisine açın; herkese açık bir durum sayfası iç yapınızı dışarıya anlatır.
İşçi tavanına çarpan bir havuz, FPM günlüğüne server reached pm.max_children setting uyarısı yazar (ondemand modunda ifade max_children setting olarak geçer). Günlüğün yolu dağıtıma ve panele göre değişir:
grep -i "max_children setting" /var/log/php*-fpm*.log
Hiç satır gelmiyorsa havuz tavanı bugüne kadar yetmiş demektir. Sık tekrar eden satırlar ise ziyaretçinin sırada beklediğini gösterir.
Her site ayrı bir Linux kullanıcısıyla çalışıyorsa o kullanıcının PHP işlemlerini toplayarak site başına ortalamayı bulursunuz:
ps -u kullanici -o rss=,comm= | grep php-fpm \
| awk '{t+=$1; n++} END {printf "%d işçi, ortalama %.0f MB\n", n, t/n/1024}'
rss değeri kilobayt cinsindendir ve paylaşılan belleği (OPcache'in ortak bellek alanı, kütüphaneler) her işleme ayrı ayrı yazar. Toplam bu yüzden gerçeğin biraz üstünde çıkar, bütçe için de bu temkinli taraf işinize yarar. Sunucuda smem kuruluysa paylaşılan sayfaları bölüştüren PSS değeri daha gerçekçi bir tablo verir.
SELECT table_schema,
ROUND(SUM(data_length + index_length) / 1024 / 1024) AS mb
FROM information_schema.tables
GROUP BY table_schema
ORDER BY mb DESC;
Toplam boyut, belleğe sığması gereken miktar değildir. Asıl ihtiyaç, sorguların sürekli dokunduğu kısımdır. Mevcut sunucuda SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%'; çıktısına bakın: Innodb_buffer_pool_reads diskten okunmak zorunda kalan okumaları, Innodb_buffer_pool_read_requests ise bütün mantıksal okumaları sayar. İlki ikincisine göre küçük kalıyorsa sıcak veri belleğe sığıyor demektir.
Ölçtüğünüz değerleri tek bir toplamda birleştirin:
Gereken bellek ≈ işletim sistemi + panel (varsa)
+ web sunucusu
+ veritabanı (buffer pool + bağlantı başına tamponlar)
+ Redis/Memcached (maxmemory değeri)
+ Σ (site başına pm.max_children × işçi başına bellek)
+ %20–30 pay (disk önbelleği, yedek, güncelleme)
Bileşenlerin tipik tüketim aralıklarını sunucuda RAM ihtiyacını bileşen bileşen hesaplama rehberindeki tabloda verdik, burada tekrar etmeyelim. Çok siteli sunucularda hesabı asıl bozan üç tuzak var.
Birincisi toplam işareti. Her havuzun pm.max_children değeri tek başına makul görünür, toplamları ise çoğu zaman sunucunun belleğini aşar. Siteler aynı anda yüklenmedikçe sorun görünmez. Bir bot taraması ya da kampanya birkaç havuzu aynı anda tavana çıkardığında bellek biter ve çekirdek bir işlemi öldürür. Bunun izini çekirdek günlüklerindeki OOM kayıtlarından sürmek mümkündür ama önlemek daha ucuzdur. Aynı FPM ana işlemine bağlı çok sayıda havuz için PHP-FPM'in genel ayarlarındaki process.max, bütün havuzların toplam işçi sayısına bir tavan koyar. PHP belgesi bunu dikkatli kullanılacak bir ayar olarak niteliyor, yani tavan dolduğunda istekler sıraya girer.
İkincisi boşta bekleyen işçiler. pm = dynamic modunda her havuz, hiç ziyaretçi yokken bile pm.min_spare_servers kadar işçiyi ayakta tutar. pm = ondemand modunda işçiler istek geldikçe açılır ve pm.process_idle_timeout (varsayılanı 10 saniye) sonra kapanır. Az ziyaret alan sitelerde ondemand, boşa duran belleği neredeyse sıfıra indirir. Karşılığında ilk isteğe işçi açılırken küçük bir gecikme eklenir.
Üçüncüsü sınırsız önbellek servisi. Redis'in maxmemory değeri 64 bit sistemlerde varsayılan olarak 0'dır, yani veri kümesine sınır konmaz. Nesne önbelleği kullanan siteler büyüdükçe Redis de büyür. Bütçeye girecek rakam, sizin açıkça yazdığınız maxmemory değeridir.
Bellek "aynı anda kaç iş ayakta kalabilir" sorusunu yanıtlar. İşlemci ise bu işlerin ne kadar çabuk biteceğini belirler. Hesap şöyle kurulur:
Gereken vCore ≈ Σ (site başına tepe PHP isteği/sn × istek başına işlemci süresi)
÷ 0,7 (yoğun saatte hedeflenen en yüksek kullanım)
İstek başına işlemci süresi yanıt süresiyle aynı şey değildir. Bir istek 0,8 saniye sürüp bunun yalnız 0,2 saniyesini işlemcide geçirebilir, kalanı veritabanını ya da dış bir servisi bekler. Ölçmek için yoğun bir dakikada PHP işlemlerinin işlemci kullanımını alın:
pidstat -u -C php-fpm 60 1
Komut 60 saniye boyunca adında php-fpm geçen işlemlerin ortalama işlemci yüzdesini verir. Average satırlarındaki %CPU değerlerini toplayın: toplam %85 ise PHP o dakika ortalama 0,85 vCore kullanmıştır. Aynı dakikada günlükte 510 PHP isteği saydıysanız saniyede 8,5 istek eder, istek başına işlemci süresi de 0,85 ÷ 8,5 = 0,1 saniye çıkar. Veritabanı işlemcisini -C mysqld ya da -C mariadbd ile ayrıca ölçüp ekleyin.
%70 hedefi kampanya ve bot dalgalanmalarına pay bırakmak içindir. vCore sanal işlemci birimidir ve fiziksel çekirdekle bire bir aynı şey değildir. Netx VDS'te paketteki vCore ve RAM size ayrılmış kaynak olarak tanımlanır. Hesabı bu ayrılmış değerler üzerinden yapabilirsiniz.
Aşağıdaki rakamlar ölçüm sonucu değildir. Yöntemin nasıl işlediğini göstermek için seçilmiş varsayımlardır ve kendi değerlerinizi koyduğunuz anda sonuç değişir. Sonuçları "şu kadar site sığar" diye değil, "bu karışım şu kadar kaynak ister" diye okuyun.
| Varsayım | Senaryo 1 | Senaryo 2 | Senaryo 3 |
|---|---|---|---|
| Site karışımı | 20 önbellekli tanıtım sitesi | 2 WooCommerce mağazası + 6 kurumsal site | Ajansa ait 40 az ziyaretli site |
| Tepe PHP isteği (toplam) | Dakikada 120 (2/sn) | Normalde 4/sn, kampanyada 12/sn (mağazalar) | Dakikada 120 (2/sn) |
| İstek başına işlemci süresi | 0,1 sn | Mağazada 0,3 sn | 0,1 sn |
| İşçi başına bellek | 70 MB | Mağazada 128 MB, kurumsalda 70 MB | 60 MB |
| Belirleyici kalem | Havuz ayarları | Kampanya tepesi | Boşta bekleyen işçiler, yedek penceresi |
Her sitede sayfa önbelleği açık, yoğun saatte sayfa görüntülemelerin %90'ı önbellekten dönüyor. Yönetim paneli, iletişim formu ve botlarla birlikte site başına dakikada 6 istek PHP'ye ulaşıyor. Toplam saniyede 2 istek, 0,1 saniyelik işlemci süresiyle 0,2 vCore eder. İşlemci neredeyse boşta.
Bellekte tablo farklı. Her havuz 5 işçiye izin verirse toplam 100 işçi × 70 MB = yaklaşık 7 GB'lık bir kâğıt borcu çıkar. Oysa ölçülen eşzamanlılık saniyede 2 istek × 0,4 saniye, yani ortalama bir işçinin biraz altında kalıyor. Havuzları ondemand moduna alıp site başına 2–3 işçiyle sınırladığınızda en kötü durum 2,8–4,2 GB'a iner. Üzerine işletim sistemi ve web sunucusu (yaklaşık 0,7 GB), 1 GB'lık bir buffer pool ve %25 pay eklenince bütçe kabaca 5,6–7,4 GB aralığına oturur. Bu senaryoda kapasiteyi trafik değil, havuz ayarlarının ne kadar özenli yapıldığı belirliyor.
Mağazalarda sepet, hesap, ödeme ve AJAX istekleri önbelleğe alınamaz. Varsayımımız, yoğun saatte mağaza başına dakikada 300 sayfa isteğinin %40'ının PHP'ye ulaşması. İki mağaza normal tepe saatinde saniyede 4 istek üretir, kampanya gününde trafik üç katına çıkınca 12 istek. 0,3 saniyelik işlemci süresiyle kampanya tepesi 3,6 vCore ister. Veritabanı için 1 vCore daha ekleyip %70 hedefine böldüğünüzde ihtiyaç yaklaşık 6,6 vCore'a çıkar.
Kampanya anında eşzamanlılık 12 × 0,8 saniye ≈ 10 işçiye ulaşır. Mağaza başına 10 işçilik tavan (20 × 128 MB ≈ 2,5 GB), kurumsal siteler için 18 işçi (≈ 1,3 GB), iki mağazanın sıcak verisini taşıyacak 3 GB'lık buffer pool, 512 MB Redis ve 0,7 GB sistem payı toplamı yaklaşık 8 GB eder. %25 payla 10 GB civarı. Burada site sayısının neredeyse hiç önemi yok. Altı kurumsal siteyi çıkarsanız ihtiyaç pek değişmez, mağazalardan birinin kampanyası ise her şeyi değiştirir. Varsayımlar kâğıt üstünde kaldığı için kampanyadan önce gerçekçi bir yük testiyle sınamak şart.
Trafik birinci senaryodakiyle aynı: toplamda saniyede 2 PHP isteği. Bu kez havuzlar panelin varsayılanında, pm = dynamic ve pm.min_spare_servers = 1 ile çalışıyor. Kimse siteye girmezken bile 40 işçi × 60 MB = 2,4 GB bellek boşta bekler. Havuz başına başlangıç işçisi 2 ise servis yeniden başladığında bu rakam 4,8 GB'a çıkar.
Görünmeyen yükler de bu senaryoda öne çıkar. Kırk sitenin WordPress zamanlanmış görevleri, gece aynı saatte başlayan kırk ayrı yedek sıkıştırması, güvenlik taramaları ve kırk ayrı giriş sayfasına gelen bot denemeleri trafikten bağımsız olarak işlemci ve disk tüketir. Açıkçası bu sunucuda sınıra önce ziyaretçi yüküyle değil, gece yedeklerinin sabaha yetişmemesiyle ya da kırk sitenin güncelleme yüküyle varırsınız.
Kapasite hesabı tek başına yetmez, aynı sunucudaki sitelerin birbirine ne kadar dokunabildiği de bir sınırdır. Her site için ayrı bir Linux kullanıcısı ve ayrı bir PHP-FPM havuzu açın: havuzun user ve group ayarları, o sitenin PHP kodunun hangi kullanıcıyla çalışacağını belirler. Dosya izinleri doğru kurulduğunda ele geçirilen bir site komşusunun dosyalarına yazamaz. Veritabanında da her siteye yalnız kendi veritabanında yetkili ayrı bir kullanıcı verin.
Havuz başına pm.max_children, güvenlik kadar adalet işi de görür. Bir sitenin eşzamanlılık tavanıdır, dolayısıyla tek bir sitenin bütün belleği yutmasını engelleyen ilk sınırdır. Siteler müşterilerinize aitse kaynak tüketen bir müşteriyle nasıl konuşacağınızı ve sözleşmeye ne yazacağınızı da baştan düşünün. Bayi hostingte bir müşterinin kaynakları tüketmesi durumunda izlenen yol (tespit, müşteriyle konuşma, geçici sınırlama, gerekirse ayrı pakete taşıma) VDS'teki çok müşterili düzende de büyük ölçüde geçerlidir.
cPanel ya da Plesk gibi bir panel bu ayrımı hesap veya abonelik başına kendiliğinden yapar, karşılığında kendi belleğini ve lisans bedelini ister. Lisans bazen donanımdan önce sınır koyar. cPanel lisansları sunucudaki hesap sayısına göre kademelenir, ayrıntısını cPanel lisansının hesap sayısına göre nasıl fiyatlandığı yazısında anlattık. Plesk'in sürüm sayfasında Web Admin sürümü 10, Web Pro sürümü 30 alan adıyla sınırlı, Web Host sürümü sınırsız olarak listeleniyor. Seçtiğiniz kademenin üst sınırı, sunucunuzun fiilî site sınırı olabilir.
Gece yedeği çok siteli bir sunucunun en ağır işidir. Sıkıştırma işlemciyi, dosyaları baştan sona okumak diski yorar. Kırk siteyi aynı dakikada yedeğe almak yerine işleri saatlere yayın ve yedeği sunucu dışında bir yere gönderin. Netx VDS'te yedekleme fiyata dahil değildir; siparişte ek yedek alanı seçebilir ya da kendi dış deponuzu kullanabilirsiniz.
WordPress sitelerinde ziyaretle tetiklenen zamanlanmış görevleri (WP-Cron) sistem cron'una taşıyıp her sitenin çalışma dakikasını kaydırmak, hepsinin aynı anda uyanmasını önler. Kırk sitenin görevi saatin başında birlikte başlarsa o dakika, gün içindeki en yoğun dakikanız olabilir.
Siteleri taşıdıktan sonraki bir iki hafta, hesabınızın sınavıdır. Yoğun saatlerde şu göstergeleri izleyin:
free -h çıktısındaki available sütunu tepe saatte de rahat bir pay bırakıyor mu?max_children setting uyarısı çıkıyor mu, hangi havuzda?vmstat 1 çıktısında si ve so sütunları sürekli sıfırın üzerinde mi?cat /proc/pressure/memory çıktısındaki some avg60 değeri sıfırdan belirgin biçimde uzaklaşıyor mu? Bu değer, işlemlerin bellek beklerken geçirdiği zamanın yüzdesidir. Dosya yoksa çekirdeğiniz bu ölçümü sunmuyordur.Sayfalar hatasız ama yavaş açılıyorsa sorun büyük olasılıkla işlemci ya da disk tarafındadır. Bu durumda yavaşlığı steal, iowait ve load average değerlerinden ayırt etmek doğru başlangıç noktasıdır.
Her şeyi tek sunucuda tutmanın bir kolaylığı var, bir de riski. Şu işaretlerden biri tekrar ediyorsa büyütmek yerine bölmeyi düşünün:
Bölmenin iki yaygın yolu var: yükü taşıyan mağazayı ayrı bir sunucuya almak ya da veritabanını uygulamadan ayırmak. Sorun yalnız bir kaynakta toplanıyorsa dikey büyütme daha basittir. Netx VDS Sihirbazı'nda vCore, RAM ve NVMe diski ayrı ayrı seçebildiğiniz için yapılandırmayı darboğaz olan kaynağa göre kurabilirsiniz. Hazır kademeler ve altyapının ayrıntıları VDS sunucu sayfasında yer alıyor. Hangi yolu seçerseniz seçin, ölçtüğünüz tepe kullanımın üzerine %30–40 pay bırakmak sonraki taşınmayı geciktirir.
Değerlendirme: 0