Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
Merhabalar,
bir e-ticaret uygulaması yazmaktayım. Apache2 üzerinde çalışıyor. Fakat açıkcası memnun değilim şuanki performanstan.
Biraz araştırma yaptım bir çok şey gördüm kafam allak bullak oldu Bu zamana kadar hiç böyle performans konularına dalmamıştım. Yardıma ihtiyacım var

1- Apache ile Php-fpm ile sizce yeterli performans sağlanabilir mi?
Yoksa Apache'den Nginx'e göç zamanı gelmiş midir? n11.com'a header bilgilerine baktığımda Server kısmında Apache yazıyor ve oldukça performanslı o yüzden sordum.

2- Eğer illaki göç edilecekse nginx'e nginx + php-fpm mi kullanmalı yoksa nginx reverse proxy apache mi?
E-ticaret uygulaması olduğu için dolayısıyla yoğun olarak sorguların çalıştığı bir sistem.

3- Ön bellekleme için Redis kullanıyorum. Baya baya herşeyi ön belleğe alıyorum ben. Resim sorguları, özellik sorguları, ürün sorguları, filtrelemeler vs. en son baktığımda yaklaşık 13 000 kadar key vardı redis'de. Sizce yanlış mı yapıyorum yoksa doğru yolda mıyım?
Yine bir dipnot: Redis'i de ilk defa bu projede kullanıyorum.

4- Varnish de kullanmayı düşünüyorum ama kafamda bazı sorular var. Jeffrey Way'in laravel ile ön belleklemeyi anlattığı bir videoyu izlemiştim. Orada yaptıklarıyla direkt olarak sayfanın render edilmiş halini ön belleğe alıyordu ve varsa ön bellekte olduğu gibi onu döndürüyordu. Dolayısıyla o sayfadayken ön belleğe alındığında Sepetimde 2 ürün varsa ben daha sonradan sepete ürün eklesem de ön bellekten çekilen render edilmiş sayfa yazdırıldığı için sepetimde yine 2 ürün var olarak kalıyordu.

Varnish böyle değil değil mi? Varnish hakkında kısa açıklayıcı bir şeyler karalayabilirseniz ya da link çok sevinirim :))

En son dipnot : Sorularım çok uzun oldu farkındayım ama gerçekten ilk defa bir e-ticaret sistemini tek başıma yazıyorum ve performans konularına vs daha önce bu kadar dalmamıştım. Boğulmak üzereyim yardım edin lütfen

Saygılar sevgiler şimdiden teşekkürler.
Son günlerde bende varnish ile ilgili testler yapmaktayım, varnish default ayarlarıyla tamda dediğiniz gibi çalışmakta. Ama gayet kolay ayarlamalar yaparak;

1) POST, GET, PUT, DELETE gibi method bazında cachelenecek veriyi filtreleyebilirsiniz !
2) Örneğin sepete ekleme işi ajax ile eklenecekse ajax header ile filtreleme yaparak, ajax'sa cacden gelmesin diyebilirsiniz.
3) Url bazında filtreler koyarak, bu sayfa cachelensin bu cachelenmesin diyebilirsiniz.
4) Varnish'i load balancer olarak kullanabilirsiniz. Örneğin öne varnish kurulu bir makina, onun arkadasına iki tane nginx+php-fpm makina. Bunların ayarlanması da çok kolay. Hemen çözeceğinize eminim. Hatta yatay ölçeklenebilirlik olayını abartarak, çeşitli fantaziler yapabilirsiniz.(Benim kafamdaki yapı buna benzer.)

