Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
  • Yardım
  • Anlık 2500 kişi yüklenince site çökmesi hk.

Merhabalar.

Çok basit bir arayüze sahip sitem var. Anlık 2500 kişi sitede sayfa yenileme yapınca siteye ulaşılamıyor. Laravel'de bilmediğim başka ayarlar mı var acaba? Plesk panelin olduğu sunucu kendime ait ve pleske ayılmış 8GB RAM var.

Daha önce Titan Framework'ünde anlık 70k ziyaretçiyi ağırlamıştık ve bir problem yaşamamıştım.

Bu konuda Laravel ile ilgili bilmediğim şeyler var sanırım.

    alaca33 İstek geldiğinde uygulamanız ne yapıyor, tek tek sıralayın ve kontrol edin, optimizasyon gereken yerler olabilir.

    alaca33
    Önce şu log dosyasına bakıp gidilecek yol belirlenebilir :
    /var/www/vhosts/domain.com/logs/error_log
    İlgili saatlerde log dosyasındaki belirgin hatalar neler ?

      yusufc

      [Wed Oct 21 20:34:41.839078 2020] [proxy_fcgi:error] [pid 14837:tid 140694127634176] [client 178.244.196.20:39068] AH01068: Got bogus version 68, referer: https://www.siteadi.com/yonetim/yurt
      [Wed Oct 21 20:34:41.839158 2020] [proxy_fcgi:error] [pid 14837:tid 140694127634176] (22)Invalid argument: [client 178.244.196.20:39068] AH01075: Error dispatching request to :, referer: https://www.siteadi.com/yonetim/yurt
      [Wed Oct 21 20:34:56.145506 2020] [proxy_fcgi:error] [pid 19081:tid 140694068885248] [client 78.181.144.101:41472] AH01068: Got bogus version 32, referer: https://www.siteadi.com/yonetim/anasayfa
      [Wed Oct 21 20:34:56.145556 2020] [proxy_fcgi:error] [pid 19081:tid 140694068885248] (22)Invalid argument: [client 78.181.144.101:41472] AH01075: Error dispatching request to :, referer: https://www.siteadi.com/yonetim/anasayfa
      [Wed Oct 21 20:35:00.737750 2020] [proxy_fcgi:error] [pid 14837:tid 140694136026880] [client 78.181.144.101:42416] AH01068: Got bogus version 32, referer: https://www.siteadi.com/yonetim/anasayfa
      [Wed Oct 21 20:35:00.737795 2020] [proxy_fcgi:error] [pid 14837:tid 140694136026880] (22)Invalid argument: [client 78.181.144.101:42416] AH01075: Error dispatching request to :, referer: https://www.siteadi.com/yonetim/anasayfa
      [Wed Oct 21 20:40:20.947447 2020] [proxy_fcgi:error] [pid 19536:tid 140694001743616] [client 95.5.186.213:58176] AH01068: Got bogus version 32, referer: https://siteadi.com/yonetim/yurt
      [Wed Oct 21 20:40:20.947511 2020] [proxy_fcgi:error] [pid 19536:tid 140694001743616] (22)Invalid argument: [client 95.5.186.213:58176] AH01075: Error dispatching request to :, referer: https://siteadi.com/yonetim/yurt
      [Wed Oct 21 20:40:21.709417 2020] [proxy_fcgi:error] [pid 14837:tid 140694018529024] [client 95.5.186.213:58210] AH01068: Got bogus version 32, referer: https://siteadi.com/yonetim/yurt
      [Wed Oct 21 20:40:21.709511 2020] [proxy_fcgi:error] [pid 14837:tid 140694018529024] (22)Invalid argument: [client 95.5.186.213:58210] AH01075: Error dispatching request to :, referer: https://siteadi.com/yonetim/yurt
      [Wed Oct 21 21:59:28.983955 2020] [proxy_fcgi:error] [pid 14834:tid 140694043707136] [client 95.5.186.213:41160] AH01068: Got bogus version 32, referer: https://siteadi.com/yonetim/anasayfa
      [Wed Oct 21 21:59:28.984109 2020] [proxy_fcgi:error] [pid 14834:tid 140694043707136] (22)Invalid argument: [client 95.5.186.213:41160] AH01075: Error dispatching request to :, referer: https://siteadi.com/yonetim/anasayfa
      [Wed Oct 21 22:06:43.437656 2020] [proxy_fcgi:error] [pid 19536:tid 140694010136320] [client 81.213.249.235:42808] AH01068: Got bogus version 32, referer: https://www.siteadi.com/yonetim/anasayfa
      [Wed Oct 21 22:06:43.437796 2020] [proxy_fcgi:error] [pid 19536:tid 140694010136320] (22)Invalid argument: [client 81.213.249.235:42808] AH01075: Error dispatching request to :, referer: https://www.siteadi.com/yonetim/anasayfa
      [Wed Oct 21 22:06:44.887894 2020] [proxy_fcgi:error] [pid 19536:tid 140693993350912] [client 81.213.249.235:42820] AH01068: Got bogus version 32, referer: https://www.siteadi.com/yonetim/anasayfa
      [Wed Oct 21 22:06:44.888002 2020] [proxy_fcgi:error] [pid 19536:tid 140693993350912] (22)Invalid argument: [client 81.213.249.235:42820] AH01075: Error dispatching request to :, referer: https://www.siteadi.com/yonetim/anasayfa

      Hocam o saat aralığına ait loglar bu şekilde. Nasıl yorumlandığını bilemiyorum tabi.

        Controller'da IP için aşağıdaki fonksiyon vardı ama yazmışım öyle kalmış. Herhangi bir yerde kullanmıyordum. O kodu silince gayet stabil gördüm sistemi. Bu tür kodlar, kullanılmadığı halde sistemi yorar mı?

           public function GetIP()
            {
                if(getenv("HTTP_CLIENT_IP")) {
                    $ip = getenv("HTTP_CLIENT_IP");
                } elseif(getenv("HTTP_X_FORWARDED_FOR")) {
                    $ip = getenv("HTTP_X_FORWARDED_FOR");
                    if (strstr($ip, ',')) {
                        $tmp = explode (',', $ip);
                        $ip = trim($tmp[0]);
                    }
                } else {
                    $ip = getenv("REMOTE_ADDR");
                }
                return $ip;
            }

          alaca33
          Hayır.
          Bu fonksiyon kullanılmıyorsa bir etkisi olmaz.
          Bence sorununuz başka bir şey idi.

          alaca33 getenv PHP içindeki sabitlerden 5 kat daha yavaştır. Tek bir istekte birden fazla çağrıldığında ve çok sayıda değişken olduğunda performans sorunu oluşturabilir fakat bir yerde kullanmadım demişsiniz, o yüzden bilmiyorum. Ayrıca IP adresini $request->ip() şeklinde alabilirsiniz.

          Laravellik bir sıkıntı değildir bu.Ha laravelin requesti kendi icinde framework olmasından dolayı zaten pure php gibi değildir tabi,ama sorun laravel kaynaklı değildir.Querylerinizi takibe alın.Mutlaka optimize etmeniz gereken yerler olabilir.Birde böyle fonksiyonlar niye kullanıyorsunuz.Framework zaten yapmıs size bunları.request->ip gibi kullanabilirsiniz @mgsmus un yazdıgı gibi..

          2 ay sonra

          Henüz CPU problemini aşamadık. Basit bir post ve login işleminde, %60 CPU buluyor sistem.

          Sistemimiz istek gönderilen site.com/{subdomain} şeklinde {subdomain} üzerinden çalışıyor. {subdomain} eğer veritabanında var ise veritabanına bağlanıp ilgili {subdomain} e ait veriler çekilerek oturum açma ve yayın bilgilerinin çekilmesi işlemleri yapılıyor.

          Route içeriği:

          Route::get('{subdomain}/giris', 'Auth\DinleyiciLoginController@index')->name('dinleyici.login');
          Route::post('giris', 'Auth\DinleyiciLoginController@login')->name('dinleyici.login.post');
          Route::get('{subdomain}/cikis', 'Auth\DinleyiciLoginController@logout')->name('dinleyici.logout');
          
          Route::middleware('isDinleyici')->group(function () {
              Route::get('{subdomain}', 'Auth\DinleyiciController@index')->name('dinleyici.anasayfa');
              Route::post('yayinYenile', 'Auth\DinleyiciController@yenile')->name('dinleyici.yayinYenile');
          });

          DinleyiciLoginController sayfası içeriği

          public function index($subdomain)
          {
          	$yayinVarMi = Yayinlar::where('subdomain' , $subdomain)->count();
          
          	if($subdomain == '') {
          		$yonlendirme = false;
          	} elseif($yayinVarMi>0) {
          		$yayinBilgisi = Yayinlar::where('subdomain', $subdomain)->first();
          		$yonlendirme = true;
          	} else {
          		$yonlendirme = false;
          	}
          	
          	if($yonlendirme) {
          		$data['subdomain']  = $subdomain;
          		return view('front.auth.login', $data);
          	} else {
          		return abort(404);
          	}
          }

          DinleyiciController sayfası içeriği

          public function index($subdomain)
              {
                  $domain         = $subdomain;
                  $sorgu          = Yayin::where('subdomain' , $subdomain);
                  $yayinVarMi     = $sorgu->count();
          
                  if($domain == '') {
                      return '';
                  } elseif($yayinVarMi>0) {
                      $yayinBilgisi = $sorgu->first();
          
                      if((session('yayin_id') == $yayinBilgisi->id)) {
                          if($yayinBilgisi->sunucu_linki2 == '') {
                              $data['yayinLinki'] = $yayinBilgisi->sunucu_linki1;
                          } else {
                              $data['yayinLinki'] = $yayinBilgisi->sunucu_linki2;
                          }
                          $data['yayinBilgisi']   = $yayinBilgisi;
                          $data['subdomain']      = $domain;
                          return view('front.anasayfa.index4', $data);
                      } else {
                          session()->flush();
                          return redirect()->route('dinleyici.login', $subdomain);
                      }
                  } else {
                      return '';
                  }
              }

          isDinleyici Middleware içeriği:

          public function handle($request, Closure $next)
              {
                  $domain         = ltrim($request->getRequestUri(), '/');
                  $yayinVarMi     = Yayin::where('subdomain' , $domain)->count();
          
                  if($domain == '') {
                      $yayinBilgisi = '';
                      $yonlendirme  = false;
                  } elseif($yayinVarMi > 0) {
                      $yayinBilgisi = Yayin::where('subdomain', $domain)->first();
                      $yonlendirme  = true;
                  } else {
                      $yayinBilgisi = '';
                      $yonlendirme  = false;
                  }
          
                  if(session('dinleyiciOturum')) {
                      return $next($request);
                  } else {
                      if($yonlendirme AND (session('yayin_id') == $yayinBilgisi->id)) {
                          return redirect()->route('dinleyici.login', ['subdomain' => $domain]);//abort(403);
                      } else {
                          return redirect()->route('dinleyici.login', ['subdomain' => $domain]);//abort(403);
                      }
                  }
              }

            alaca33 db sorgularınızı cache'e alabilirsiniz. Yeni güncelleme olduğunda cache temizlersiniz.

            Debugbar kurarak kontrol ederek ilerlerseniz daha kolay olabilir.

              Dostum, Laravelde yeniyim fakat php ve network bilgim mevcut. Laravel kodlarına baktığımda herhangi bi bir şekilde request işlemini çok fazla döndürüp bir cpu işleyecek ilem göremedim. Eğer host satın almadıysanız
              Dedicatedinize girin ve sistemin network ve cpu işlemci bazlı doğru çalıştığından emin olun.
              eğer oda değilse bir cloudflare üzerinden cdn hizmeti alarak 2500 kişinin aynanda giriş sağlamasını beli aralıklarla (cloudflare kendisi otomatik yapıcağı işlemdir.) girmesini sağlar ve böylece yoğun yük ortamı biraz daha azalmış olabilir tabikide üstadlar benden daha iyi olabilir yazılım konusunda belki bi yerde cpu şişiricek bir işlem yapmaya devam ediyordur.

              2 Olarak aldığınız bana göre önerim, server timeout sürelerinin az olmasından kaynaklanmaktadır.
              şu aşamaları takip edin:

              1. web serverinizin çalışma durumunu sağlayan ne ise onun .conf dosyasına
              2. timeout 500
              3. proxytimeout 500
                Yazarak sonrasında ise web servis sağlayıcınızı yenileyerek bu sorunu çözebilirsiniz gibime geliyor. Denemenizde fayda var.

              Anlık birkaç bin kişi giriyor ama girişta yaptığımız sorgulama çok basit ve başka sitede hiçbir işlem yapmıyor ziyaretçiler.

              Tavsiye edildiği üzere cache işlemini araştırdım ve aşağıdaki gibi yaptım. Buna rağmen CPU kullanımı %60'a değmek üzere. Kontrol edip, hata yaptığım yer olup olmadığına bakabilir misiniz?

              App/Cache/Yayinlar.php diye dosya oluşturdum ve içine şunları yazdım:

              <?php
              namespace App\Cache;
              
              use Illuminate\Support\Facades\Cache;
              use Illuminate\Support\Facades\DB;
              
              class Yayinlar
              {
                  public static function bul($subdomain)
                  {
                      $key = "get.{$subdomain}";
                      $cacheKey = "YAYINLAR.".$key;
              
                      $value = Cache::remember($cacheKey, 300, function () use ($subdomain) {
                          return DB::table('yayinlarss')->where('subdomain', '=', $subdomain)->first();
                      });
              
                      return $value;
                  }
              }

              Bunu da LoginController içerisinde şöyle kullandım:

              public function index($subdomain)
                  {
                      $sorgu = Yayinlar::bul($subdomain);
                      if(!empty($sorgu)) {
                          $yayinVarMi = 1;
                      } else {
                          $yayinVarMi = 0;
                      }
              
                      if($subdomain == '') {
                          $yonlendirme = false;
                      } elseif($yayinVarMi>0) {
                          $yayinBilgisi = $sorgu;
                          $yonlendirme = true;
                      } else {
                          $yonlendirme = false;
                      }
              
                      if($yonlendirme) {
                          $data['yayin_adi']   = $yayinBilgisi->yayin_adi;
                          $data['subdomain']  = $subdomain;
                          return view('front.auth.login', $data);
                      } else {
                          return abort(404);
                      }
                  }

              coder2

              Hocam debugbar kurdum ve sorgu sayısı sıfır görünüyor. Cache de çalışıyor görünüyor. Buna rağmen cache yapmadan öncekinden hiç farkı yok. CPU kullanımı hala en üst seviyede.

              Laravel performansı ile ilgili benim bilmediğim birşeyler var sanırım. 🙁

                @alaca33 Hata kayıtlarınıza bakın. /var/log/messages ayrıca sitenin hata kayıtlarını inceleyin. Bu kısımda bir sorun yok ise bir kaç kod ve fonksiyondan oluşan bir php dosyası oluşturun ve stres teste sokun. Disk arızası ve ram arızası işletim sistemi sorunu veya php derleyici sorunu olabilir bir çok şey olabilir. Test etmeniz lazım.

                alaca33 Laravel error log ları ve sunucu log larını kontrol edin o zaman hocam. Sorgularda problem yoksa sunucu tarafında hata oluşuyor olabilir veya kodlarınız biryerlerde loop e giriyor olabilir.