• 28-12-2020, 04:30:55
    #1
    Merhaba,

    Bir süredir optimizasyon konuları hakkında yazılar okuyorum ve hala aklımda net bir cevap oluşamadı çünkü böyle bir deneyim sahip olamadım. İlk öncelikle sizlere kullandığım teknolojilerden bahsedeceğim ve sizlerden de anlık olarak ne kadar kullanıcı kaldırabileceğiminin tahminleri öğrenmek istiyorum.
    Kullandığım sanal sunucu hakkında bilgi vereyim. Detaylı bakmak isteyenler olursa contabonun vps m ssd paketine bakabilir.
    Özellikleri
    6 CPU core
    16 GB RAM
    400 GB disk space (100% SSD)
    400 Mbit/s port
    İşletim sistemi olarak ubuntu 16.04 kuruludur.
    Apache Web Server ve Apache Tomcat kullanmaktayım.
    Toplamda 2 adet internet sitesi barındırıyorum ve bunlara aşırı bir talep olmuyor. Aylık 100 kişi girse şaşırırım.

    Yazılım Dili
    Kullandığım yazılımlar ise Java ve onun spring boot isimli bir frameworkü. Projelerim dağıtık mimari denilen bir yapıyı benimsiyor. Her ne kadar hepsi tek bir sanal sunucu üzerinde barınsada her bir mikroservisim projenin bir ayağını yönetiyor. Birinde sorun oluştuğunda diğerleri çalışmaya devam ediyor.

    Toplamda 6 adet mikroservis bulunmaktadır ve her mikroservis 120-150 MB civarında ram tüketimi yapmaktadır. Bu projelerde memory leak analizi yaptım ve pek bir sıkıntı görmedim. 1 Ay boyunca sunucuda çalıştılar ve 150 mb üzerine çıkmadılar. Garbage collector gereksiz yere devreye girmedi. Elimden geldiğince temiz ve framework'e göre kodlamaya çalıştım.

    Cache
    Redis cache kullandım. Ortalama her 48 saatte bir tüm cache siliniyor. Cache sürekli şişmemesi için düzgün bir yapı kurduğuma inanıyorum. Cache sayesinde database'e gidecek olan istek sayısını azaltmayı hedefledim.

    Database
    Database olarak MySQL tercih ettim, hem ilişkisel bir database'ye ihtiyaçım vardı hem de biraz olsun bildiğim bir yapıydı. Şimdilik en kalabalık tablom 220 mb ve toplamda 550k satır bulunmaktadır. Text-search işlemi sadece bir sütündaki isme göre yapılıyor. Databasede hiç bir şekilde tüm veri taşınmıyor. Maksimum LIMIT 100'dür. Projelerimde hikari connection pool kullandım böylelikle daha rahat konfigürasyon yapabileyim.
    Her mikroservisin açabileceği maksimum connection sayısı 15'dir. Fazla olunca ram tüketimim artıyor ama bu konuda tavsiyelerinize kesinlikle açığım. Eğer isterseniz yaptığım konfigürasyonları direk sizlerle paylaşabilirim.
    SQL Querylerim kötü değil, genellikle Hibernate aracılığıyla db'ye dokunduğum için burasının performanslı olduğunu düşünüyorum.

    Güvenlik
    Sanal sunucular konusunda ne yazık ki pek deneyimim yok ama logları takip ederek ilerleyen biriyim. Fail2ban kurdum. 12-13 port dışında kullanmadığım ve dışarıdan gelen tüm istekler DROP şekilde firewalldan ayarladım. Projelerim token tabanlı bir alt yapıya sahip ve her token 8 saat sonunda ömrünü tamamlıyor. Default portları değiştirdim.(SSH) SSH'e key ile bağlanıyorum. Cloudflare kullanmaktayım.
    Sunucuda rol yapısı kurdum. Her mikroservis projesi bir kullanıcı tanımlı. Bu kullanıcı diğer kullanıcılara dokunamaz sadece ona tanımlı dosya üzerinde hareket edebilir. Aynı olayı MySQL içinde gerçekleştirdim.

    Front-End
    2 site var ve bu sitelerden biri saf html-css kullanıldı. Diğeri ise Angular 9 kullandım. Bunda da ayrı bir cache yapısı kullandım. Tekrar tekrar isteklerde aynı yerler kullanılmıyor. Gereksiz css-js'lerden kurtuldum. Trafik https üzerinden akıyor.
    Burada soru varsa cevaplarım.

    Sunucuda bunlar dışında bir iki deployment araçları(Jenkins,Docker) kurulu.

    Elimden geldiğince net ve anlaşılır olmuşumdur umarım. Şuan sunucuda ram tüketimi 2.1 GB , geri kalan boştadır. Sorum konunun başında olduğu gibi aynı, eşzamanlı kaldırabileceğim kullanıcı sayısı kaçtır ? Aynı anda 1k kullanıcı istek atıp 1 saat boyunca tempolu kullanırsa sistemin çökme durumu olabilir mi ? Biliyorum bunlar test edilmeden cevap verilmesi zor sorular ama sizlerin deneyimlerinize göre de düşüncelerinizi öğrenmek istiyorum. Öğrenme aşamasında biriyim bunu göz önüne alın lütfen
  • 28-12-2020, 04:51:05
    #2
    Cevabı öğrenmenin tek yolu stres testi bence
  • 28-12-2020, 05:04:12
    #3
    MySQL yerine noSQL yada PostgreSQL kullanmanızı tavsiye ederim.
    Eğer yapmadıysanız mySQL config ayarlarınızı sunucuya uygun şekilde ayarlayın.
    Apache yerine spring boot'u nginx ile deploy edin.

    Ek olarak bu sorunun cevabı ancak production ortamında anlaşılır.
    Yada yukarda ki arkadaşın dediği gibi stress test yaptırabilirsiniz.
  • 28-12-2020, 06:48:46
    #4
    Okurken hayran kalmamak elde değil.

    Bu senin sitenin durumuyla alakalı.
    Sitendeki sorgu sayısı vs gibi şeyler bu etkeni belirler.
    Güzel bir optimizasyon ile Sana Sunucu , Dedicated'i aratmaz.

    Fakat bilmen gereken şey şudur ki her firmanın vps kalitesi değişir .
    Kimi ucuz (minimum değer) sunucuları sanallaştırırken kimi gerçekten kaliteli makinalar alıp onları sanallaştırmaktadır.

    Ayrıca unutmayalım ki vpsde bir yere kadar kaldırır çünkü tek başına bir sunucu değildir , bölünmüş sanal sunucudur ve ortak kullanım vardır . Buda demek oluyor ki bazen 100 k ziyaretçi kaldırıyorsa , ortak kullananlar sistemi biraz etkilerse 50 k ziyaretçi kaldırır vs değişir yani kullanımlara göre.

    Belki burada bir deneme yapılabilir. 😂
    Site adınız paylaş, örneğin Türkiye Saati ile : 15:00'da hangi saat sana uygunsa, giriş denemesi yapalım, ve o esnada ki Anlık ziyaretçi ve yükünü izle.

    Gerçi yine bilemem ne derecede uyulur.

    Başarılar dilerim.