En basit kullanımı; nginx yada apache 8080 portunu dinliyor olsun, varnish 8080 portunu izler(yada dinler yada koklar kelimeye tam karar veremedim!) ve 80 portundan yayın yapar. Yapmanız gereken kurallarınıza göre VCL(Varnish Configuration Language oluşturmak. Ben varnish ile ilgili testlerimi digital oceanda oluşturduğum dropletlerde yapıyorum. Private network olması çok büyük avantaj. 3. seçenekte anlattığım işlemi Arkadaki makinalara private network'ten ulaşarak yapabiliyorsunuz. Yaptığım sonuçları test etmek içinse apache bencmark kullanıyorum. En son dün gece yaptığım testte Sybase veri tabanından çektiğim büyük bir veri kullandım. Veri büyük olduğu için toplamda 10, anlık 1 istek gönderdim, 90 kata kadar hız artışı oldu desem yalan olmaz.

Yer imlerimde faydalı olacağını düşündüğüm birkaç makale:
http://sonsuzdongu.com/blog/varnish-ile-hizli-web
http://www.umutbesler.com/2014/02/13/varnish-kurulumu-ve-yukdagilimi-yapmak-load-balancing/
http://blog.pandorafms.org/?p=997

Tecrübelerini paylaşırsanız, bende öğrenmekten mutluluk duyarım.
Herkese iyi çalışmalar.
Yaptığınız projelerde bahsettiğiniz gibi aşırı yük sorununuz var ise bence dışardan birilerinden yardım alın. Çünkü karmaşa artıkça uygulamanın geliştirilme hızı çok düşücektir.

Şuan için tüm bu anlattıklarınızla uğraşmaktansa performans gerektiren bir uygulama için phalcon gibi bir framework kullanılabilir.
13 000 key mi? bu kadar çok Cache işlemi ne iş yapar ? Bence yanlış yoldasınız.
1. Sepet işlemini direk ajax ile hal edin.
2. Veritabanı sorgularınızı Cache'leyin.
3. javascript, css ve grafikleri Cache'leyin.

laravel mi kullanıyorsunuz ?
@evrend verdiğiniz bilgiler için çok teşekkür ederim. Varnishi kesinlikle deneyip kullanacağım. Tecrübelerimi de seve seve paylaşırım
Roni yazdı13 000 key mi? bu kadar çok Cache işlemi ne iş yapar ? Bence yanlış yoldasınız.
1. Sepet işlemini direk ajax ile hal edin.
2. Veritabanı sorgularınızı Cache'leyin.
3. javascript, css ve grafikleri Cache'leyin.

laravel mi kullanıyorsunuz ?
Evet Laravel kullanıyorum.

1. Sepet işlemini ajax ile yapıyorum orada problem yok.
2. Veritabanı sorgularını ön belleğe alıyorum zaten. Şöyle ki filtreleme sayfasında her filtre sonrasında ön belleğe alınıyor. Ürün detayına giderken ürün sorgusu yine ön belleğe alınıyor.
3. js css ve grafikleri de varnish kullanarak ön belleğe almayı planlıyorum.
MURATSPLAT yazdıYaptığınız projelerde bahsettiğiniz gibi aşırı yük sorununuz var ise bence dışardan birilerinden yardım alın. Çünkü karmaşa artıkça uygulamanın geliştirilme hızı çok düşücektir.

Şuan için tüm bu anlattıklarınızla uğraşmaktansa performans gerektiren bir uygulama için phalcon gibi bir framework kullanılabilir.
Baştan yazacak olursam dediğiniz gibi Phalcon kullanabilirim. Ya da aslında böyle yoğun performans sorunları çekmemek için Php dışında ne kullanmamı önerirsiniz?

Nodejs olabilir mi mesela?
Node.js performans açısından iyi güzel de, özellik sayısı arttıkça en azından benim yazdığım uygulamalar çöplüğe dönüyordu. Dağılmaya çok müsayit. Node.js ile twitter gibi az özellikli ama çok kullanıcı işler harika. Ama kullanıcı sayısı çok zorlamayacaksa ve çok fazla özellik varsa node.js önermiyorum.
iozguradem yazdıNode.js performans açısından iyi güzel de, özellik sayısı arttıkça en azından benim yazdığım uygulamalar çöplüğe dönüyordu. Dağılmaya çok müsayit. Node.js ile twitter gibi az özellikli ama çok kullanıcı işler harika. Ama kullanıcı sayısı çok zorlamayacaksa ve çok fazla özellik varsa node.js önermiyorum.
Teşekkürler verdiğiniz fikir için.

Bu arada sanırım sorunun ne olduğunu çözdüm. Tam emin değilim tabi.

Sanırım sorun redis kaynaklı değil. Şöyle ki 512mb ram var sunucu da ve ram kullanımı cok fazla. Bir yerden sonra ram yüzünden apache kapanıyor. Daha sonradan tekrar başlatıyor otomatik fakat redis bu sırada tekrardan otomatik başlamıyor.
Yani sanırım benim sunucuyu optimize edip ram kullanımınnı düşürmem lazım.

Dolayısıyla sorularımı değiştirip şöyle bir soruyla devam ediyorum:
- Şuanda ubuntu kurulu olan sunucu Apache2 ile çalışıyor yukarıda da belirtiğim gibi. Sunucuda 512mb ram var ve Ram kullanımını nasıl düşürebilirim?

Teşekkürler

Edit: Apache için php-fpm kurdum ve 4gb da swap alan oluşturdum. Sizce bu hamlelerim işe yarar mı, doğru mu?
512 mb ram çok yetersiz. Üstelik eticaret uygulaması kullanıyorsunuz.
1) Eğer 64 bit kullanıyorsanız, 32Bit'e geçmeniz ram kullanımınız için iyi olacaktır. Bu konuyla ilgili testler ve açıklamaları internette bolca bulabilirsiniz.
2) Apache2 yerine, nginx'e geçmeniz ram ve diğer kaynaklar açısından sistemi olumlu yönde etkileyecektir.
3) Redis yerine laravelde file cache kullanırsanız muhtemelen 512 Mb ramli bir makinada bayram havası estirecektir. İllaki redis kullanmak zorunda değilsiniz. File cache ile başlarsınız,proje büyür gelişir, ölçeklenebilirliğe daha fazla bütçe ayırarak makina/lar da geliştirilir ve o zaman redis ve alternatifleri düşünülebilir. Bu değişikliği yapacağınızı göz önüne alarak file cache ile uygulamanızı geliştirirseniz iyi bir tasarımla, redise çok sancısız bir geçiş yaparsınız.
4) Systemde gereksiz uygulama varsa; örneğin sadece grunt kullanmak için nodejs kurmak böyle bir makina için pek de iç açıcı sonuçlar doğurmaz. Jekyll kullanmak için ruby kurmak gibi. Aynı python vb. uygulamalar içinde geçerli. Kısıtlı kaynakları verimli kullanmak için bu makinayı sadece production için kullanmalısınız. Yönetici paneli bile olmasa iyi olur.
5) Redis kullanılacaksa; Database işlemleri için event oluşturarak, insert-update-delete olduğunda çok uzun olmayan cacheleme yaparak memory'i yine rahatlatabilirsiniz.

