Mengurangi waktu respons saat mengirim data melalui UDP

Halo, Habr! Pada artikel ini, saya ingin berbicara tentang menyelesaikan salah satu masalah umum yang ditangani Embox lebih baik daripada GNU / Linux. Ini adalah waktu respons terhadap paket yang dikirim melalui protokol Ethernet. Seperti yang Anda ketahui, karakteristik utama pengiriman data melalui jaringan adalah bandwidth, dan GNU / Linux baik-baik saja dengan itu. Tetapi ketika datang untuk mengurangi waktu yang diperlukan untuk menerima / mengirim paket jaringan tunggal, masalah dapat muncul. Secara khusus, pelanggan memiliki board DE0-Nano-SoC dengan Linux, dan dengan bantuan board ini saya ingin mengontrol objek tertentu melalui jaringan. Topologi jaringan adalah point-to-point, tidak ada router dan hub. Menurut model kontrol, waktu reaksi harus kurang dari 100 ΞΌs, dan berbasis Linux dimungkinkan hanya mencapai 500 ΞΌs.


DE0 Nano SoC kit


Untuk memperkirakan waktu transmisi, kami membuat dudukan yang terdiri dari dua host.


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