Bagaimana GRO (generic menerima offload) bekerja pada NIC yang lebih maju?

14

Saya tertarik pada jawaban tertentu:

  1. Apakah NIC dengan GRO mengedit / membuat TCP ACK atau paket lain (atau apakah fitur ini transparan untuk penerima / pengirim tumpukan TCP)?
  2. Harus ada batas waktu / peristiwa ketika NIC harus meneruskan "segmen terpaku" ke tumpukan TCP? Apakah mereka?
  3. Dalam pengaturan penerusan paket - apakah fitur GRO juga mencoba membaca ACK penerima (lihat mengapa saya menanyakan hal ini)?
  4. Setiap sumber yang menjelaskan GRO dan juga fitur-fitur pembongkaran NIC lainnya (TSO, LSO ...) lebih baik daripada halaman manual wikipedia dan linux akan sangat dihargai.

Keterangan lebih lanjut:

Saya memecahkan masalah kinerja dengan satu implementasi IPSec. Masalahnya adalah bandwidth yang tersedia tidak terdistribusi secara merata di semua 4 terowongan VPN (didistribusikan sekitar 200MBps / 200MBps / 1MBps / 1MBps; Setiap terowongan VPN mengenkapsulasi koneksi TCP tunggal). Di PCAP sesekali saya melihat bahwa server web menganggur seperti ~ 2 detik (menunggu ACK). Mengunduh resume ketika server web mentransmisikan kembali segmen yang tidak diakui.

Batasan batin saya dari PCAP adalah bahwa fitur NIC GRO menempelkan paket-paket bersama tetapi kadang-kadang tidak meneruskannya ke TCP stack secara tepat waktu dan itulah yang menyebabkan masalah.

Karena server VPN ini tidak memiliki antarmuka yang mengakhiri koneksi TCP melainkan hanya meneruskan paket. Kemudian saya mencoba untuk menonaktifkan GRO dan setelah itu saya mengamati bahwa lalu lintas didistribusikan secara merata di semua terowongan. Juga ketika penskalaan jendela TCP dinonaktifkan pada Webserver, maka bandwidth juga didistribusikan bahkan dengan GRO diaktifkan (itulah sebabnya saya punya pertanyaan # 3).

Saya menggunakan linux 2.6.32-27 di server Ubuntu 10.04 (64-bit). NIC adalah Intel 82571EB. Semua antarmuka (klien HTTP, klien VPN, VPN Server, Webserver) terhubung langsung secara berantai dengan kabel Ethernet 1Gbit.

pengguna389238
sumber

Jawaban:

15

Saya telah menemukan artikel ini sangat berguna: JLS2009: Generik menerima pembongkaran . Ini memberi gambaran besar tentang cara kerja GRO.

  1. Beberapa adaptor mungkin melakukannya, tetapi driver yang terkait juga harus menyadarinya. Juga, driver sendiri dapat melakukan ini dalam perangkat lunak. Karena hal ini terjadi sebelum memasuki tumpukan Kernel TCP / IP, pada saat tumpukan TCP / IP kernel-ruang telah sepenuhnya dimasukkan, paket-paket telah disesuaikan ulang.
  2. Timeout didefinisikan oleh spec GRO sebagai satu 'centang' TCP / IP (peningkatan bidang Time Stamp), yang merupakan jumlah yang sangat kecil tetapi pada jaringan cepat beberapa paket mungkin masih dapat diterima.
  3. GRO akan ikut bermain di sisi penerima forwarder, dan pada kenyataannya GRO dibuat sehingga metode LRO yang lebih serakah akan berhenti mengacaukan paket pada forwarder.
  4. Artikel yang saya tautkan di atas sangat membantu.

Ethtool mungkin dapat mengaktifkan / menonaktifkan GRO pada antarmuka tertentu. Tergantung pada versi.

sysadmin1138
sumber
1
Saya memperbarui pertanyaan saya. Tampaknya Anda menjawab # 1 dalam konteks semua fitur pembongkaran (IMHO GRO saja tidak menghasilkan ACK - hanya "menempelkan" semua paket untuk satu centang TCP / IP dan kemudian menanganinya ke OS). Terima kasih!
user389238