Locust: Load Testing Tool

Locust, kullanimi diger uygulamalara gore kolay distributed load testing aracidir. Websitenizi ya da diger sistemlerinizi kullanici sayilarini simule ederek yazdiginiz kodlari ya da sistemlerinizi load testing yaparak kontrol etmenize olanak saglar.

Locust'un ozellikleri:

  • Kolay test senaryosu yazma. Diger araclara gore daha sade ve kolay syntax ile yazabilme. Python'a asina olanlar icin yabancilik cekmeyecekleri sekilde python kod.
  • Distributed load testing. Tekil ya da coklu makinelerle load testing yapabilme. Ister kullandiginiz bir bilgisayarla isterse 20 makine ile test yapabilme imkani.
  • Webarayuzu. Locust HTML+JS ile size realtime test sonuclarini webarayuzunden izleyebilme imkani sagliyor.
  • Her turlu sistemi test edebilirsiniz. Sadece websitelerini degil ldap,smtp gibi servis verdiginiz her turlu sistemleri biraz python biliyorsaniz client kod vs yazayarak test edebilirsiniz.
  • Apache JMeter gibi java bagimliliginiz kalmadan bu testlerinizi yapabilirsiniz.( JMeter uzerinde SSL sertifikaniz 4096 bit gibi yuksek sifrelenmis ise javanin en yuksek 2048 bit desteklemesi yuzunden basarili olamayabilirsiniz. )

Kurulumu

Locust, Python 2.7, 3.3, 3.4, 3.5,3.6. versiyonlarini desteklemektedir. Sistemizdeki 'pip' kurulu oldugundan emin olun. Bir cok modern sistemlerde halihazirda kurulu olarak zaten geliyor.

# pip install locustio

Eger sadece kendi kullaniciniz icin kuracaksaniz;

$ pip install --user locustio

Ardindan '~/.local/bin/' dizinini "PATH'inize ekleyin. GNU/Linux dagitiminiza ya da sisteminize gore '.bashrc' ya da 'bash_profile' dosyaniza eklemeniz gerekir.

PATH=$PATH:~/.local/bin

Kurulum adimlari bu kadar.

Note

Son olarak not dusmek gerekir. Eger load testing yaparken yuksek sayida kullanici ile senaryo gerceklestirecekseniz sistemiz ve load-testing yapan kullaniciniz icin file-limit degerlerini yukseltmeniz gerekebilir.

Ilk olarak sistemiz uzerinden file-limit degerini ogrenip yukseltmek icin;

# cat /proc/sys/fs/file-max
75000

Yukarda goruldugu gibi sistem uzerinde file-limit degeri '75000'. Bu degeri ornek olarak '750000' yukseltmek icin;

# sysctl -w fs.file-max=750000

Sistem uzerinde kalici olarak degistirmek icin, "/etc/sysctl.conf" dosyasina asagidaki satiri ekleyin.

fs.file-max = 750000

Aktif etmek icin;

# sysctl -p

Bu limit degerlerini sisteme giris yaptiginiz ya da test yapacaginiz kullanici icin yukseltmek icin '/etc/security/limits.conf' dosyaniza asagidaki gibi degerleri ekleyin;

## hard limit
kullanici1        hard nofile 10000
## soft limit
kullanici1        soft nofile 5000

Yaptiginiz degisikligin aktif olmasi icin cikis yapip tekrar giris yapmaniz gereklidir.

Senaryo olusturma

Locust icin cesitli senaryolar yazabilirsiniz. Iki basit ornek verelim.

Ornek 1: Websitenizin anasayfasini ve hakkimda sayfalarini test etmek icin load-testing senaryosu yazalim.

from locust import HttpLocust, TaskSet, task

class MyTaskSet(TaskSet):
     @task(2)
     def index(self):
             self.client.get("/")

     @task(1)
     def about(self):
             self.client.get("/hakkinda/")

class MyLocust(HttpLocust):
     task_set = MyTaskSet
     min_wait = 5000
     max_wait = 15000

'min_wait' ve 'max_wait' degerleri simule eden kullanicilarin bu sureler arasinda istek yapmasini gosterir.

Ornek 2: Websitenizin login sayfasina kullanici ile giris yapip, anasayfasini ve profile sayfasini test senaryosu yazalim.

from locust import HttpLocust, TaskSet

def login(l):
     l.client.post("/login", {"username":"ellen_key", "password":"education"})

def index(l):
     l.client.get("/")

def profile(l):
     l.client.get("/profile")

class UserBehavior(TaskSet):
     tasks = {index: 2, profile: 1}

     def on_start(self):
             login(self)

class WebsiteUser(HttpLocust):
     task_set = UserBehavior
     min_wait = 5000
     max_wait = 9000

Load-Testing Yapmak

Locust ile yazdigimiz senaryolar ile load-testing yapmak icin;

