• 20-04-2020, 00:00:11
    #10
    Oldukça yararlı bir yazı olmuş teşekkürler. Benim farklı bir sorum olacak. Veritabanında tablo yapısını bir türlü karar veremiyorum. Sitede aylık 100 bin içerik ekleme veya güncelleme olacak. Bunun yanında aylık olarak 1 milyon üzerinden görüntüleme olacak. Bu sitede hızlı bir veirtabanı oluşturmak için bazı bilgileri statik mi dinamik yapmalıyım. Örneğin özellikler tablosu yapıp 2 tablo mu yapmak daha mantıklı yoksa 1 tabloda 10 sütun mu yapmak daha mantıklı olur? Bu durum için öneriniz nedir?
  • 20-04-2020, 02:02:07
    #11
    A1K9 adlı üyeden alıntı: mesajı görüntüle
    Oldukça yararlı bir yazı olmuş teşekkürler. Benim farklı bir sorum olacak. Veritabanında tablo yapısını bir türlü karar veremiyorum. Sitede aylık 100 bin içerik ekleme veya güncelleme olacak. Bunun yanında aylık olarak 1 milyon üzerinden görüntüleme olacak. Bu sitede hızlı bir veirtabanı oluşturmak için bazı bilgileri statik mi dinamik yapmalıyım. Örneğin özellikler tablosu yapıp 2 tablo mu yapmak daha mantıklı yoksa 1 tabloda 10 sütun mu yapmak daha mantıklı olur? Bu durum için öneriniz nedir?
    matematiğini öyle hesaplamalısın ki veri çekerken 2 tablonun ustunde join yapmadan cekemezsin ve join 2 tablo üstünde ciddi derecede index değerler çok iyi verilse bile yoracaktır.

    benim önerim verileri belirli aralıklarla farklı keylerde cachelemen ve kendine ozgu tek bir obje haline getirmen ve sonrasında girilecek yada cıkarılacak verileri bu obje üstünde yapip en son cache suresi bitmeden kısa bir süre önce veritabanıyla karşılaştırıp benzer değilse veri tabanını güncellemen olacaktır.

    Yada direk mongodb kullan
  • 26-01-2021, 02:33:56
    #12
    Caesar adlı üyeden alıntı: mesajı görüntüle
    Türkiye ve yurt dışında ağır yüklü (Günlük 500K+) web sitelerine ve sunucularına optimizasyon yapan bir kişi olarak (Bu bir reklam değildir tam tersi yararlanmanız içindir.) gördüğüm en büyük sorun; insanların database konusunda özellikle mysql bilgisiz olmaları ve optimizasyonları internette gördükleri paylaşılan onlarla alakası olmayan configurasyon dosyalarına göre yapmalarıdır.

    Bir kullanıcının yapacağı en büyük hata kendisine ait olmayan bir konfigurasyon dosyasını başka kişide iyi sonuc verdi diye yüklemesidir. Çünkü Mysql gibi veri tabanlarındaki konfigurasyon ayarları tamamen sizin sunucunuzun ram, işlemci ve yeterli hard disk miktanınıza göre yapılması gerekmektedir.

    Konuyu cok fala uzatmadan bir kaç püf noktayı önemli olan sizlere sunacak ve bunu baz alıp uyguladığınızda %500 den fazla olabilecek bir hızlandırma tekniğine sahip olacağınızı belirtmek isterim.

    Öncelikle artık teknolojide geliştiği için ve fiyatlar eskisine göre daha ucuz olduğu için yetersiz olarak sınıflandırılan sunucular pek piyasada kalmadı. Artık dedicated dediğimiz kişiye özgü tek kişi kullanımlık sunucular en kötü 16gb ram 8 vcpu ya sahip. Eğer ki bu tür bir sunucuya sahipseniz ve sunucuda barınan web sitesi sayısı hosting gibi şirketlerdeki gibi 50 den fazla değilse. (50 hoşgörülü bir rakam 1000 demek lazımdıda neyse) Query Cache yöntemi kullanmak zorunda değilsiniz.

    Query Cache dediğimiz olay mysql'de sorguları hard diskte yazıp bir daha cağrıldığında cache suresi bitmediyse direk hard diskten okuyan bir yöntemdir. Hard diskten veri okuma ve veri yazma olayı emin olun normal connection kurmaya göre ekstra daha yavaştır. Çünkü bu işlem anında mysql tablolarınızı lock edecek ve işlem sonlanana kadar gelen diğer query isteklerini wait statusunde bekletecektir.

    Bu bekletme işi ne kadar uzun surerse ve o sure zardında ne kadar fazla insert tipi query gelirse sırada bekleyen işlemler artacak ve kaçınılmaz cpu kullanımının %90lara vardığı load'ın ise %30 lara cıktığı bir kasma problemi oluşacaktır. Ve bu işlem katlanarak artacak mysql restart edilip bekleyen queryler temizlenene kadar da durmayacaktır.

    Peki çözüm nedir? Bu gibi az siteli sunucular query cache = 0 belirtilerek cache tutulmaması istenir. Genellikle türk kullanıcılar her web sitesini wordpress altyapısı olarak kullandığını varsayarsak. İlla bir cache sistemi kullanılmak isteniyorsa (kesinlikle öneriyorum) php versiyonunuza göre (php 7.1altı memcache, 7.1 ve üstü memcached) memcached sınıfındanyararlanıp wp queryleri memcache de tutabilirler ve günümüzün en çok kullanılan en profesyonel ve hızlı cache altyapısının memcached olduğunu unutmayın.

    Mangodb'de memcache yapısı default olarak kullanıldığı için mambodb kullananlar mysql yerine ekstra birşey yapmalarına gerek yoktur. Hatta bilgisi ve imkanı olanlar mysql yerine mambodb kullanmaları çok daha iyi olacaktır. Dünyanın en fazla veri ağına sahip olan yüklü web siteleri facebook gibi tamamen ram cache yontemine bağlı mambodb kullanmaktadır bunuda ekstra bilgi olarak geçelim.

    Gelelim illa query cache kullanmak isteyen kullanıcılara. Query cache eğer kullandığınız server side dilinde örneğin php hiç bir cache sistem kullanmıyorsanız kullanılabilecek bir yöntemdir.

    Bakın bir web sitesinde cache önem sıralaması şu şekildedir.

    1. Browser Cache -> Scriting Cache -> HTTPD Cache -> SQL Cache -> HDD Cache

    Yani bu ne anlama geliyor. Öncelikle eğer browser cache ayarlanmadıysa, üstüne php de de cache kullanmıyorsanız (memcache, xcache vs) bari httpd cache kullanılıyor mu diye bakalım (apache yada nginx cache) oda mı yok aman tanrım o zaman sql cache yapalım (query cache) odamı yok bariz hdd ye yazalım.

    Yani query cache en son bakılacak ve kullanılacak yöntemler arasında yer alır. Bir web sitesini ayakta tutacak ana cache browser cache ve php nin kullanacağı cache yöntemleridir. Vehatta yeni web teknolojisiyle workers dediğimiz tamamen local bilgisayarda cache tutmayı sağlayan sistemler vardır ve bunlar şuanda en cok performans sağlayan cache yöntemleridir. Sunucuya isteği göndermeden tamamen bağlantının localinde tuttuğu cache ile herşeyi halleder. Localin net bağlantısı olmasa bile web sitesize uygulamaymış gibi bağlanabilir bu sayede.

    Ama hala query cache kullandığınızı düşünürsek siz teknoloji bakımından workers'a göre taş devrinde olduğunuzu varsaymaz zorunda kalırız ve önce taş devrini atlatmak adına bililenmemiz gerekir.

    Madem bilgisiziz ve senelerdir kullandığımız yöntemi kullanıyorz o zaman nasıl en iyi hale getiriz diye düşüneceksek küçük bir hileden bahsedeceğim.

    Bu hile sunucunuzun sahip olduğu ram'in belirli bölünü hard disk gibi gösterip sunucuya yutturarak tüm query cache memory de tutmaktır. Çünkü ram'e yazılan veri hızı hard diske yazılan veri hızına göre 10.000 kat daha hızlıdır. Aynı şekilde veri okuma içinde geçerli.

    Ne yapıyoruz bunun için:

    Öncelikle sunucumuzun ram miktarınu öğreniyoruz. Diyelim ki 32 GB ram'e sahibiz o zaman bunun 16 gb'ını bu işlem için ayırabilirim olarak düşünmek mantıklı bir matematiksel işlemdir.

    Sunucularda mysql yine aynı isimli mysql user uzerinden işlem görür. Mysql user'ın pid ve uid değerlerini buluyoruz. Sunucumuza ssh ile root olarak bağlanıp aşağıda gördüğümüzü yazıyoruz.

    id mysql
    bunun karşılı olarak şu şekilde bir sonuc dönecektir.

    uid=27(mysql) gid=27(mysql) groups=27(mysql)
    Bu sonuctan uid, gid ve groups değerlerinin idsini kaydedelim. Daha sonra tamamen hesapladığımız ram miktarını aktaracağımız sahte bir tmp dizini yaratıyoruz. adı tmpfs olsun. Bunun için

    mkdir /var/tmpfs
    komutunu yazarak var bölümüne ekliyoruz. Daha sonra işletim sisteminin bağlı depolama birimlerini yöneten konfigurasyon dosyasını vim yada nano komutu ile editleyeceğiz.

    nano /etc/fstab
    ile dosyayı açarak aşağıda gördümüz satırı en sonra eklememiz lazım. ama aşağıdaki satırdaki uid ve gid değerleri yukarıda id mysql komutuyla aldığımız değerlerle birebir olacak. Bunu siz kendi sunucunuzdaki uid ve gid değerlerine göre değiştirmelisiniz.

    tmpfs /var/tmpfs tmpfs rw,uid=27,gid=27,size=16G,nr_inodes=10k,mode=0700 0 0
    Ramiz 32GB idi yarısını 16G olarak mysql uuidine yetkili tmp klasörü olarak belittik. Daha sonra dosyayı bu şekilde save edip son olarak restarta gerek olmadan yeni depolama arabirimini tanıması için aşağıdaki komutu giriyoruz.

    mount -a
    Artık sunucumuz sanki yeni bir depolama birimi takmışız gibi yeni bir bölüm tanıyacaktır. Ve bu bölüm aslında ram olacaktır ama sunucuyu hdd olarak kandırdığımız için ram değil bu birimi bir depolama birimi olarak görecektir.

    Son olarak mysql conf dosyamıza gidiyoruz

    nano /etc/my.cnf
    hemen [mysqld] bölümüne;

    tmpdir=/var/tmpfs
    tmp_table_size=2K
    Alanını ekliyoruz ve mysql sunucusuna restart atıyoruz. Bundan sonra cacheler ramde tutulacak ve hdd verilerine göre çok daha hızlı olacaktır.

    Bu arada küçük bir püf nokta vereyim.

    Lütfen tablo yapılarınızı MyIsam kullanmayınız. Sene 2020 MyIsam bundan 10 sene önce dandik sunucularda performanslı olabilirdi fakat mysql tablo yapısı her insert değer için tüm tabloyu lock edip beklemeye alır insert işlemi bitene kadar o yüzden bunun yerine async calışan ve lock etmeyen innodb kullanın.

    Tek sorgularda myisam'e göre 0.002 saniye yavaş olabilir fakat tüm işlemler baz alındığında 50 kat daha performans sağladığını göreceksiniz ve bu kanıtlanmış bir gerçektir.

    Saygılar.
    Bilgilendirmeniz için çok teşekkür ederim. Optimizasyon olarak bir çok konu mevcut ve her seferinde konu öyle yada böyle mysql tuner scriptine geliyor. Sizin bahsettiğiniz yöntem ise gerçekten bana kalırsa mysql tunerin o kadar yönergesinden çok daha iyi. Sizden ricam hosting sunucuları için önerebileceğiniz bu şekilde yapılandırma ayarları var mı acaba? Ortalama 200 hesap için, 16gb ram ve 8cpu olduğunu varsayarsak neler önerebilirsiniz?
  • 18-02-2021, 00:45:56
    #13
    MyIsam innobb yaptım sitemdeki yavaşlık düzeldi bilgi için teşekkürler
  • 25-01-2022, 02:57:06
    #14
    Mira.Net.TR adlı üyeden alıntı: mesajı görüntüle
    Bilgilendirmeniz için çok teşekkür ederim. Optimizasyon olarak bir çok konu mevcut ve her seferinde konu öyle yada böyle mysql tuner scriptine geliyor. Sizin bahsettiğiniz yöntem ise gerçekten bana kalırsa mysql tunerin o kadar yönergesinden çok daha iyi. Sizden ricam hosting sunucuları için önerebileceğiniz bu şekilde yapılandırma ayarları var mı acaba? Ortalama 200 hesap için, 16gb ram ve 8cpu olduğunu varsayarsak neler önerebilirsiniz?
    Mesajınızı şuan gördüm o yüzden kusura bakmayın şimdi yanıtlayabileceğim. Bu gibi durumalrda siz ne kadar kusursuzca optimizasyon yaparsanız yapın bir müşteri gelir öyle dandik kodlanmış bir script atarki bir anda cpu kullanımını %100 e cekebilir.

    Sonucta kişilerin özel dosya optimizasyonlarına karışamaycağınız gibi bu durumda size düşen görev cpuyu limitlemek olacaktır. %1 %2 max %5 cpu kullanımını geçmemeleri lazım. Geçiryorlarsa zaten büyük bir optimizasyon sorunları var anlamına gelir.
  • 17-05-2022, 18:30:00
    #15
    Güzel bilgiler vermişsiniz.
    Teşekkürler

    256 GB ram vereceğimizde ayarları nasıl yapmamız gerekir?

    tmpfs /var/tmpfs tmpfs rw,uid=27,gid=27,size=16G,nr_inodes=10k,mode=0700 0 0

    burada size 16 GB yazmışsınız 32 gb ram ın yarısını vermişsiniz.
    sadece mysql sunucusu için ayrılan bir sunucuda neler yapılmasını önerirsiniz?
  • 23-05-2022, 20:55:35
    #16
    mysql 8 mi yoksa mariadb mi önerirsiniz
  • 11-05-2023, 18:17:51
    #17
    Caesar adlı üyeden alıntı: mesajı görüntüle
    Türkiye ve yurt dışında ağır yüklü (Günlük 500K+) web sitelerine ve sunucularına optimizasyon yapan bir kişi olarak (Bu bir reklam değildir tam tersi yararlanmanız içindir.) gördüğüm en büyük sorun; insanların database konusunda özellikle mysql bilgisiz olmaları ve optimizasyonları internette gördükleri paylaşılan onlarla alakası olmayan configurasyon dosyalarına göre yapmalarıdır.

    Bir kullanıcının yapacağı en büyük hata kendisine ait olmayan bir konfigurasyon dosyasını başka kişide iyi sonuc verdi diye yüklemesidir. Çünkü Mysql gibi veri tabanlarındaki konfigurasyon ayarları tamamen sizin sunucunuzun ram, işlemci ve yeterli hard disk miktanınıza göre yapılması gerekmektedir.

    Konuyu cok fala uzatmadan bir kaç püf noktayı önemli olan sizlere sunacak ve bunu baz alıp uyguladığınızda %500 den fazla olabilecek bir hızlandırma tekniğine sahip olacağınızı belirtmek isterim.

    Öncelikle artık teknolojide geliştiği için ve fiyatlar eskisine göre daha ucuz olduğu için yetersiz olarak sınıflandırılan sunucular pek piyasada kalmadı. Artık dedicated dediğimiz kişiye özgü tek kişi kullanımlık sunucular en kötü 16gb ram 8 vcpu ya sahip. Eğer ki bu tür bir sunucuya sahipseniz ve sunucuda barınan web sitesi sayısı hosting gibi şirketlerdeki gibi 50 den fazla değilse. (50 hoşgörülü bir rakam 1000 demek lazımdıda neyse) Query Cache yöntemi kullanmak zorunda değilsiniz.

    Query Cache dediğimiz olay mysql'de sorguları hard diskte yazıp bir daha cağrıldığında cache suresi bitmediyse direk hard diskten okuyan bir yöntemdir. Hard diskten veri okuma ve veri yazma olayı emin olun normal connection kurmaya göre ekstra daha yavaştır. Çünkü bu işlem anında mysql tablolarınızı lock edecek ve işlem sonlanana kadar gelen diğer query isteklerini wait statusunde bekletecektir.

    Bu bekletme işi ne kadar uzun surerse ve o sure zardında ne kadar fazla insert tipi query gelirse sırada bekleyen işlemler artacak ve kaçınılmaz cpu kullanımının %90lara vardığı load'ın ise %30 lara cıktığı bir kasma problemi oluşacaktır. Ve bu işlem katlanarak artacak mysql restart edilip bekleyen queryler temizlenene kadar da durmayacaktır.

    Peki çözüm nedir? Bu gibi az siteli sunucular query cache = 0 belirtilerek cache tutulmaması istenir. Genellikle türk kullanıcılar her web sitesini wordpress altyapısı olarak kullandığını varsayarsak. İlla bir cache sistemi kullanılmak isteniyorsa (kesinlikle öneriyorum) php versiyonunuza göre (php 7.1altı memcache, 7.1 ve üstü memcached) memcached sınıfındanyararlanıp wp queryleri memcache de tutabilirler ve günümüzün en çok kullanılan en profesyonel ve hızlı cache altyapısının memcached olduğunu unutmayın.

    Mangodb'de memcache yapısı default olarak kullanıldığı için mambodb kullananlar mysql yerine ekstra birşey yapmalarına gerek yoktur. Hatta bilgisi ve imkanı olanlar mysql yerine mambodb kullanmaları çok daha iyi olacaktır. Dünyanın en fazla veri ağına sahip olan yüklü web siteleri facebook gibi tamamen ram cache yontemine bağlı mambodb kullanmaktadır bunuda ekstra bilgi olarak geçelim.

    Gelelim illa query cache kullanmak isteyen kullanıcılara. Query cache eğer kullandığınız server side dilinde örneğin php hiç bir cache sistem kullanmıyorsanız kullanılabilecek bir yöntemdir.

    Bakın bir web sitesinde cache önem sıralaması şu şekildedir.

    1. Browser Cache -> Scriting Cache -> HTTPD Cache -> SQL Cache -> HDD Cache

    Yani bu ne anlama geliyor. Öncelikle eğer browser cache ayarlanmadıysa, üstüne php de de cache kullanmıyorsanız (memcache, xcache vs) bari httpd cache kullanılıyor mu diye bakalım (apache yada nginx cache) oda mı yok aman tanrım o zaman sql cache yapalım (query cache) odamı yok bariz hdd ye yazalım.

    Yani query cache en son bakılacak ve kullanılacak yöntemler arasında yer alır. Bir web sitesini ayakta tutacak ana cache browser cache ve php nin kullanacağı cache yöntemleridir. Vehatta yeni web teknolojisiyle workers dediğimiz tamamen local bilgisayarda cache tutmayı sağlayan sistemler vardır ve bunlar şuanda en cok performans sağlayan cache yöntemleridir. Sunucuya isteği göndermeden tamamen bağlantının localinde tuttuğu cache ile herşeyi halleder. Localin net bağlantısı olmasa bile web sitesize uygulamaymış gibi bağlanabilir bu sayede.

    Ama hala query cache kullandığınızı düşünürsek siz teknoloji bakımından workers'a göre taş devrinde olduğunuzu varsaymaz zorunda kalırız ve önce taş devrini atlatmak adına bililenmemiz gerekir.

    Madem bilgisiziz ve senelerdir kullandığımız yöntemi kullanıyorz o zaman nasıl en iyi hale getiriz diye düşüneceksek küçük bir hileden bahsedeceğim.

    Bu hile sunucunuzun sahip olduğu ram'in belirli bölünü hard disk gibi gösterip sunucuya yutturarak tüm query cache memory de tutmaktır. Çünkü ram'e yazılan veri hızı hard diske yazılan veri hızına göre 10.000 kat daha hızlıdır. Aynı şekilde veri okuma içinde geçerli.

    Ne yapıyoruz bunun için:

    Öncelikle sunucumuzun ram miktarınu öğreniyoruz. Diyelim ki 32 GB ram'e sahibiz o zaman bunun 16 gb'ını bu işlem için ayırabilirim olarak düşünmek mantıklı bir matematiksel işlemdir.

    Sunucularda mysql yine aynı isimli mysql user uzerinden işlem görür. Mysql user'ın pid ve uid değerlerini buluyoruz. Sunucumuza ssh ile root olarak bağlanıp aşağıda gördüğümüzü yazıyoruz.

    id mysql
    bunun karşılı olarak şu şekilde bir sonuc dönecektir.

    uid=27(mysql) gid=27(mysql) groups=27(mysql)
    Bu sonuctan uid, gid ve groups değerlerinin idsini kaydedelim. Daha sonra tamamen hesapladığımız ram miktarını aktaracağımız sahte bir tmp dizini yaratıyoruz. adı tmpfs olsun. Bunun için

    mkdir /var/tmpfs
    komutunu yazarak var bölümüne ekliyoruz. Daha sonra işletim sisteminin bağlı depolama birimlerini yöneten konfigurasyon dosyasını vim yada nano komutu ile editleyeceğiz.

    nano /etc/fstab
    ile dosyayı açarak aşağıda gördümüz satırı en sonra eklememiz lazım. ama aşağıdaki satırdaki uid ve gid değerleri yukarıda id mysql komutuyla aldığımız değerlerle birebir olacak. Bunu siz kendi sunucunuzdaki uid ve gid değerlerine göre değiştirmelisiniz.

    tmpfs /var/tmpfs tmpfs rw,uid=27,gid=27,size=16G,nr_inodes=10k,mode=0700 0 0
    Ramiz 32GB idi yarısını 16G olarak mysql uuidine yetkili tmp klasörü olarak belittik. Daha sonra dosyayı bu şekilde save edip son olarak restarta gerek olmadan yeni depolama arabirimini tanıması için aşağıdaki komutu giriyoruz.

    mount -a
    Artık sunucumuz sanki yeni bir depolama birimi takmışız gibi yeni bir bölüm tanıyacaktır. Ve bu bölüm aslında ram olacaktır ama sunucuyu hdd olarak kandırdığımız için ram değil bu birimi bir depolama birimi olarak görecektir.

    Son olarak mysql conf dosyamıza gidiyoruz

    nano /etc/my.cnf
    hemen [mysqld] bölümüne;

    tmpdir=/var/tmpfs
    tmp_table_size=2K
    Alanını ekliyoruz ve mysql sunucusuna restart atıyoruz. Bundan sonra cacheler ramde tutulacak ve hdd verilerine göre çok daha hızlı olacaktır.

    Bu arada küçük bir püf nokta vereyim.

    Lütfen tablo yapılarınızı MyIsam kullanmayınız. Sene 2020 MyIsam bundan 10 sene önce dandik sunucularda performanslı olabilirdi fakat mysql tablo yapısı her insert değer için tüm tabloyu lock edip beklemeye alır insert işlemi bitene kadar o yüzden bunun yerine async calışan ve lock etmeyen innodb kullanın.

    Tek sorgularda myisam'e göre 0.002 saniye yavaş olabilir fakat tüm işlemler baz alındığında 50 kat daha performans sağladığını göreceksiniz ve bu kanıtlanmış bir gerçektir.

    Saygılar.
    Cyberpanelde de işe yarar mı?
    Paylaşım için teşekkürler.