Search code examples
performancejmetervideo-streamingload-testingubikloadpack

JMeter and UbikLoadPack : Advised tuning for load testing video streaming servers


We're using Apache JMeter with UbikLoadPack Video Streaming plugin delivering HLS, MPEG-DASH and MS Smooth formats and we will soon start massive load testing from our injectors.

What are the recommended configuration in terms of:

  • Machine
  • OS
  • System tuning
  • Java

Solution

  • It is hard to answer such question as behaviour depends on at least those factors:

    • The type of Stream : HLS will perform better than MPEG-DASH and HSS, the 2 latest being more CPU consuming due to XML format
    • The duration of the Manifest, the biggest it is the more memory and parsing it will require
    • The refresh period, the shortest it is, the more it will consume memory and CPU

    So the best advice is to calibrate based on your Manifests.

    Some advices regarding your questions:

    Machine:

    • Ensure you have enough bandwidth and network card
    • With "average Manifest" , you should have no issue load testing 700 to 1500 Threads (Virtual Users) with machine of type m5.2xlarge (8 vCPU / 16 to 32 Go)

    OS

    • We advise you to use Linux/MacOS instead of Windows OS as you will get more Threads on same virtual/physical configuration.
    • But all work since Java is used

    For linux apply following tuning:

     net.ipv4.tcp_syncookies=1
     net.core.netdev_max_backlog=5000
     net.ipv4.tcp_max_syn_backlog=4096
     net.core.somaxconn=5000
     net.core.rmem_max=8388608
     net.core.wmem_max=8388608
     net.ipv4.tcp_no_metrics_save=1
     net.ipv4.tcp_keepalive_probes=2
     net.ipv4.tcp_keepalive_intvl=20
     net.ipv4.tcp_fin_timeout=15
     net.ipv4.tcp_max_syn_backlog=5000
     net.ipv4.tcp_keepalive_time=300
     net.ipv4.tcp_tw_recycle=0
     net.ipv4.tcp_tw_reuse=1
     net.ipv4.tcp_sack=1
     net.ipv4.tcp_dsack=0
     net.ipv4.ip_local_port_range= 1025 65000
     vm.swappiness = 5
     net.ipv4.tcp_slow_start_after_idle = 0
    

    Java

    • Ensure you use last minor version of Java 8 or 9.
    • Ensure you use Java 64 bits to be able to allocate more than 1.5/ 2GB memory. Check this by running

      java -version

    Allocate enough heap based on your calibration, for example to allocate 6g Heap:

     -Xmx6g -Xms6g
    

    Check in jmeter.log that the memory is really what you allocated, something like this, for 2g you would get:

     2018-03-14 21:55:09,662 INFO o.a.j.JMeter: Max memory     =2058 354 688
    

    Some advised GC tuning:

     -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=30 
     -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 
     -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false 
     -XX:MaxMetaspaceSize=256m -XX:G1HeapRegionSize=32m -Xss256k 
    

    You can read more in this blog: