Reduzierung der Antwortzeit bei der Datenübertragung über UDP

Hallo Habr! In diesem Artikel möchte ich über die Lösung eines der häufigsten Probleme sprechen, mit denen Embox besser als GNU / Linux umgeht. Dies ist die Antwortzeit auf ein Paket, das über das Ethernet-Protokoll übertragen wird. Wie Sie wissen, ist das Hauptmerkmal der Datenübertragung über ein Netzwerk die Bandbreite, und GNU / Linux macht das gut. Wenn es jedoch darum geht, die Zeit zum Empfangen / Senden eines einzelnen Netzwerkpakets zu verkürzen, können Probleme auftreten. Insbesondere hatte der Kunde eine DE0-Nano-SoC-Karte mit Linux, und mit Hilfe dieser Karte wollte ich ein bestimmtes Objekt über das Netzwerk steuern. Die Netzwerktopologie ist Punkt-zu-Punkt, es gibt keine Router und Hubs. Nach dem Kontrollmodell sollte die Reaktionszeit weniger als 100 μs betragen, und unter Linux konnten nur 500 μs erreicht werden.


DE0 Nano SoC Kit


Um die Übertragungszeit abzuschätzen, erstellen wir einen Stand, der aus zwei Hosts besteht.


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