[PYTHON] Outil de mesure des performances des applications Web Funkload ...

Funkload

À propos de l'outil de mesure des performances de l'application Web (bien qu'il serve également de charge côté serveur), Apache Bench et [Siege](http: //www.joedog.org/siege-home/) et JMeter Je me demandais s'il y avait autre chose, et je cherchais dans Stack Overflow J'ai trouvé quelque chose qui s'appelle Funkload.

Il semble être fait par Python. Ensuite, j'ai essayé d'enquêter, alors j'ai essayé de jouer avec.

Maintenance de l'environnement d'exploitation

En tant qu'environnement d'exploitation, mon propre environnement est le suivant.

Funkload semble prendre en charge la série Python 2.x, alors sélectionnez la dernière version de la série 2.x (à partir de juin 2013). Reportez-vous à Comment installer sur Mac OS X dans la documentation Funkload. ... Apparemment, tout ce dont vous avez besoin est un gnuplot. Mettons-le avec l'homebrew.

> brew install gnuplot

Créez un environnement qui peut se salir

Créez un environnement qui peut être sale avec virtualenv.

Avec Python 2.7.5 sur le système (installé avec homebrew etc.) Si vous ne l'avez pas installé avec un système de traitement Python qui utilise easy_install, Téléchargez et installez le package de distribution, et sous la forme suivante installer easy_install, pip

> curl -O http://python-distribute.org/distribute_setup.py
> python distribute_setup.py
> rehash
> easy_install pip
> rehash
> pip install virtualenv

Installez Funkload

Si virtualenv est inclus, sous la forme suivante Installez Funkload à l'aide de la commande pip.

> mkdir ~/Sandbox/Funkload
> cd ~/Sandbox/Funkload
> virtualenv .venv
> source .venv/bin/activate
> pip install funkload

Testez Funkload pour le moment

Préparer une application Web pour le test pour le moment

Je ne peux pas aider sans une application Web de test, alors Utilisez la fonction de création skelton d'express (node.js) pour prendre en charge les applications de test. Si l'environnement de nœud n'est pas construit, il est recommandé d'utiliser nodebrew ...

Si express n'est pas inclus

Installez-le en tant que npm_modules dans un emplacement global. Eh bien npm installer.

> npm install -g express

Tester la création d'applications

Facile avec la fonction de création de skelton (Scaffold n'a pas été officiellement écrit)

> express webserver
> cd webserver && npm install
> node app

C'est la fin du lancement de l'application de test.

express application start

Créer un cas de test

En regardant le cas de test FunkLoad Tutoriel Funkload Je vais l'écrire. Vous pouvez créer un modèle de scénario de test avec des commandes. C'est bon.

> fl-install-demo
> cd funkload-demo/simple

Pour le scénario de test créé, réécrivez la section principale du fichier Simple.conf comme suit.

[main]
title=Express skelton page test
description=express.js skelton application testing a root page.
# the server url to test
url=http://localhost:3000/

Lancez Funkload pour tester l'accès à l'application

Exécutons la commande suivante

> fl-run-test -dv test_Simple.py

fl-run-test

Le scénario de test de l'application Web semble bien se passer.

En fait testé avec Funkload

Testons-le réellement.

> fl-run-bench -c 1:10:20 test_Simple.py Simple.test_simple

L'option -c est une option de nombre de threads pour les tests de lancement. Dans l'exemple ci-dessus, le test est effectué avec 1 thread, 10 threads et 20 threads.

fl-run-bench

Le test réel a été effectué avec succès.

Générer un rapport de test

Convertissez le rapport de test d'un fichier xml en un fichier html avec la commande suivante.

> fl-build-report --html simple-bench.xml

Un répertoire est créé et sous celui-ci Le rapport est généré sous la forme d'un fichier html. Voyons-le en action ...

> cd test_simple-20130601T104942
> open index.html

report-1

Oh, quelque chose sort ... les statistiques de page correspondent au nombre de pages acquises avec succès, Je ne connaissais pas E ou G, mais il y avait une explication appropriée au bas du fichier html de sortie.

report-2

Si le score est de 0,94 ou plus, il semble qu'une barre bleue se trouve car c'est E. C'est simple, le nombre d'utilisateurs attendus est aussi petit que 20, et il n'y a généralement pas de problème avec la vitesse de réponse. Cela arrivera-t-il?

Je veux écrire une application légèrement compliquée et la tester

Alors écrivez une application un peu plus complexe et testez-la Je vais préparer un scénario.

Les applications complexes sont préparées ci-dessous. https://github.com/futoase/bottle-application-sample Il a simplement un formulaire et l'affiche lorsqu'il est rempli.

Comment Board

J'ai déjà enregistré le scénario / l'application de test préparé sur github. Les dépôts suivants peuvent être vérifiés en faisant git clone && git submodule update --init.

https://github.com/futoase/funkload-sample

Ecrire un scénario

En tant que condition, l'application Web cible a les fonctions suivantes.

--Recevoir nom_utilisateur, commenter / commenter par la méthode POST et ajouter au fichier de base de données sqlite3 -Afficher le contenu du commentaire posté par / (index)

C'est simple. Écrivons un scénario pour vérifier les conditions ci-dessus

-Access / (Obtenir des ressources par GET) --POSTER le contenu de user_name et commenter / commenter et les ajouter à l'enregistrement

Comme un point que vous ne pouvez pas y aller à moins d'être prudent

--Le nom de fichier, le nom de classe et le nom de fichier de configuration utilisés dans le test doivent être identiques.

Je ne peux pas omettre le contenu écrit dans la section principale, Parce qu'il est codé en dur dans le code source ...

Fichier de scénario

J'écris un scénario dans CommentBoard.py. Le scénario de test est basé sur la page de documentation Funkload.

CommentBoard.py


# -*- coding:utf-8 -*-

import unittest
import random
import json
from funkload.FunkLoadTestCase import FunkLoadTestCase

with open('conf/user_names.json') as f:
  USER_NAMES = json.loads(f.read())

with open('conf/comments.json') as f:
  COMMENTS = json.loads(f.read())

class CommentBoard(FunkLoadTestCase):
  def setUp(self):
    self.target_url = self.conf_get('main', 'url')
    self.try_count = self.conf_getInt('comment_board_setting', 'try_count')

  def test_index(self):
    target_url = self.target_url
    try_count = self.try_count

    for i in range(try_count):
      self.get(target_url, description='Get comment board index.') 

  def test_posts(self):
    target_url = self.target_url + 'comment'
    try_count = self.try_count

    user_name = random.choice(USER_NAMES)
    comment = random.choice(COMMENTS)

    self.post(target_url,
      params=[
        ('user_name', user_name),
        ('comment', comment)
      ],
      description='Comment as {user_name}'.format(user_name=user_name)
    )

if __name__ == '__main__':
  unittest.main()

Sera.

Fichier de configuration à utiliser dans les scénarios

Le fichier de configuration est écrit dans CommentBoard.conf.

[main]
title=Comment board test
description=Comment board test
url=http://localhost:3000/

[index]
title=Comment board index tests
description=Comment board index

[comments]
title=Comment board posts tests
description=Comment board posts

[comment_board_setting]
try_count=30

[credential]
log_to = console file
log_path = comment-board.log
result_path = comment-board-test.xml
ok_codes =  200:301:302
sleep_time_min = 0
sleep_time_max = 0

[bench]
cycles = 50:75:100:125
duration = 10
startup_delay = 0.01
sleep_time = 0.01
cycle_time = 1
log_to =
log_path = comment-board-bench.log
result_path = comment-board-bench.xml
ok_codes =  200:301:302
sleep_time_min = 0
sleep_time_max = 0.5

[distribute]
log_path = log-distributed
funkload_location=http://pypi.python.org/packages/source/f/funkload/funkload-1.16.1.tar.gz

Je ne fais rien de spécial à ce sujet.

Essai

Avant d'exécuter le test, vous devez lancer l'application à tester, donc Commençons comme suit.

> git clone git://github.com/futoase/funkload-sample.git
> git checkout -b v1.0.0 v1.0.0
> cd funkload-sample
> git submodule update --init
> virtualenv .venv
> source .venv/bin/activate
> pip install -r requiements.txt
> cd bottle-application-sample
> python migrate.py
> python app.py

Après le démarrage, créez une nouvelle session avec tmux le cas échéant Exécutez le scénario de test Funkload.

cd funkload-sample
> fl-run-bench -c 10 CommentBoard.py CommentBoard.test_index
> fl-build-report --html comment-board-bench.xml
> cd test_index-20130604T175903
> open index.html
> cd ..
> fl-run-bench -c 10 CommentBoard.py CommentBoard.test_posts
> cd -test_posts-20130604T180037
> open index.html

Vérifiez l'état de l'application Web de test en cours d'exécution.

Comment Board Test Result

Vous pouvez publier correctement dans le formulaire spécifié dans le test. Le résultat est également affiché.

Essayez d'utiliser

C'est plus beau qu'Apache Bench, mais il peut être agréable de "voir les tendances". Vous pouvez faire un auto-jugement en regardant la transition de la façon d'appliquer la charge.

Cependant, il y a peu d'informations en japonais, donc Il n'y a pas d'indicateurs tels que les résultats mesurés par d'autres, Je me suis demandé s'il ne serait pas difficile de l'utiliser au travail à moins d'être en mesure d'en prendre la responsabilité. Je pense qu'il peut être utilisé tant qu'il est jugé comme une référence, Pour prendre une décision "lente", vous devez écrire et construire vos propres implémentations "lentes" et "rapides".

Apache Bench est simple, donc le serveur d'applications se charge sur le système de référence tel que GET Puisque vous pouvez le vérifier, Socci a plus de savoir-faire opérationnel, et si vous recherchez sur le net, cela peut être le résultat de la performance. Je me demande si c'est bon ...

L'outil dépend de la personne.

Recommended Posts

Outil de mesure des performances des applications Web Funkload ...
Mesure de la performance Redis
Résumé de la mesure des performances NVMe
Développement d'applications WEB à l'aide de django-development partie 1-
Développement d'applications Web avec Flask
Créer une application Web avec Django
Application Web avec Python + Flask ② ③
Mesure de la performance du réseau avec iperf
Application Web avec Python + Flask ④