Pengaturan TCP latensi rendah di Ubuntu

10

Ada server untuk pengukuran yang berjalan di Ubuntu di lab saya. Dan ada program C, yang menerima data melalui koneksi TCP dan harus secepatnya mengirim balasan.

Konfigurasi

  • CPU: 2 prosesor x 4 core - Intel (R) Xeon (R) CPU E5345 @ 2.33GHz
  • RAM: 12 GB
  • NIC: Intel Corporation 80003ES2LAN Pengontrol Gigabit Ethernet / Pengontrol Gigabit Ethernet 82546EB
  • Switch jaringan: Cisco Catalyst 2960
  • Info data: Blok data datang kira-kira. masing-masing 10 milidetik. Ukuran blok data sekitar. 1000 byte.

Latensi jaringan saat menerima paket sangat penting (puluhan mikrodetik penting). Saya mengoptimalkan program secara maksimal, tetapi saya tidak punya pengalaman mengutak-atik Ubuntu.

Apa yang dapat dikonfigurasikan di Ubuntu untuk mengurangi penundaan pemrosesan / pengiriman paket lokal?

Alex V
sumber
Ya, saya ingin tahu model / server yang dibuat.
ewwhite
Anda harus menggali lebih dalam. baca beberapa hal tentang optimasi kernel untuk perdagangan frekuensi tinggi. Membuat penjualan Cisco Paper: cisco.com/c/dam/en/us/products/collateral/switches/... jadi mendapatkan PCI-E Card yang layak di kedua sisi akan menghemat juga. Kemungkinan besar (tergantung pada berapa banyak waktu yang ingin Anda habiskan untuk ini) Anda akan membangun kembali setidaknya kernel dengan pengaturan yang berbeda, menghapus banyak hal yang memang diperlukan ubuntu tetapi Anda tidak. Jadi seperti ewwhite menulis dalam komentar, ubuntu mungkin tidak sempurna untuk pengaturan terendah.
Dennis Nolte
Dengan perangkat keras yang terdaftar, ini adalah peralatan era 2008 (Intel 5300-series CPUs). Saat itu, tidak ada terlalu banyak perubahan perangkat keras latensi khusus yang mungkin. Saya akan mengatur BIOS sistem untuk dijalankan dalam mode kinerja tinggi dan menonaktifkan CPU C-States.
ewwhite
@ewwhite Ya, Anda benar tentang peralatan era 2008. Saya akan mencoba saran Anda. Terima kasih!
Alex V
Adakah kemampuan untuk mengubah perangkat lunak ini untuk TCP_NODELAY?
Matt

Jawaban:

10

Jujur, saya tidak akan menggunakan Ubuntu untuk ini ... tetapi ada opsi yang dapat diterapkan untuk varian Linux apa pun.

Anda ingin meningkatkan buffer tumpukan jaringan Anda:

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

Jika aplikasi sedang menulis ke disk, mungkin diperlukan perubahan scheduler / elevator (mis. deadlineLift).

Di tingkat server, Anda dapat memodifikasi pengatur CPU dan manajemen daya dan frekuensi CPU (P-States, C-States).

Pada level OS, Anda dapat mengubah prioritas waktu-nyata aplikasi Anda ( chrt), mengoptimalkan untuk mengurangi interupsi, menyematkannya ke CPU atau grup CPU ( taskset), dan menghentikan semua layanan atau daemon yang tidak perlu.

Anda juga dapat melihat beberapa saran di: Cara mengatasi masalah latensi antara 2 host linux

Sulit untuk menjadi lebih spesifik tanpa mengetahui perangkat keras atau peralatan jaringan yang terlibat.

putih
sumber
3
Ini sebenarnya bukan tempat yang tepat untuk debat agama. Bawa ke tempat lain, seperti obrolan.
Michael Hampton
1
@MichaelHampton Ada tautan menarik dalam diskusi yang terkait dengan pertanyaan: Red Hat Realtime Tuning Guide .
Alex V
6

Jika Anda menuju rute kinerja tinggi biasanya Anda ingin menjalankan sesedikit mungkin proses (terjadwal) lainnya karena akan mengganggu aplikasi Anda.

Linux, seperti sistem operasi UNIX klasik, dirancang untuk menjalankan beberapa aplikasi secara bersamaan dengan cara yang adil dan mencoba untuk mencegah kelaparan sumber daya dan Anda akan mengincar yang sebaliknya, membuat kelaparan segala sesuatu yang lain kecuali aplikasi Anda. Langkah-langkah sederhana di tingkat OS mengubah tingkat yang menyenangkan dan prioritas waktu nyata aplikasi Anda, mengubah penjadwal atau menggunakan kernel waktu nyata .

TCP / IP biasanya disetel untuk mencegah penurunan koneksi dan membuat efisien penggunaan bandwidth yang tersedia. Untuk mendapatkan latensi serendah mungkin dari tautan yang sangat cepat, alih-alih mendapatkan bandwidth tertinggi yang mungkin dari koneksi di mana beberapa tautan perantara lebih dibatasi, Anda akan menyesuaikan penyetelan tumpukan jaringan.

 sysctl -a 

akan menampilkan sejumlah pengaturan kernel yang dapat Anda sesuaikan. Pengaturan tergantung pada apakah Anda menggunakan IPv4 atau IPv6 atau tidak dan apa sebenarnya yang sudah Anda lakukan dalam aplikasi tetapi menarik:

  • net.ipv4.tcp_window_scaling=1 RFC 1323 - dukungan untuk ukuran jendela IPV4 TCP lebih besar dari 64K - umumnya diperlukan pada jaringan bandwidth tinggi
  • net.ipv4.tcp_reordering=3 Waktu maksimum paket IPV4 dapat disusun ulang dalam aliran paket TCP tanpa TCP dengan asumsi paket hilang dan mulai lambat.
  • net.ipv4.tcp_low_latency=1dimaksudkan untuk memberikan preferensi pada latensi rendah daripada throughput yang lebih tinggi; setting = 1 menonaktifkan pemrosesan IPque4 tcp prequeue
  • net.ipv4.tcp_sack=0 pengaturan ke 1 memungkinkan pengakuan selektif untuk IPV4, yang mengharuskan tcp_timestamps diaktifkan dan menambahkan beberapa overhead paket, yang tidak Anda perlukan jika Anda tidak mengalami packetloss
  • net.ipv4.tcp_timestamps=0 Hanya disarankan dalam kasus di mana karung diperlukan.
  • net.ipv4.tcp_fastopen=1 Memungkinkan untuk mengirim data dalam paket SYN pembuka.

Sebagian besar jika tidak semua didokumentasikan dengan lebih baik di sumber kernel .

Anda tentu saja dapat kode soket TCP mentah dan sebagian besar by-pass stack TCP / IP kernel sama sekali.

Sistem yang sering disetel berjalan di jaringan tepercaya dan firewall lokal (iptables) mereka dinonaktifkan.

HBruijn
sumber