Vraag


Acties:
  • 0 Henk 'm!

Anoniem: 80910

Topicstarter
Mijn vraag
...
ik heb middels javascript & php een server sent event kanaal openstaan en nu ben ik een test aan het draaien.

en haal ik zo'n 11600 events per minuut met een usleep van 5000 msec. dit is gewoon een test wat loopt om te kijken wat het doet, maar mij valt op dat php-fpm8.3 ongeveer 2% cpu inneemt voor dit process en apache2 bijna 4% wat dus op 6% uitkomt dus 100 /6 = 16,6 ~= 15 users per core...
dus 15 * 11600 = 174000 events met data kunnen worden gestuurd per core.

in php op de backend maak ik van de data een compressed versie en in javascript decompress ik die data weer.

Zou nginx hier beter mee overweg kunnen (server sent events) of moet ik gaan kijken naar frankenphp of react-php of zelf iets schrijven met stream_socket etc...


Ik snap dat mijn php script 2% inneemt, maar wat is apache2 aan het doen? volgens mij moet ie de data alleen maar encrypten, dat kost toch geen 4% cpu usage ?


Afbeeldingslocatie: https://tweakers.net/i/blW0HbppaDhtTj_yaaS0Xfe-xh0=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/t6hlbzangtjSCQGr63czvcUY.png?f=user_large

Relevante software en hardware die ik gebruik
...
php 8.3 om het te compressen
apache2
pako in javascript om te decompressen


Wat ik al gevonden of geprobeerd heb

compress in php met base64 met gzdeflate -> decompress in javascript met base64 encoding en atob en pako.inflate

basis kennis van server sent events, nog tests aan het draaien of ik het ga implementeren, maar kan zoveel events aan op 1 core dat het wel doorgaat denk ik.

php code

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    $id = 1;
    Core::interactive();
    $origin = Server::origin();
    $methods = [
        'GET',
    ];
    header("HTTP/1.1 200 OK");
    header('Access-Control-Allow-Credentials: true');
    header("Access-Control-Allow-Origin: {$origin}");
    header('Access-Control-Allow-Methods: ' . implode(', ', $methods));
    header('Access-Control-Allow-Headers: Origin, Cache-Control, Content-Type, Authorization, X-Requested-With');
    header('Access-Control-Expose-Headers: Cache-Control, Connection, Content-Encoding, Content-Language, Content-Length, Content-Type, Expires, Last-Modified, Pragma, Transfer-Encoding, X-Accel-Buffering');
    header('Access-Control-Max-Age: 1800'); // a stream will have a bandwidth of 30 minutes by default
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    header('Connection: keep-alive');
    header('X-Accel-Buffering: no');
    header('Transfer-Encoding: chunked');
    header('Content-Encoding: none');
    $time = microtime(true);
    $start = $time;
    $previous = false;
    $date = date('Y-m-d- H:i:s');
    while(true){
        echo 'id: ' . $id . "\n";
        echo 'event: waiting-for-response' . "\n";
        echo 'data:' . base64_encode(gzdeflate(json_encode(['time' => $time, 'date' => $date]), 9)) . "\n";
        echo "\n\n";
        if($id % 50 === 0){
            $previous = $time;
            $time = microtime(true);
            $date = date('Y-m-d- H:i:s');
        }
        if($id === 1){
            echo ':' . str_repeat('a', 4096) . "\n";
            echo "\n\n";
        }
        flush();
        usleep(5000);
        $id++;
        if($time > ($start + 60)){
            exit(0);
        }
    }


javascript code
JavaScript:
1
2
3
4
5
6
7
8
const eventSource = new EventSource(sse.url,{
        withCredentials: true,
});
eventSource.addEventListener('waiting-for-response', (event) => {
        let data = pako.inflate(atob(event.data),{ raw: true, to: 'string' });
        console.log(data);
        console.log('waiting for response');
});


Je moet pako nog wel ff includen...

[ Voor 40% gewijzigd door Anoniem: 80910 op 03-03-2024 01:59 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 01:07

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Dus je bent aan 't "profilen" door te kijken naar % cpu-usage :? Dat is hetzelfde als aan de knalpijp van de auto gaan luisteren wat er mis is met de motor.

Ik zou sowieso eens beginnen met de zaak om te draaien: wat probeer je te bereiken, wat is je doel? Hoeveel events moet je daadwerkelijk versturen, hoeveel concurrent users verwacht je te gaan moeten bedienen? Is SSE überhaupt wel de juiste keus en heb je bijvoorbeeld ook websockets overwogen? Hoe representatief is deze test vergeleken met het daadwerkelijke systeem dat je gaat bouwen? Je zegt dat Apache alleen maar hoeft te encrypten; ik neem aan dat je SSL bedoelt? Verder noem je geen hoeveelheden data, noch hebben we een idee over de pijp die aan die machine hangt. Misschien heb je wel gewoon je lijn verzadigd? Ik heb zoveel vragen...

[ Voor 25% gewijzigd door RobIII op 03-03-2024 03:56 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Anoniem: 80910

Topicstarter
Ja, alsof er onverbrande benzine de pijp verlaat.

Ja, apache2 handelt de ssl, met het script in de achtergrond. Keep alive staat momenteel op een minuut en ik wou eens zien hoe het performed.
Keuze voor sse in plaats van web sockets, leek me, read-only voordeel, ssl out of the box, kan middels http voorzien worden van updates/ mutaties.

Dit was gewoon een test, mijn laptop lijkt in de praktijk iets sneller dan mijn server.
Heb ook met 2 msec getest en toen had apache2 8% cpu, en dat is waar ik het niet begrijp. Apache2 is een doorgeefluik van php-fpm, dus ik ging er van uit dat het php process de cpu iets verhoogd, maar apache2 eigenlijk niet.

Had graag gezien dat ik tot 100 / 150 users tegelijk op 1 core kwijt kon, dan heb je bij 8-core 1000 zulke connecties / users, waar je dan een website live kan updaten.

Nu wil ik het in eerste instantie in een beheer omgeving gaan gebruiken (cms) zodat met meerdere mutaties tegelijk kan doen (multi-user) nu zullen er dat 5-10 max zijn, maar de stats geven aan dat dat er 15 kunnen worden met deze instellingen. Nu heb 11000+ ping request per minuut met een beetje data (paar MB/min.

Maar ik denk niet dat ik 150 users met 1000 ping request/min aan kan op 1 core.
Ook niet 150 users met 60 events (1 per seconde)

Web sockets gaat toch via een andere poort / programma en moet ik ssl in bakken dus leek mij moeilijker te implementeren.

Is web sockets lichter dan server sent events ?

Websites vallen dan eigenlijk af, vanwege te hoge resources...

Replica's die een poortje openen met de master lijkt me ook leuk en wellicht zo de replica's syncen via poort 443. Maar goed heb me allang niet meer met replica's bezig gehouden (10 jaar al niet meer) dus wellicht zijn daar ook mooie pakketten voor.

Weet iemand een soort van 150 verbindingen tegelijk open te houden met initieel een lage load want er gebeurt niets. Kan dat met websockets op 1 cpu, of houdt dat ook per 15 verbindingen op want cpu vol belast ?

Voor scrum zou het bijvoorbeeld ook handig ingezet kunnen worden om bijvoorbeeld notificaties van teams te versturen. Zo weet je waar iedereen van je team mee bezig is.

Ik heb net met een usleep(25000) dus 25 msec getest en hij doet gezamenlijk 1%
Afbeeldingslocatie: https://tweakers.net/i/nV3lFHhBmRZYBHRLd5DOc3wUS34=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/dWDJd4AtarYANLH1nSdQNU2L.png?f=user_large _/-\o_

dan heb ik nog 2390 events per minuut per gebruiker en nu kan ik er 90 draaien op 1 core zo te zien...
en dit is inclusief compressie en base64_encode dus de code kost 10 events momenteel inclusief json_encode en een reconnect _/-\o_ (215.000 events)

das serverside 39,83 frames (events) per seconde, prima toch ?

50 msec (1200 events /frames per minuut) kost soms ook 1% dus kan ik beter 25 msec aanhouden

[ Voor 29% gewijzigd door Anoniem: 80910 op 04-03-2024 01:04 . Reden: conclusie ]