$ locust --host=http://example.com

ya da yazdigimiz senaryo dosyasinin yolunu belirterek;

$ locust -f locust_files/my_locust_file.py --host=http://example.com

Test basladiktan sonra tarayiciniza 'localhost:8089' yazarak kullanicilari simule edip testinizi izleyebilirsiniz.

FreeIPA ve Active Directory Entegrasyonu

Kurulum oncesi hazirlik:
  1. FreeIPA Server 4.4.0-14 ( CentOS 7 )
    • IPA Server IP Adresi: 172.16.183.128
    • IPA Server Hostname: ipaserver.piesso.local
    • IPA Domain: piesso.local
    • IPA Netbios: PIESSO
    • IPA Kerberos realm: PIESSO.LOCAL
  2. Windows Server 2012 R2
    • Active Directory IP Adresi: 172.16.183.132
    • Active Directory Hostname: ad.pencere.local
    • Active Directory Domain: pencere.local
    • Active Directory Netbios: PENCERE

Windows Server 2012 R2 ve FreeIPA icin kerberos ticket vs gibi sorunlar yasanmamasi icin ntp ile zaman esitlemesi mutlaka baslatilmalidir. FreeIPA kurulumunda ontanimli olarak ntp client "time sync" islemini ntp pool'larindan alarak esitlemektedir. Fakat Windows Server 2012 R2 uzerinde de bunu yapmak icin manuel ntp pool sunucularini girip zaman servisini yeniden baslatilmasi gerekmektedir.

Warning

2016 Bakanlar Kurulu karari ile yaz saati uygulamasi sona erdigi icin zaman diliminin "+3" oldugunu kontrol edin.

(Powershell uzerinde)

> net stop w32time
> w32tm /config /syncfromflags:manual /manualpeerlist:0.centos.pool.ntp.org, 1.centos.pool.ntp.org, 2.centos.pool.ntp.org
> w32tm /config /reliable:yes
> net start w32time

FreeIPA ve Active Directory Cross-Realm Trust:

  • Ilk olarak "ipa-adtrust-install" paketini repodan kuralim:
# yum install ipa-adtrust-install
  • IPA Server uzerinde cross-realm islemi icin:
# ipa-adtrust-install --netbios-name=PIESSO -a password

Firewall Konfigurasyonu:

Windows Server uzerinde firewall uzerindeki kurallar otomatik olarak ekleniyor. Fakat IPA Server uzerinde asagidaki portlarin acik olmasi gerekmektedir.

TCP ports: 80, 88, 443, 389, 636, 88, 464, 53, 135, 138, 139, 445, 1024-1300
UDP ports: 88, 464, 53, 123, 138, 139, 389, 445

Centos 7 ile birlikte gelen firewall manager firewalld spesifik servisleri acmak icin halen yetersiz oldugu icin bunu disabled edip yerine klasik iptables'i aktif edelim:

# systemctl disable firewalld
# systemctl stop firewalld
# yum install -y iptables-services
# systemctl enable iptables

"/etc/sysconfig/iptables" dosyasina gerekli olan portlari acmak icin kurallarimizi girelim:

\*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -s ad_ip_address -p tcp -m multiport --dports 389,636 -m state --state NEW,ESTABLISHED -j REJECT
-A INPUT -p tcp -m multiport --dports 80,88,443,389,636,88,464,53,138,139,445 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m multiport --dports 88,464,53,123,138,139,389,445 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p udp -j REJECT
-A INPUT -p tcp -j REJECT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Iptables servisini baslatabiliriz:

# systemctl start iptables

DNS Forward Zone:

Active Directory ve FreeIPA'yi inbound ve outbound trust olarak isaretlemeden DNS Forward Zone'lari ekleyelim.

  • Windows Server 2012 R2 uzerinde:
> dnscmd 127.0.0.1 /ZoneAdd piesso.local /Forwarder 172.16.183.128
  • FreeIPA Server uzerinde:
# ipa dnsforwardzone-add pencere.local --forwarder=172.16.183.132 --forward-policy=only
  • Forwarder DNS zone'larin dogru sekilde eklenip eklenmedigi iki tarafta da kontrol edelim:

Windows Server 2012 R2 (PowerShell):

> nslookup
> set type=srv
> _ldap._tcp.ad_domain
> _ldap._tcp.ipa_domain
> quit
  • FreeIPA Server uzerinde:
# dig SRV _ldap._tcp.ipa_domain
# dig SRV _ldap._tcp.ad_domain

Cross-Realm Trust:

Freeipa ile Active Directory arasinda "Two-way trust" konfigurasyonu:

# ipa trust-add --type=ad pencere.local --admin Administrator --password --two-way=true

"Two-way trust" baglantisinin basarili sekilde kurulup kurulmadigini kontrol edelim:

# ipa trust-fetch-domains "pencere.local"
# ipa trustdomain-find "pencere.local"

IPA Client Kurulumu

Kullanilan yazilimlar:
  • Centos Linux 7.2

    • ipa-client
    • ipa-admin-tools

Kurulum Oncesi Hazirlik:

FQDN = ipaclient.piesso.local
IP = 172.16.183.135/24
IPA Server = ipa.piesso.local
IPA DOMAIN = piesso.local
IPA NETBIOS = PIESSO

Kuruluma baslamadan once kontrol edilmesi gerekenler;

  1. Hostname
  2. /etc/hosts
  3. Sistem update

Hostname:

# hostnamectl set-hostname ipaclient.piesso.local

/etc/hosts:

172.16.183.135 ipaclient.piesso.local ipaclient
172.16.183.128 ipa.piesso.local

Sistem update:

# yum update -y

Kurulum:

  • ipa-client ve ipa-admintools yazilimlarinin repodan kurulmasi;
# yum install ipa-client ipa-admintools
  • ipa-client kurulumu;
# ipa-client-install --domain PIESSO.LOCAL --server ipa.piesso.local --realm PIESSO -p host/ipa.piesso.local --enable-dns-updates --force-ntpd

IPA Client ve Kerberos Ticket Testi:

  • FreeIpa sunucusundaki admin kullanicisi ve parolasi ile giris yapin;
# getent passwd admin
# getent group admins
  • Kerberos'tan ticket alimi;
# kinit admin
  • Ticketin basarili alinip alinmadigi kontrolu;
# klist
  • Hersey saglam gorunuyorsa client dns'lerini FreeIPA Server adresine donusturulmesi;

/etc/resolv.conf:

search piesso.local
nameserver 172.16.183.128

Centos 7 uzerine FreeIPA Kurulumu

Kullanilan yazilimlar:

  • Centos Linux 7.2
  • ipa-server 4.2.0
  • ipa-server-dns 4.2.0
  • bind-dyndb-ldap 8.0
  • bind 9.9.4

Kurulum Oncesi Hazirlik:

FQDN: ipa.piesso.local
IP: 172.16.183.128/24
IPA DOMAIN: piesso.local
IPA NETBIOS: PIESSO

Kuruluma baslamadan once kontrol edilmesi gerekenler;

  1. Hostname
  2. /etc/hosts
  3. Statik IP
  4. Sistem update

1. Hostname:

# hostnamectl set-hostname ipa.piesso.local

2. /etc/hosts:

172.16.183.128 ipa.piesso.local ipa

3. Statik IP:

Ornek statik ip konfigurasyonu "/etc/sysconfig/network-scripts/ifcfg-xxxx"

ONBOOT= yes
BOOTPROTO= none
IPADDR= 172.16.183.128
PREFIX= 24
GATEWAY= 172.16.183.2
DNS1= 8.8.8.8
DNS2= 8.8.4.4
DEFROUTE= yes

4. Sistem update:

# yum update -y

Kurulum:

  • ipa-server, integrated dns, ad trust ve ldap back-end plugin yazilimlarinin repodan kurulmasi;
# yum install ipa-server ipa-server-dns bind-dyndb-ldap ipa-server-trust-ad
  • ipa-server kurulumu;
# ipa-server-install -a IpaAdminpassword -p IpaManagerpassword --domain=piesso.local --realm=piesso.local --setup-dns --no-forwarders -U
  • ipa-server kurulumu asagidaki sekilde basari ile biterse firewalld daemonuna gerekli port izinlerinin verilmesi;
Restarting the web server
==============================================================================
Setup complete

Next steps:
      1. You must make sure these network ports are open:
                 TCP Ports:
                   * 80, 443: HTTP/HTTPS
                   * 389, 636: LDAP/LDAPS
                   * 88, 464: kerberos
                   * 53: bind
                 UDP Ports:
                   * 88, 464: kerberos
                   * 53: bind
                   * 123: ntp
      2. You can now obtain a kerberos ticket using the command: 'kinit admin'
         This ticket will allow you to use the IPA tools (e.g., ipa user-add)
         and the web user interface.

Be sure to back up the CA certificate stored in /root/cacert.p12
This file is required to create replicas. The password for this
file is the Directory Manager password
# firewall-cmd --permanent --add-service={http,https,ldap,ldaps,kerberos,dns,kpasswd,ntp}
# firewall-cmd --reload
  • Firewall kurallarinin kontrol edilmesi;
# firewall-cmd --list-services

IPA Server ve Kerberos Ticket Testi:

  • Kerberos'tan ticket alimi;
# kinit admin
  • Ticketin basarili alinip alinmadigi kontrolu;
# klist
  • ipa-server servislerinin kontrolu;
# ipactl status
  • Hersey saglam gorunuyorsa sunucu dnslerini local adrese donusturulmesi;

/etc/resolv.conf:

search piesso.local
nameserver 127.0.0.1