Ben 512 Mblık bir sistemin başlangıç aşamasında bir e-ticaret projesine yetebileceğini düşünüyorum. Bir anda normal hiçbir sitenin anlık hiti 5000 kullanıcıyı görmez. İlk başta günlük hiti kontrol ederek ihtiyaç halinde kaynakları artırmak hiç de zor değil. Zor olmamalı, zor olmayan sistemler tercih edilmeli(Cloud sistemler). Türkiyede bu yüzden binlerce lira çöpe gidiyor.

Herkese iyi çalışmalar.
Roni yazdı512 mb ram çok yetersiz. Üstelik eticaret uygulaması kullanıyorsunuz.
Evet bana kalırsa da yetersiz fakat şimdilik elimizdeki kaynakları en optimize şekilde kullanmak zorundayız.

@evrend teşekkürler. Önerilerinizden sonra ram tüketimini inceledim redis-server %18 gözüküyordu. Diğerlerine oranla en yüksek redis-server'dı. Ben de şimdilik file cache'ye geri döndüm. Memory kullanımı biraz olsun düştü.
Diğer önerilerinizi de deneyeceğim.

Bu arada digitalocean da 64 bitlik sistemi 32bite çevirmek için Kerneli değiştirip sistemi reboot ediyorum fakat sorun çıkıyor açılmıyor. Önceden 64 kurulan dropleti nasıl 32 bite çevirebilirim bu konuda bilginiz var mı?
selahattinunlu yazdıMerhabalar,
bir e-ticaret uygulaması yazmaktayım. Apache2 üzerinde çalışıyor. Fakat açıkcası memnun değilim şuanki performanstan.
Biraz araştırma yaptım bir çok şey gördüm kafam allak bullak oldu Bu zamana kadar hiç böyle performans konularına dalmamıştım. Yardıma ihtiyacım var

1- Apache ile Php-fpm ile sizce yeterli performans sağlanabilir mi?
Yoksa Apache'den Nginx'e göç zamanı gelmiş midir? n11.com'a header bilgilerine baktığımda Server kısmında Apache yazıyor ve oldukça performanslı o yüzden sordum.

2- Eğer illaki göç edilecekse nginx'e nginx + php-fpm mi kullanmalı yoksa nginx reverse proxy apache mi?
E-ticaret uygulaması olduğu için dolayısıyla yoğun olarak sorguların çalıştığı bir sistem.

