Testy obciążeniowe aplikacji GAE

Testy obciążeniowe pozwalają określić jak aplikacja zachowa się pod zwiększonym ruchem, jak dobrze będzie się skalować, ile zasobów będzie zużywać. Dzięki testom można także wykryć słabo skalujące się elementy aplikacji i je poprawić (zmienić kod, dodać keszowanie w memcache newralgicznych danych itd.).

W przypadku testów obciążeniowych przyrost ruchu musi następować powoli, gdyż mechanizmy zwiększające ilość kopii aplikacji w chmurze nie działają błyskawicznie. Jeżeli w czasie testów chmura będzie miała czas na dostosowywanie się do zwiększającego się ruchu to otrzymasz dokładne i realistyczne wyniki.

Joe Gregorio z Google udostępnił jeden prosty skrypt do przeprowadzania testów obciążeniowych:

#    Copyright 2009 Google Inc.
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.

"""Simple web application load testing script.

This is a simple web application load
testing skeleton script. Modify the code between !!!!!
to make the requests you want load tested.
"""


import httplib2
import random
import socket
import time
from threading import Event
from threading import Thread
from threading import current_thread
from urllib import urlencode

# Modify these values to control how the testing is done

# How many threads should be running at peak load.
NUM_THREADS = 10

# How many minutes the test should run with all threads active.
TIME_AT_PEAK_QPS = 10 # minutes

# How many seconds to wait between starting threads.
# Shouldn't be set below 30 seconds.
DELAY_BETWEEN_THREAD_START = 30 # seconds

quitevent = Event()
  
def threadproc():
  """This function is executed by each thread."""
  print "Thread started: %s" % current_thread().getName()
  h = httplib2.Http(timeout=30)
  while not quitevent.is_set():
    try:
      # HTTP requests to exercise the server go here
      # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      resp, content = h.request(
        "http://sparklines.bitworking.info/spark.cgi?type=smooth&d=88,84,82,92")
      if resp.status != 200:
          print "Response not OK"
      # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    except socket.timeout:
      pass

  print "Thread finished: %s" % current_thread().getName()

    
if __name__ == "__main__":
  runtime = (TIME_AT_PEAK_QPS * 60 + DELAY_BETWEEN_THREAD_START * NUM_THREADS)
  print """Total runtime will be: %d seconds" % runtime
  threads = []
  try:
    for i in range(NUM_THREADS):  
      t = Thread(target=threadproc)
      t.start()
      threads.append(t)
      time.sleep(DELAY_BETWEEN_THREAD_START)
    print "All threads running"
    time.sleep(TIME_AT_PEAK_QPS*60)
    print "Completed full time at peak qps, shutting down threads"
  except:
    print "Exception raised, shutting down threads"

  quitevent.set()
  time.sleep(3)
  for t in threads:  
      t.join(1.0)
  print "Finished"
W skrypcie tym może zmienić dwa parametry wpływająca na działanie testera:
  • TIME_AT_PEAK_QPS: ile czasu w minutach test powinien trwać przy wszystkich aktywnych wątkach
  • NUM_THREADS: ile wątków sumarycznie utworzyć

W powyższym skrypcie testujemy daną stronę serwisu:

resp, content = h.request(
    "http://sparklines.bitworking.info/spark.cgi?type=smooth&d=88,84,82,92")
if resp.status != 200:
print "Response not OK"
Trzeba dostosować żądany URL do własnego serwisu.

Po wykonaniu testów można sprawdzić wyniki w Admin Console (panel GAE). Wykonując testy dla poszczególnych widoków znajdziemy potencjalnie te zawierające mało wydajny kod (większe zużycie procesora, znacznie niższa ilość żądań/sekunda itd.). Dla zaprezentowane skryptu przy 10 wątkach autor osiągnął przepustowość 80 żądań na sekundę.

load_test_screenshot

Na podstawie Getting started load testing your application.
RkBlog

Google App Engine (GAE), 12 August 2009

Comment article
Comment article RkBlog main page Search RSS Contact