Anlık 2500 kişi yüklenince site çökmesi hk.
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 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..
- Düzenlendi
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:
- web serverinizin çalışma durumunu sağlayan ne ise onun .conf dosyasına
- timeout 500
- proxytimeout 500
Yazarak sonrasında ise web servis sağlayıcınızı yenileyerek bu sorunu çözebilirsiniz gibime geliyor. Denemenizde fayda var.
- Düzenlendi
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);
}
}
@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.