Script/performance/request

Bonjour,

Plutôt que de me replonger dans JMeter, j’aimerais utiliser le script
request de RoR pour faire des tests de performance. Je l’avais essayé
avec la version 2.1 mais sans succès, et avec la version 2.2.2, le
problème subsiste :

-> RAILS_ENV=performance ./script/performance/request -n 10
login_session.rb
/Users/jbiard/gentoo/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:
/Users/jbiard/dev/trunk/cc/app/controllers/application.rb:14:
/Users/jbiard/dev/trunk/cc/vendor/rails/actionpack/lib/action_controller/test_process.rb:471:in
method_missing': undefined methodget_with_redirect’ for
#ActionController::Integration::Session:0x52de63c (NoMethodError)
from
/Users/jbiard/dev/trunk/cc/vendor/rails/actionpack/lib/action_controller/integration.rb:498:in
__send__' from /Users/jbiard/dev/trunk/cc/vendor/rails/actionpack/lib/action_controller/integration.rb:498:inmethod_missing’

Avec :

-> cat login_session.rb
get_with_redirect ‘/’
say “GET / => #{path}”
post_with_redirect ‘/sessions’, :email => ‘[email protected]’, :password =>
‘arf’
say “POST /sessions => #{path}”

et

-> gem search ruby-prof

*** LOCAL GEMS ***

ruby-prof (0.7.1)

Apparemment, les méthodes utilisées pour le profiling de requêtes sont
les mêmes que celles des tests d’intégration (que je n’ai pas encore
utilisés).

Si quelqu’un a une idée, je suis preneur…

Merci,

Julien

Bonsoir,

Je pense que ça vient de votre RAILS_ENV=performance qui n’est pas
adéquat. Pour benchmarker notre site http://www.digiprof.fr, nous
utilisons RAILS_ENV=production, et ça marche sans problème avec Rails
2.1 et Rails 2.2.2. Par contre si nous utilisons development par
exemple, ça ne marche plus. Il doit y avoir une option nécessaire Ã
spécifier dans le fichier environment/production.rb, mais je ne me suis
jamais penché sur laquelle.

Pouvez-vous tester et nous donner du feedback?

Julien B. wrote:

Bonjour,

Plut�t que de me replonger dans JMeter, j’aimerais utiliser le script
request de RoR pour faire des tests de performance. Je l’avais essay�
avec la version 2.1 mais sans succ�s, et avec la version 2.2.2, le
probl�me subsiste :

→ RAILS_ENV=performance ./script/performance/request -n 10
login_session.rb

Bonsoir,

Je me suis inspiré du très bon screencast (comme d’habitude d’ailleurs)
:

sauf qu’à la place d’avoir déclaré un environnement staging, j’ai
déclaré un environnement performance (quasiment identique à production),
qui fonctionne très bien en faisant un :

script/server -e performance

J’ai pu voir aussi que les versions de ruby-prof antérieures à la 0.6.1
pouvaient poser problème, mais là j’ai la version 0.7.1 installée. Je
viens d’essayer d’installer la version 0.7.2 mais la couche native ne
compile pas…

Pouvez-vous me dire quelle version de ruby-prof vous utilisez ?

Quel problème avez-vous lorsque vous tenter de profiler en environnement
de développement ?

Merci pour vos réponses,

Julien

Fernando P. wrote:

sauf qu’à la place d’avoir déclaré un environnement staging, j’ai
déclaré un environnement performance (quasiment identique à production),
qui fonctionne très bien en faisant un :

script/server -e performance

Bof, en général on benchmark pour estimer les performances du serveur de
production, alors autant utiliser le même environnement.
Oui, le problème c’est que pour reproduire exactement l’environnement de
production dans notre cas, c’est plutôt difficile : un serveur sql, un
serveur memcached… De plus, le fait que les environnements soient
versionnés, cela complique encore plus les choses, d’où l’environnement
spécifique.

mon Mac 10.4.11 et l’installation s’est déroulée parfaitement. Le
benchmark avec 0.7.2 marche également sans aucun souci.
Toujours un problème. Je suis sur Leopard avec Gentoo (plutôt que Darwin
ports).

------------------%<---------------------------%<-----------------------

-> gem update ruby-prof
$Updating installed gems
Updating ruby-prof
Building native extensions. This could take a while…
ERROR: While executing gem … (Gem::Installer::ExtensionBuildError)
ERROR: Failed to build gem native extension.

/Users/jbiard/gentoo/usr/bin/ruby18 extconf.rb update ruby-prof
checking for sys/times.h… yes
checking for rb_os_allocated_objects()… no
checking for rb_gc_allocated_size()… no
checking for rb_gc_collections()… no
checking for rb_gc_time()… no
checking for rb_heap_total_mem()… no
checking for rb_gc_heap_info()… no
checking for rb_gc_malloc_allocations()… no
checking for rb_gc_malloc_allocated_size()… no
creating Makefile

make
i686-apple-darwin9-gcc -I. -I.
-I/Users/jbiard/gentoo/usr/lib/ruby/1.8/i686-darwin9 -I.
-DHAVE_SYS_TIMES_H -fno-common -march=prescott -O2 -pipe
-fno-strict-aliasing -fno-common -pipe -fno-common -c ruby_prof.c
In file included from ruby_prof.h:83,
from ruby_prof.c:50:
measure_cpu_time.h: In function ‘measure_cpu_time’:
measure_cpu_time.h:40: erreur: ‘uint32_t’ undeclared (first use in this
function)
measure_cpu_time.h:40: erreur: (Each undeclared identifier is reported
only once
measure_cpu_time.h:40: erreur: for each function it appears in.)
measure_cpu_time.h:40: erreur: expected ‘;’ before ‘a’
measure_cpu_time.h:41: erreur: ‘a’ undeclared (first use in this
function)
measure_cpu_time.h:41: erreur: ‘d’ undeclared (first use in this
function)
measure_cpu_time.h:42: erreur: ‘uint64_t’ undeclared (first use in this
function)
measure_cpu_time.h:42: erreur: expected ‘)’ before ‘d’
measure_cpu_time.h:41: erreur: invalid lvalue in asm output 0
measure_cpu_time.h:41: erreur: invalid lvalue in asm output 1
make: *** [ruby_prof.o] Erreur 1

