Stres Testi

Stres testi sonuçlarını hangi faktörler etkiler?

  • Stres makinesi ile sunucu arasındaki ağ gecikmesi (iç ağ veya yerel makine ile stres testi yapılması önerilir)
  • Stres makinesi ile sunucu arasındaki bant genişliği (iç ağ veya yerel makine ile stres testi yapılması önerilir)
  • HTTP keep-alive'ın etkin olup olmadığı (açık olması önerilir)
  • Eşzamanlı bağlantı sayısının yeterliliği (dış ağ stres testlerinde mümkün olan en yüksek eşzamanlı bağlantının açılması önerilir)
  • Sunucu tarafı işlem sayısının makul olup olmadığı (helloworld iş süreci sayısının CPU sayısıyla aynı olması, veritabanı iş süreci sayısının CPU'nun dört katı veya daha fazla olması önerilir)
  • İşlemin kendi performansı (örneğin dış ağ veritabanı kullanılıp kullanılmadığı)

HTTP keep-alive nedir?

HTTP Keep-Alive mekanizması, tek bir TCP bağlantısı üzerinde birden fazla HTTP isteği ve yanıtı göndermek için kullanılan bir tekniktir ve performans test sonuçları üzerinde büyük bir etkiye sahiptir; keep-alive kapatıldığında QPS iki katı azalabilir.
Şu anda tüm tarayıcılar varsayılan olarak keep-alive'ı açmaktadır, yani tarayıcı belirli bir HTTP adresine eriştikten sonra bağlantıyı geçici olarak kapatmadan tutar ve sonraki istekte bu bağlantıyı kullanarak performansı artırır.
Stres testleri sırasında keep-alive'ın açık olması önerilir.
Ayrıca, keep-alive kapatıldığında, istemcinin yerel portu çok hızlı bir şekilde timewait durumuyla dolacaktır ve toplam istek sayısı belirli bir sayıyı (genellikle yaklaşık 28.000 civarı) aştığında başarısız istekler ortaya çıkacaktır.

Stres testi sırasında HTTP keep-alive nasıl açılır?

Eğer ab programı ile stres testi yapıyorsanız -k parametresini eklemeniz gerekir, örneğin ab -n100000 -c200 -k http://127.0.0.1:8787/.
apipost'un, keep-alive'ı etkinleştirmek için yanıt başlığında gzip başlığını göndermesi gerekir (apipost'un hatası, aşağıdaki gibi).
Diğer stres testi programları genellikle varsayılan olarak açmaktadır.

Neden dış ağ stres testinde QPS çok düşük?

Dış ağ gecikmeleri nedeniyle QPS'nin düşük olması normal bir durumdur. Örneğin, baidu sayfasını test ettiğinizde QPS yalnızca birkaç düzine olabilir.
İç ağ veya yerel makine ile stres testi yapmanız, ağ gecikmesinin etkisini ortadan kaldırır.
Dış ağda test yapmanız gerekiyorsa, bant genişliğinin yeterli olmasını sağlamak koşuluyla eşzamanlı bağlantı sayısını artırarak verimliliği artırabilirsiniz.

Neden nginx proxy kullanıldığında performans düşüyor?

nginx çalışması her zaman sistem kaynaklarını tüketir. Aynı zamanda, nginx ile webman arasındaki iletişim de belirli bir miktarda kaynak tüketir.
Ancak sistemin kaynakları sınırlıdır ve webman tüm sistem kaynaklarını elde edemez, dolayısıyla tüm sistemin performansının düşmesi normal bir durumdur.
nginx proxy'nin performans etkisini mümkün olduğunca azaltmak için, nginx günlüklerini kapatmayı (access_log off;) düşünebilir ve nginx ile webman arasındaki keep-alive'ı açabilirsiniz. nginx proxy ile ilgili olarak bakabilirsiniz.

Ayrıca, https'nin http'ye göre daha fazla kaynak tükettiği, çünkü https'nin SSL/TLS el sıkışması, veri şifrelemesi ve şifre çözme işlemleri gerektirdiği, paket boyutlarının artması ve daha fazla bant genişliği tüketmesi nedeniyle bu durumda performans düşer.
Eğer stres testi kısa bağlantılar (HTTP keep-alive kapalı) ile yapıyorsanız, her istek için ekstra SSL/TLS el sıkışma iletişimi yapılması gerektiğinden performans büyük ölçüde azalır. HTTPS'nin stres testinde HTTP keep-alive'ın açılması önerilir.

Sistem performans sınırına ulaştığını nasıl anlayabilirim?

Genellikle CPU %100 olduğunda sistem performansının sınırına ulaştığını gösterir. Eğer CPU'da boşluk varsa, bu sınırına ulaşmadığı anlamına gelir ve bu durumda QPS'yi artırmak için eşzamanlı bağlantı sayısını artırabilirsiniz.
Eğer eşzamanlı bağlantıyı artırmak QPS'yi artırmıyorsa, bu muhtemelen webman işlem sayısının yetersiz olduğudur, lütfen webman işlem sayısını artırın. Eğer hala artırmak mümkün değilse, bant genişliğinin yeterli olup olmadığını kontrol edin.

Neden webman'ın performansı go'nun gin framework'ünden daha düşük?

techempower testleri, webman'ın saf metin, veritabanı sorgusu, veritabanı güncellemesi ve diğer tüm göstergelerde gin'e göre yaklaşık iki kat daha yüksek olduğunu göstermektedir.
Eğer sonuçlarınız farklıysa, bu webman'da ORM kullanmanızdan kaynaklanıyor olabilir ve bu da büyük bir performans kaybına yol açmış olabilir, webman + natif PDO ile gin + natif SQL karşılaştırmasını deneyebilirsiniz.

webman'da ORM kullanmanın performansı ne kadar kayıptır?

Aşağıda bir grup stres testi verisi bulunmaktadır.

Ortam
4 çekirdek 4G Alibaba Cloud sunucusu, yerel MySQL veritabanı, 100.000 kayıt arasından rastgele bir kayıt sorgulaması, yerel makine ile stres testi.

Eğer natif PDO kullanıyorsanız
webman QPS 17,800'tür.

Eğer Laravel'in Db::table()'ını kullanıyorsanız
webman QPS 9,400'e düşmektedir.

Eğer Laravel'in Model'ini kullanıyorsanız
webman QPS 7,200'e düşmektedir.

thinkORM sonuçları benzer olup pek fazla farklılık göstermemektedir.

İpucu
ORM kullanımı performansı bir miktar düşürebilir, ancak %99 için iş süreçleri zaten oldukça iyi performans göstermektedir; eğer tam o %1'lerden biriyseniz, CPU veya sunucu eklemeyle problemi kolaylıkla çözebilirsiniz.
Geliştirme verimliliği, bakım yapılabilirlik, performans gibi birçok ölçüt arasında bir denge bulmalıyız, sadece performans peşinde koşmamalıyız.

Neden apipost ile stres testi yapıldığında QPS çok düşük?

apipost'un stres testi modülünde bir hata vardır, eğer sunucu gzip başlığını döndürmezse keep-alive'ı koruyamaz ve bu da performansın büyük ölçüde düşmesine yol açar.
Çözüm olarak yanıt verirken veriyi sıkıştırıp gzip başlığını eklemeniz gerekir. Örneğin:

<?php
namespace app\controller;
class IndexController
{
    public function index()
    {
        return response(gzencode('hello webman'))->withHeader('Content-Encoding', 'gzip');
    }
}

Bunun dışında, apipost bazı durumlarda tatmin edici bir stres testi yapamayabilir; bu, aynı eşzamanlı bağlantılar altında apipost'un ab'den %50 daha düşük QPS göstermesiyle kendini gösterir.
Stres testi için ab, wrk veya diğer profesyonel stres testi yazılımlarını kullanmanız önerilir, apipost yerine.

Uygun işlem sayısını ayarlama

webman varsayılan olarak CPU * 4 işlem sayısını açmaktadır. Aslında, ağ IO'su olmayan helloworld iş süreci için işlem sayısını CPU çekirdek sayısıyla eşit olarak ayarlamak en iyi performanstır, çünkü bu işlem değişim maliyetlerini azaltır.
Eğer veritabanı, redis gibi engelleyici IO işlemleri varsa, işlem sayısını CPU'nun 3-8 katı olarak ayarlayabilirsiniz, çünkü bu durumda daha fazla işlem gerekmekte ve işlem değişim maliyetleri engelleyici IO’ya göre göz ardı edilebilir.

Stres testinin bazı referans aralıkları

Bulut Sunucu 4 Çekirdek 4G 16 İşlem Yerel/Mahalli Stres Testi

- Keep-alive Açık Keep-alive Kapalı
hello world 80-160bin QPS 10-30bin QPS
Tek Veritabanı Sorgusu 10-20bin QPS 10bin QPS

Üçüncü Taraf techempower Stres Testi Verileri

Stres testi komut örnekleri

ab

# 100000 istek 200 eşzamanlı keep-alive açık
ab -n100000 -c200 -k http://127.0.0.1:8787/

# 100000 istek 200 eşzamanlı keep-alive kapalı
ab -n100000 -c200 http://127.0.0.1:8787/

wrk

# 200 eşzamanlı 10 saniye stres testi keep-alive açık (varsayılan)
wrk -c 200 -d 10s http://example.com