Toon posts:

[perl | POE] wheel::run anomalie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi,

Ik heb een POE::Wheel::Run progje dat een aantal websessies moet emuleren waarvan X concurrent. Om de webserver niet gelijk over de zeik te helpen moet het aantal langzaam opbouwen. Als ik echter een sleep in mijn while zet wordt de sessie wel gestart maar nog niets mee gedaan, waardoor ik nog niets heb bereikt.

Iemand een idee...?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

ik snap er weinig van... wat wil je nou eigenlijk precies?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
ff vlug voorbeeld code dan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sub start_session {
  my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];

  while ( keys( %{ $heap->{task} } ) < MAX_CONCURRENT_TASKS ) {
    my $next_task = shift @tasks;
    last unless defined $next_task;

    my $session = ($task_cnt - $#tasks);
    print STDERR "Started session: $session (".(keys %{$heap->{task}}).")\n";
    my $task = POE::Wheel::Run->new
      ( Program => sub { do_session($next_task, $session) },
        StdoutFilter => POE::Filter::Reference->new(),
        StdoutEvent  => "task_result",
        StderrEvent  => "task_debug",
        CloseEvent   => "task_done",
      );

    $heap->{task}->{ $task->ID } = $task;
    $heap->{"t".$task->ID} = $session;
  }
}


Dit doet start een nieuwe webuser-sessie. Iedere sessie volgt een random click-path door de te testen website. Na iedere click wordt er een aantal seconden (random tussen x en y) gewacht tot de volgende click. Mbv POE kunnen deze 'users' ook daadwerkelijk naast elkaar bestaan.

Het probleem is echter als volgt;
* Ik wil mijn website met 500 users pesten.
* Er mogen er maar 300 tegelijk bezig zijn (MAX_CONCURRENT_TASKS)
* Het aantal clicks dat tijdens het opstarten van de stress-test veroorzaakt wordt is moordend.

Hoe kan je dit meer spatieren, liefst mbv POE zelf.

Ik heb intussen wel een oplossing gefabriekt, maar daar wordt ik nog niet erg gelukkig van.

code:
1
2
3
4
5
6
7
  my $max  = 1;
  while keys < $max {
    $max = ($task_cnt - $#tasks);
    $max *= 2;
    $max = MAX_CONCURRENT_TASKS if $max > MAX_CONCURRENT_TASKS;
    $max = $prev if ( $max > keys %{ $heap->{task} } and $prev ne undef );
    ...

[ Voor 8% gewijzigd door Verwijderd op 27-03-2003 17:12 ]