• 06-05-2025, 17:40:51
    #1
    Merhaba arkadaşlar,

    Biz WordPress tabanlı projeler geliştiren bir dijital ajansız. Hem müşterilerimiz hem de kendi işlerimiz için WooCommerce siteleri yapıyoruz. Şu anda Hostinger üzerinden aşağıdaki donanıma sahip bir VDS kullanıyoruz:
    • 8 CPU (3.25 GHz)
    • 31 GB RAM
    • 400 GB NVMe SSD
    • DirectAdmin + AlmaLinux
    • OpenLiteSpeed + LSCache (tüm ayarları yapılmış)
    • Redis kurulu ve aktif
    Bu sunucuda Woodmart teması kullanılan sadece 3 WooCommerce sitesi barındırıyoruz. Bunların ikisi için Yengeç (yengec.co) pazaryeri entegrasyonu kullanıyoruz. Bu platform, WooCommerce Rest API üzerinden sitelere bağlanıp ürünleri güncelliyor.

    Problem:
    Normal zamanlarda API çağrılarının yanıt süresi 1100 - 1800 ms aralığında. Ancak entegrasyon firması aracılığıyla toplu güncellemeler yaptığında, bu süre 50.000 ms'yi bile geçebiliyor. O anda sitelerin yük değerleri 1.5 – 3 aralığından çıkıp 14 – 20 hatta 50’ye kadar fırlıyor. Entegrasyon firması gerekli sürede yanıt alamayınca da timeout hatası diyerek işlemi tekrarlıyor yani sonsuz bir döngüde kalıyoruz. Entegrasyon firması ile görüştüğümüzde bize söyledikleri şu oldu:

    “E-ticaret işlemlerini hızlandırmak için paralel şekilde 100’den fazla worker ile API isteği gönderiyoruz, sunucunuzun bunu karşılayabilmesi gerekir.”

    Sitelerimiz için minimum pagespeed skorlarımız:
    Mobil: 78
    Masaüstü: 90

    LS Cache aktif, nesne önbelleği, rest api cache gibi gerekli tüm ayarlar yapılmış durumda, sitede önyüzde veya admin panelde herhangi bir performans sıkıntısı yok. Ancak bu toplu entegrasyon işlemlerinde ciddi darboğaz oluşuyor, öte yandan biz WooCommerce üzerinden yani admin panelden toplu işlem yaparken bir sorun yaşamıyoruz.

    Sorum şu:
    Bu performans problemi sizce VDS veya Wordpress kaynaklı mı yoksa entegrasyon firmasının API kullanım şekli mi hatalı? Eğer sorun bizdeyse daha güçlü bir altyapıya geçmeyi düşüneceğiz. Benzer deneyim yaşayan ya da çözüm önerisi sunabilecek arkadaşların fikirlerini duymak isteriz.

    Teşekkürler.
  • 06-05-2025, 17:50:23
    #2
    Kesinlikle sunucu sorunu. Bizde Instagram üzerinden fenomenlerle çalışıyoruz 3 ay öncesine kadar her reklamda site çöküyor du. Hâlbuki alt yapı muazzam bir alt yapı. Sonrasında bir proje için farklı bir sunucuya geçtik inanılmaz hiçbir sorun yok. Yani sunucu kaynaklı sorun yaşamışız. Kesinlikle farklı bir sunucudan denemek için hizmet alın
  • 06-05-2025, 18:28:22
    #3
    Size söyledikleri gayet anlaşılır olmuş ama yine de biraz açalım.

    Öncelikle LS Cache, nesne önbelleği veya birtakım hız eklentilerinin konuyla doğrudan alakası yok. İlgili sorun tamamen teknik düzeyde bir konudur yani karşı taraf API kullanarak ürünleri güncelliyor. Bu esnada aynı anda 100'den fazla işlem devreye giriyor. Bu process aşaması devam ederken MySQL-Server optimizesiz ve/veya yetersiz kaldığı için disk aşırı derecede zorlanıyor veya limitler yetersiz/yetkisiz kalıyor. Zorlanan disk de haliyle geç cevap veriyor.

    MySQL sunucuda yüklü olan veritabanınınız hangi motoru (MyISAM veya InnoDB) kullanıyor? MyISAM kullanıyorsa veritabanı boyutu nedir? InnoDB kullanıyorsa MySQL-Server konfigürasyonu yapıldı mı? Yapıldıysa RAM için ne kadar kaynak ayırdınız? Örneğin tüm tabloları InnoDB kullandığınızı varsayalım. RAM 32GB olduğuna göre ayırmanız gereken kaynak 20-25GB (hesaplama şart) oluyor. InnoDB, MyISAM'e göre çok daha fazla RAM'e ihtiyaç duyuyor ve bunu sağlamazsanız böyle zorlanmalarda etkisiz kalır.

    Nesne önbelleğinde hangi server'ı (Redis veya Memcached) kullanıyorsanız, RAM için ne kadar kaynak ayırdınız? Web sunucunuz OpenLiteSpeed böyle yüklü işlemlerde zorlanıyor olabilir veya limit yetersizliğinden ötürü cevap vermekte güçlü çekebilir ona da bakmak lazım. Bir de bahsettiğiniz VDS değil, VPS olması lazım çünkü bildiğim kadarıyla Hostinger'de VDS yok.

    Aslında bütün bunlarla uğraşmak yerine daha makul şeyler yapılabilirdi. Tavsiyem, web-server'ı Nginx seçmeniz (ama iyi optimize ederek), ardından MySQL-Server optimizesi yapmanızdır. Yazılımda kullanmadığınız gereksiz şeyler varsa onları da kaldırmanızdır. Nginx hariç diğerlerini zaten yaptıysanız o zaman daha büyük bir sunucuya geçebilirsiniz ama dedicated yani fiziksel sunucuya geçmeniz lazım. İsterseniz epey memnun kalacağınız bir yer önerebilirim. Zaten böyle işlerle uğraşıyorsanız daha güçlü bir sunucuya geçmenizde fayda var.

    Bir kere daha belirteyim, gelen geçen şu Redis'i öneriyor ama kimse konfigürasyondan bahsetmiyor. Redis düzgün yapılandırılmazsa RAM'den çok fazla yer. Hatta yanlış ayarlanırsa diskten yer yani gereksiz yere sunucu kaynaklarını tüketir. Aslında Redis ve Memcached veri giriş çıkışı çok yüksek sitelerde lazım. Örneğin, anlık 1000 kullanıcının girip işlem yaptığı bir websitesinde ideal olurlar.

    Bellekleme olmadan çıkan sunucu yanıt süresi nedir ona bakmak lazım yani saf haliyle aldığınız yanıt nedir bakmanız gerekiyor. Bellekleme varken bunun tespit etmek mümkün değil ne yazık ki. İsterseniz bellekleme yapmadan kontrol edin bakalım ne çıkacak. Tatmin edici rakamlar çıkmazsa yazılımın da elden geçmesi gerekecektir.

    Hostinger çok sağlam bir firmadır herkese öneririm ama 32GB RAM + 8vCPU yerine hiç değilse 16CPU verseler (veya seçilebilse) güzel olacak ama henüz o aşamaya geçmediler. Bu arada CPU fiziksel, vCPU sanal oluyor. Kısacası ciddi bir API işleminde sanal vCPU kullanmak yerine fiziksel kullanmak bu noktada daha makul olurdu ama bunlar en son düşünülecek şeyler.
  • 06-05-2025, 21:53:48
    #4
    EfendiBey adlı üyeden alıntı: mesajı görüntüle
    Size söyledikleri gayet anlaşılır olmuş ama yine de biraz açalım.

    Öncelikle LS Cache, nesne önbelleği veya birtakım hız eklentilerinin konuyla doğrudan alakası yok. İlgili sorun tamamen teknik düzeyde bir konudur yani karşı taraf API kullanarak ürünleri güncelliyor. Bu esnada aynı anda 100'den fazla işlem devreye giriyor. Bu process aşaması devam ederken MySQL-Server optimizesiz ve/veya yetersiz kaldığı için disk aşırı derecede zorlanıyor veya limitler yetersiz/yetkisiz kalıyor. Zorlanan disk de haliyle geç cevap veriyor.

    MySQL sunucuda yüklü olan veritabanınınız hangi motoru (MyISAM veya InnoDB) kullanıyor? MyISAM kullanıyorsa veritabanı boyutu nedir? InnoDB kullanıyorsa MySQL-Server konfigürasyonu yapıldı mı? Yapıldıysa RAM için ne kadar kaynak ayırdınız? Örneğin tüm tabloları InnoDB kullandığınızı varsayalım. RAM 32GB olduğuna göre ayırmanız gereken kaynak 20-25GB (hesaplama şart) oluyor. InnoDB, MyISAM'e göre çok daha fazla RAM'e ihtiyaç duyuyor ve bunu sağlamazsanız böyle zorlanmalarda etkisiz kalır.

    Nesne önbelleğinde hangi server'ı (Redis veya Memcached) kullanıyorsanız, RAM için ne kadar kaynak ayırdınız? Web sunucunuz OpenLiteSpeed böyle yüklü işlemlerde zorlanıyor olabilir veya limit yetersizliğinden ötürü cevap vermekte güçlü çekebilir ona da bakmak lazım. Bir de bahsettiğiniz VDS değil, VPS olması lazım çünkü bildiğim kadarıyla Hostinger'de VDS yok.

    Aslında bütün bunlarla uğraşmak yerine daha makul şeyler yapılabilirdi. Tavsiyem, web-server'ı Nginx seçmeniz (ama iyi optimize ederek), ardından MySQL-Server optimizesi yapmanızdır. Yazılımda kullanmadığınız gereksiz şeyler varsa onları da kaldırmanızdır. Nginx hariç diğerlerini zaten yaptıysanız o zaman daha büyük bir sunucuya geçebilirsiniz ama dedicated yani fiziksel sunucuya geçmeniz lazım. İsterseniz epey memnun kalacağınız bir yer önerebilirim. Zaten böyle işlerle uğraşıyorsanız daha güçlü bir sunucuya geçmenizde fayda var.

    Bir kere daha belirteyim, gelen geçen şu Redis'i öneriyor ama kimse konfigürasyondan bahsetmiyor. Redis düzgün yapılandırılmazsa RAM'den çok fazla yer. Hatta yanlış ayarlanırsa diskten yer yani gereksiz yere sunucu kaynaklarını tüketir. Aslında Redis ve Memcached veri giriş çıkışı çok yüksek sitelerde lazım. Örneğin, anlık 1000 kullanıcının girip işlem yaptığı bir websitesinde ideal olurlar.

    Bellekleme olmadan çıkan sunucu yanıt süresi nedir ona bakmak lazım yani saf haliyle aldığınız yanıt nedir bakmanız gerekiyor. Bellekleme varken bunun tespit etmek mümkün değil ne yazık ki. İsterseniz bellekleme yapmadan kontrol edin bakalım ne çıkacak. Tatmin edici rakamlar çıkmazsa yazılımın da elden geçmesi gerekecektir.

    Hostinger çok sağlam bir firmadır herkese öneririm ama 32GB RAM + 8vCPU yerine hiç değilse 16CPU verseler (veya seçilebilse) güzel olacak ama henüz o aşamaya geçmediler. Bu arada CPU fiziksel, vCPU sanal oluyor. Kısacası ciddi bir API işleminde sanal vCPU kullanmak yerine fiziksel kullanmak bu noktada daha makul olurdu ama bunlar en son düşünülecek şeyler.
    Doğru diyorsunuz VPS olarak ifade etmem lazımdı. Ek olarak Cloudflare kullanıldığı detayını da eklemeyi unutmuşum. Sorduklarınıza gelecek olursak. 3 site var entegrasyon olmayanın database 912MB, diğer iki sitenin 230MB ve 136MB.

    LS Cache'yi devredışı bırakıp entegrasyon üzerinden API ile stok güncelleme yaptım:
    Method: PUT | Request: /wc/v2/products/3726 | Status: 200 | Elapsed Time: 1,169ms | Response Length: 21,695

    LS Cache'yi etkinleştirip entegrasyon üzerinden aynı üründe stok güncelleme yaptım:
    Method: PUT | Request: /wc/v2/products/3726 | Status: 200 | Elapsed Time: 1,221ms | Response Length: 21,695

    MYSQL Server detayları şöyle:
    10.6.20-MariaDB-log MariaDB Server
    Veritabanı tabloları: InnoDB
    /etc/my.cnf dosyası aşağıdaki gibi:

    [mysqld]
    max_allowed_packet=64M
    local-infile=0
    innodb_buffer_pool_size = 12G
    innodb_buffer_pool_instances = 8
    innodb_flush_log_at_trx_commit = 2
    innodb_log_buffer_size = 16M
    innodb_log_file_size = 512M
    innodb_read_io_threads = 8
    innodb_write_io_threads = 8
    innodb_io_capacity = 1000
    innodb_io_capacity_max = 2000
    query_cache_type = 0
    query_cache_size = 0
    max_connections = 500
    thread_cache_size = 128
    table_open_cache = 4000
    max_allowed_packet = 16M
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/slow-query.log
    long_query_time = 2
    socket=/var/lib/mysql/mysql.sock

    /etc/redis/redis.conf içeriği:
    maxmemory 4gb
    maxmemory-policy allkeys-lru

    /etc/sysctl.conf içeriği:
    vm.swappiness=10
    fs.file-max = 1000000
    net.ipv4.tcp_fin_timeout = 15
    net.core.netdev_max_backlog = 65536

    php.ini sonundaki içerik:
    memory_limit = 512M
    max_execution_time = 300
    max_input_time = 300
    post_max_size = 64M
    upload_max_filesize = 32M
    max_input_vars = 10000
    date.timezone = Europe/Istanbul
    expose_php = Off
    opcache.enable = 1
    opcache.memory_consumption = 256
    opcache.interned_strings_buffer = 16
    opcache.max_accelerated_files = 16229
    opcache.revalidate_freq = 0
    opcache.fast_shutdown = 1
    opcache.enable_cli = 1
    opcache.jit = 1255
    opcache.jit_buffer_size = 128M

    wp-config.php içeriği:
    define( 'WP_MEMORY_LIMIT', '1024M' );
    define('WP_REDIS_HOST', '127.0.0.1');
    define('WP_REDIS_PORT', 6379);
    define('WP_REDIS_TIMEOUT', 1);
    define('WP_REDIS_READ_TIMEOUT', 1);
    define('WP_REDIS_DATABASE', 0);
    define('WP_REDIS_PREFIX', 'alanadi_');
  • 06-05-2025, 23:13:54
    #5
    Bütün bunlara buradan tek tek cevap vermek olmaz çünkü bu hesaplamalar ve belirlenen değerler ne zaman neye göre yapıldı bilmiyorum. Neyse, özelden mesajınızı cevapladım.