3- Ön bellekleme için Redis kullanıyorum. Baya baya herşeyi ön belleğe alıyorum ben. Resim sorguları, özellik sorguları, ürün sorguları, filtrelemeler vs. en son baktığımda yaklaşık 13 000 kadar key vardı redis'de. Sizce yanlış mı yapıyorum yoksa doğru yolda mıyım?
Yine bir dipnot: Redis'i de ilk defa bu projede kullanıyorum.

4- Varnish de kullanmayı düşünüyorum ama kafamda bazı sorular var. Jeffrey Way'in laravel ile ön belleklemeyi anlattığı bir videoyu izlemiştim. Orada yaptıklarıyla direkt olarak sayfanın render edilmiş halini ön belleğe alıyordu ve varsa ön bellekte olduğu gibi onu döndürüyordu. Dolayısıyla o sayfadayken ön belleğe alındığında Sepetimde 2 ürün varsa ben daha sonradan sepete ürün eklesem de ön bellekten çekilen render edilmiş sayfa yazdırıldığı için sepetimde yine 2 ürün var olarak kalıyordu.

Varnish böyle değil değil mi? Varnish hakkında kısa açıklayıcı bir şeyler karalayabilirseniz ya da link çok sevinirim :))

En son dipnot : Sorularım çok uzun oldu farkındayım ama gerçekten ilk defa bir e-ticaret sistemini tek başıma yazıyorum ve performans konularına vs daha önce bu kadar dalmamıştım. Boğulmak üzereyim yardım edin lütfen

Saygılar sevgiler şimdiden teşekkürler.
1. Tek başına fazla farkı yok. Nginx'i hızlı yapan düzgün konfigürasyon.

2. Ne kadar yoğun olursa olsun, o sorguları cachelemek zorundasın. Klasik bir eticaret sitesinde cache kullanabileceğin birçok yer var. Kategoriler, ürünler, ürün bilgileri vb. Mümkün olduğunca sorgu sayısını azaltıp verileri Redis üzerinde tut.

3. Normal. Ne kadar ram gidiyor o kadar key için?

4. En basit haliyle böyle, ama VCL ile düzenlemeler yapabilirsin. https://www.varnish-cache.org/docs/4.0/users-guide/index.html

512MB ram çoook düşük. Hem Nginx, hem Varnish, hem Redis, hem MySQL kullanıyor bu rami. En azından 2GB/4GB seviyesine çekip bir load testi yaptır bakalım. https://www.blitz.io/to Zaten Redis falan kullanıyorum diyorsun, düzgün çalışması lazım. Bir eticaret sitesine yetecek kadar hit alıyor olman lazım. (MySQL'in falan kapanmasının sebebi ram/swap eksikliği) Daha sonra tekrar 512MB'e çek ve tekrar test yaptır. Arada çok büyük fark olmalı. 10 kredi hakkın var ve her test için 1 kredi gidiyor.

Son olarak, biraz deneme yanılma işi bunlar. Apache bench/jmeter ile performans analizi yapacaksın. Phalcon ile baştan yazmana gerek yok. Uygulama Laravel ile çalışsın, ReactPHP gibi birşeyle API sunucunu yaz. Sepet, ödeme işlemleri, ıvır zıvır bu API sunucusu üzerinde çalışabilir. Ayrıca XDebug/Webgrind ile en çok nerede bottlenecek oluyor bunları öğren.