------------------%<---------------------------%<-----------------------

Quel problème avez-vous lorsque vous tenter de profiler en environnement
de développement ?

Le rapport de benchmark met une éternité à se générer avec development,
alors qu’en production ça vient en quelques secondes.

Et si vous testez avec un script tout simple:
get ‘/’
say “GET #{path}”
Cela fonctionne ! Mais les méthodes get_with_redirect et
post_with_redirect restent manquantes…

Et quel est le code qui se trouve à la ligne:
/Users/jbiard/dev/trunk/cc/app/controllers/application.rb:14:

FakePicture = Struct.new( :credit, :description )

C’est une structure permettant la mémorisation de données d’un
formulaire propres à un attachment de type image. Si j’enlève cette
ligne, j’ai toujours get_with_redirect qui est manquante.

Merci pour votre aide.

Cela fonctionne ! Mais les méthodes get_with_redirect et
post_with_redirect restent manquantes…

Et à votre avis pourquoi ? (indice: il y a une excellente raison à
cela)

… parce qu’elles n’existent pas tout simplement…

les méthodes sont get_via_redirect et post_via_redirect

J’imagine que vous avez
rippé http://blog.shingara.fr/2008/09/03/profiler-une-requete-rails,.
Bref c’est le code/doc de rails qui fait référence pas ce qu’on trouve
sur les blogs par-ci /
par-là.
Pour ce genre de truc moyennement documenté, je ne saurais trop vous
conseiller de garder le code de rails près de la main pour pouvoir
faire des grep dessus, ce genre de situation se résoud en 1 minutes.
L’avantage de faire du ruby c’est que le code est minimaliste et
lisible:

  # Performs a request using the specified method, following any

subsequent
# redirect. Note that the redirects are followed until the
response is
# not a redirect–this means you may run into an infinite loop
if your
# redirect loops back to itself.
def request_via_redirect(http_method, path, parameters = nil,
headers = nil)
send(http_method, path, parameters, headers)
follow_redirect! while redirect?
status
end

  # Performs a GET request, following any subsequent redirect.
  # See +request_via_redirect+ for more information.
  def get_via_redirect(path, parameters = nil, headers = nil)
    request_via_redirect(:get, path, parameters, headers)
  end

  # Performs a POST request, following any subsequent redirect.
  # See +request_via_redirect+ for more information.
  def post_via_redirect(path, parameters = nil, headers = nil)
    request_via_redirect(:post, path, parameters, headers)
  end

sauf qu’à la place d’avoir déclaré un environnement staging, j’ai
déclaré un environnement performance (quasiment identique à production),
qui fonctionne très bien en faisant un :

script/server -e performance

Bof, en général on benchmark pour estimer les performances du serveur de
production, alors autant utiliser le même environnement.

J’ai pu voir aussi que les versions de ruby-prof antérieures à la 0.6.1
pouvaient poser problème, mais là j’ai la version 0.7.1 installée. Je
viens d’essayer d’installer la version 0.7.2 mais la couche native ne
compile pas…

Pouvez-vous me dire quelle version de ruby-prof vous utilisez ?

Effectivement avec < 0.6.1 il y avait des problèmes. Le script request
marchait sans problème avec 0.7.1. Je viens de mettre à jour à 0.7.2 sur
mon Mac 10.4.11 et l’installation s’est déroulée parfaitement. Le
benchmark avec 0.7.2 marche également sans aucun souci.

Quel problème avez-vous lorsque vous tenter de profiler en environnement
de développement ?

Le rapport de benchmark met une éternité à se générer avec development,
alors qu’en production ça vient en quelques secondes.

Et si vous testez avec un script tout simple:
get ‘/’
say “GET #{path}”

Et quel est le code qui se trouve à la ligne:
/Users/jbiard/dev/trunk/cc/app/controllers/application.rb:14:

Renaud (Nel) Morvan wrote:

Cela fonctionne ! Mais les m�thodes get_with_redirect et
post_with_redirect restent manquantes…

Et � votre avis pourquoi ? (indice: il y a une excellente raison �
cela)

… parce qu’elles n’existent pas tout simplement…

J’allais justement lui proposer de regarder l’API Rails pour voir s’il
n’y avait pas une erreur dans les arguments passés aux méthodes.
Effectivement elles n’existent pas, ça ne risquait pas de marcher. Mais
bon vu que tout est opérationnel maintenant, c’est ce qui compte.

Je fais systématiquement des greps sur les sources de RoR lorsque je
recherche dans le code, et j’ai bien vu dans ce cas que rien ne
correspondait…
Je n’aurais jamais pensé rechercher get_via_redirect au lieu de
get_with_redirect. Après c’est sûr, ça se résout en moins d’1 minute.

Toutefois, pour info voici un extrait du CHANGELOG de actionpack :

2.0.2 (December 16th, 2007)

[…]

  • Request profiler. [Jeremy K.]
    $ cat login_session.rb
    get_with_redirect ‘/’
    say “GET / => #{path}”
    post_with_redirect ‘/sessions’, :username => ‘john’, :password =>
    ‘doe’
    say “POST /sessions => #{path}”
    $ ./script/performance/request -n 10 login_session.rb

Merci pour votre réponse :slight_smile: