Réduction du temps de réponse lors de la transmission de données via UDP

Bonjour, Habr! Dans cet article, je veux parler de la résolution d'un des problèmes courants que Embox gère mieux que GNU / Linux. Il s'agit du temps de réponse à un paquet transmis via le protocole Ethernet. Comme vous le savez, la principale caractéristique de la transmission de données sur un réseau est la bande passante, et GNU / Linux s'en sort bien. Mais lorsqu'il s'agit de réduire le temps nécessaire pour recevoir / transmettre un seul paquet réseau, des problèmes peuvent survenir. En particulier, le client avait une carte DE0-Nano-SoC avec Linux, et avec l'aide de cette carte, je voulais contrôler un certain objet sur le réseau. La topologie du réseau est point à point, il n'y a pas de routeurs et de concentrateurs. Selon le modèle de contrôle, le temps de réaction devrait être inférieur à 100 μs, et sous Linux, il n'était possible d'atteindre que 500 μs.


Kit DE0 Nano SoC


Pour estimer le temps de transmission, nous créons un stand composé de deux hôtes.


GNU/Linux, — DE0-Nano-SoC Kit Embox. FPGA HPS (Hard Processing System, .. ARM), . , UDP- :


while (1) {
    char buf[BUFLEN];

    recvfrom(s, buf, BUFLEN);    
    sendto(s, buf, BUFLEN);
}

, DE0-Nano-SoC.


, :


for (int i = 0; i < N; i++) {
    char buf_tx[BUFLEN], buf_rx[BUFLEN];
    sprintf(buf_tx, "This is packet %d\n", i);

    time_t time_begin = time_now();

    sendto(s, buf_tx, BUFLEN);
    recvfrom(s, buf_rx, BUFLEN);

    time_t time_end = time_now();

    if (memcmp(buf_tx, buf_rx, sizeof(buf))) {
            printf("%d: Buffer mismatch\n", i);
    }

    if (time_end - time_begin > TIME_LIMIT) {
            printf("Slow answer #%d: %d\n", i, time_end - time_begin);
    }
}

, .


Github.


, , :


  • UART — ,
  • -O2
  • - PL310 ( )

500 000 ( ) :


Avg: 4.52ms
Min: 3.12ms
Max: 12.24ms

, , — . , Linux . , .


, ? , .


, - , , ? — .


, ethernet- — USB-, 100/, .


1 :


Avg: 0.08ms
Min: 0.07ms
Max: 4.31ms

Linux


Linux. -: arm-linux-gnueabihf-gcc server.c -O2. ELF :


Avg: 0.77ms
Min: 0.74ms
Max: 5.31ms

, Embox "" 9 , !



, "", , .


, , , UDP- .


, UDP-.


, UDP . , . . :


int net_tx(...) {
    if (is_udp_packet()) {
        timestamp2 = timer_get();
        memcpy(packet[UDP_OFFT],
            &timestamp1,
            sizeof(timestamp1));
        memcpy(packet[UDP_OFFT + sizeof(timestamp2)],
            &timestamp2,
            sizeof(timestamp2));
        ...
    }
}

, , , Embox.



Avg: 8673
Min: 6191 
Max: 11950

, ( ) 25%, (Avg: 0.08ms Max: 4.31ms). ( , , , ), . , , 25%.


, ?




— Linux, .


?


, — :


nice -n -20 ./client


— , , .


— round robin , chrt:


chrt --rr 99 ./client


— . ( , .. ).



Embox , 10 . , , . , Linux, - bpfilter.


- — embox-devel@googlegroups.com, -, .


All Articles