Bunun dışında PHP'in en yeni versiyonu üzerinde zend opcode cache açmakta uygulamanı ciddi anlamda hızlandıracaktır.
  • AArda

      Seviye 28
    • Düzenlendi
    Not düşmek istedim, 512 MB ram varsa sanırım digitalocean kullanıyorsunuz.

    Tavsiyem denen gibi sunucu özelliklerinı artırmanızdan yana, fakat buna şansınız yoksa şunu da deneyebilirsiniz:

    Disk DigitalOcean'daki gibi SSD ise diskin bir kısmını sanal bellek gibi kullanarak ram gibi kullanabilirsiniz. Ram kadar olmasa da normal hard diske nazaran oldukça (baya bi) fayda sağlayacaktır. Bundan sona Redis'in, PHP'nin vs. ayarından maksimum bellek kullanımını artırabilirsiniz.

    Denendi, %100 çalışıyor ve işe yarıyor

    Bu arada not 2: İlk defa Redis kullandığınızdan not düşmek istedim. Redis konfigürasyonu içinde Laravel'de parola kısmı gelmiyor. Redisin kendi konfigürasyonunda da kapalı bu. Mutlaka Redis portunu değiştirin ve örneği şu sitede çıkanlar gibi çok güçlü bir parola tanımlayın. Laravel'de redis konfigine password keyi ile parolayı ekleyin. Aksi taktirde bu ciddi bir güvenlik sorunu çıkarabilir.
    Herkesin önerileri için tek tek teşekkür ederim.

    Öncelikle gerçekten 512mb ram çok yetersiz bir süre bu kaynakla idare etmek durumundayız.
    @evrend 'in önerisi ile Redis'in kaynak tüketimine de baktım. Hakikaten en çok kaynağı tüketen oydu. İptal ederek geçici olarak File cache'ye geçiş yaptım. Ram tüketimi biraz olsun azaldı.

    Ayrıca en başta bahsettiğim kapanma sorunu da yine üstteki mesajlarda dediğim gibi Redis ile alakalı bir problem değilmiş. Ram yetersizliği ile apache'nin restart atması sonrası Redis'in otomatik başlamamasıymış. @Arda 'nın da dediği gibi 4gb kadar swap alan oluşturarak aştım. (Gerçi sonradan Redis'i kaldırdım ama sonuçta asıl sorun apache'nin restart atmasıydı o sorun halloldu.)

    Varnish i de kurdum. Fakat bunu da ilk defa kullanacağım için tam olarak bilmiyorum. Dinamik verileri nasıl yapmam gerektiğini bilmediğim için şimdilik ön belleğe almasını kapattım. Gündüz detaylıca araştırıp eğer yapabilirsem Varnish ciddi anlamda yükümüzü azaltıcak.

    Son olarak
    @Aristona , ReactPHP'yi inceleyeceğim.
    @Arda Redis ile ilgili ipucu için teşekkür ederim. Şuanda olmasa da ileri de Redis'e tekrar geçiş yaptığımızda dikkat edeceğim.

    Tekrardan çok sağolun. Bu proje benim için çok güzel deneyim oluyor. Daha önce ilgilenme fırsatı bulamadığım konulara daldım vallahi :))
    @xsearch teşekkür ederim kesinlikle ihtiyacım olucak buna
    6 gün sonra
    Bugün tüm gün php5.5.9 + Apache+Mysql, Nginx1.4.6+PHP5.5.9+FPM+OPCache+MySql ve de Nginx1.4.6+HHVM3.2+MySql performans testleri yaptım.

    Test için ürün kategorilerinin listelendiği sayfayı kullandım. Yaklaşık 10 küsür kategori..

    Nginx1.4.6+PHP5.5.9+FPM+OPCache+MySql inanılmaz hızlı. Özellikle OPCache sistemi uçuruyor.
    HHVM ve Nginx php'nin yoğun kullanıldığı(resim işleme, matemetiksel işlemler, regex, döngüler içinde diziler vs..) alanlarda farkı kapatıyor.

    Klasik Apache ve PHP ise nal topluyor.

    Bu arada OPCache kullanıldığında veritabanındaki yükü de ciddi anlamda azaltıyor..
    iozguradem yazdıNode.js performans açısından iyi güzel de, özellik sayısı arttıkça en azından benim yazdığım uygulamalar çöplüğe dönüyordu. Dağılmaya çok müsayit. Node.js ile twitter gibi az özellikli ama çok kullanıcı işler harika. Ama kullanıcı sayısı çok zorlamayacaksa ve çok fazla özellik varsa node.js önermiyorum.
    Bu aralar ciddi anlamda Nodejs ile ilgileniyorum. JavaScript yeni sayılırım. Nodejs için Object Oriented Second Edition adlı kitaba başladım.

    Nodejs, kısa zamanda basit sunucu uygulamaları yazmak için iyi bir alternatif. Ama javascipt yazımı bana çok çer çöp geliyor.

    Nodejs kullanıldığı firamework'lere şöyle bir baktım. api(uygulama web, vb..) yazmak için idealler. Ama e-ticaret gibi projeler için pek uygun değil gibi duruyor. Şuan için javascipt ve nodejs'de yeni olduğum için kesin bir şey söyleyemiyorum.

    Biraz kurcalayalım bakalım..
    php5.5.9 + Apache+OPCache+Mysql denediniz mi?