Go · SMTP · Performans testi

smtp-load-test: Go ile SMTP yük testi aracı

smtp-load-test, SMTP trafiği oluşturan ve yük altında e-posta gönderiminin nasıl davrandığını raporlayan, Go ile yazdığım açık kaynak bir komut satırı aracı. Linux e-posta servisleri ve ağ sorunlarını giderme deneyimimi, kaynak kodu GitHub üzerinden incelenebilen bir uygulamayla bir araya getiriyor.

Araç neyi ölçüyor?

TCP bağlantısının kurulması, e-posta gönderiminin yalnızca bir adımıdır. Her test mesajı ayrı bir bağlantı üzerinden gönderilir; araç, gönderimin başarılı olup olmadığını ve yedi adımın her birinin ne kadar sürdüğünü kaydeder.

AdımÖlçülen süre
DIALTCP bağlantısının, doğrudan TLS etkinse TLS bağlantısının kurulması.
TOUCHSMTP oturumunun oluşturulması ve sunucu karşılama mesajının okunması.
HELOHELO/EHLO alışverişi.
MAILMAIL FROM komutu.
RCPTRCPT TO komutu.
DATADATA komutu ve mesajın aktarılması.
QUITOturumun QUIT ile kapatılması.

STARTTLS ve kimlik doğrulama etkinse HELO ile MAIL adımları arasında çalışır. Her gönderimin parçasıdırlar, ancak ayrı bir adım olarak raporlanmazlar.

Yük testi çalıştırma

Araç tek bir Go çalıştırılabilir dosyasından oluşur. Depodan derleyip kendi yönettiğiniz bir e-posta sunucusuna yönlendirebilirsiniz:

git clone https://github.com/ennesuysal/smtp-load-test.git
cd smtp-load-test
go build -o smtp-load-test .

./smtp-load-test -smtpServer mail.example.com -smtpPort 587 \
  -senderMail sender@example.com -smtpPassword "$SMTP_PASSWORD" \
  -receiverMail receiver@example.com \
  -workerSize 20 -jobCount 1000 -dataSize 25K

Bu örnek, 25 KB gövdeli 1.000 mesajı eşzamanlı çalışan 20 worker ile gönderir. STARTTLS ve kimlik doğrulama varsayılan olarak etkindir. Diğer varsayılanlar 5 KB boyutunda 10 mesaj, 10 worker ve 587 numaralı porttur.

Komut satırı seçenekleri

Komut satırı arayüzü, oluşturulacak yük ve hedef sunucu için ayrı ayarlar sunar. Böylece farklı test yapılandırmaları karşılaştırılırken sunucu, bağlantı ve mesaj parametreleri açıkça belirlenebilir.

Bayraklarİşlev
-workerSize, -batchSize, -jobCountEşzamanlı worker sayısı, worker’ları besleyen görev kuyruğunun kapasitesi ve gönderilecek toplam mesaj sayısı.
-smtpServer, -smtpPort, -heloHedef sunucu, port ve SMTP selamlamasında gönderilen ad.
-senderName, -senderMail, -receiverMail, -dataSizeGönderen adı ve adresi, alıcı ve oluşturulan mesaj gövdesinin boyutu; örneğin 512B, 5K veya 2M.
-sslEnabled, -startTLS, -authEnabled, -smtpPasswordDoğrudan TLS, STARTTLS ve gönderen adresi ile parolayı kullanan PLAIN kimlik doğrulaması. Mantıksal bayraklar -startTLS=false biçiminde verilir.

Sonuçların yorumlanması

Rapor, başarılı ve başarısız gönderim sayılarıyla başlar; ardından her adımın saniye cinsinden en düşük, ortalama, en yüksek ve toplam süresini, son olarak da testin toplam süresini listeler.

Kontrollü bir testte başarılı ve başarısız gönderim sayılarını protokol süreleriyle birlikte değerlendirmek gerekir. Her seferinde tek bir yük parametresini değiştirmek, farkları yorumlamayı kolaylaştırır. Sunucudaki CPU, disk ve e-posta kuyruğu gözlemleri, istemci tarafındaki raporun tek başına sağlayamadığı bağlamı sunar.

Uygulama yapısı ve kapsam

Giriş noktası bayrakları okur, SMTP test istemcisini oluşturur, SendTestMails işlevini çalıştırır ve istatistikleri yazdırır. Eşzamanlılığı, Go için yazdığım worker pool modülü go-thread-pooling sağlar: sabit sayıda goroutine, gönderim işlerini tamponlu bir kanaldan alır. SMTP istemcisi Go’nun net/smtp ve crypto/tls paketleri üzerine kuruludur; statistics paketi adım sürelerini ve sayaçları mutex’lerle koruyarak toplar.

Kendinden imzalı sertifika kullanan test sunucuları da ölçülebilsin diye TLS sertifika doğrulaması atlanır. Depo, yük oluşturma ve istemci tarafındaki ölçümlere odaklanır. Sunucu izleme ve iletinin gelen kutusuna teslim edildiğinin doğrulanması, e-posta sistemini değerlendirmenin ayrı adımlarıdır.

Kaynak kodunu inceleyin

Yönettiğiniz bir e-posta sunucusunda test çalıştırmadan önce depodaki güncel uygulamayı ve seçenekleri inceleyebilirsiniz.

Linux e-posta servisleri, Kubernetes, gözlemlenebilirlik ve veritabanı güvenilirliği alanlarındaki çalışmalarımı inceleyebilirsiniz.

DevOps ve SRE deneyimi