Saya ingin mengubah nilai TCP RTO (retransmission timeout) untuk koneksi, dan beberapa pembacaan yang saya lakukan menunjukkan bahwa saya bisa melakukan ini, tetapi tidak mengungkapkan di mana dan bagaimana mengubahnya.
Saya telah melihat /proc/sys/net/ipv4
variabel, tetapi tidak ada variabel yang terkait dengan RTO. Saya akan sangat menghargai jika seseorang dapat memberi tahu saya cara mengubah nilai ini.
linux
linux-kernel
tcp
obiigbe91
sumber
sumber
ip route replace
- sepertinyaip route
sintaks telah sedikit berubah. Saya berhasil membuat modifikasi. Sekadar diketahui, Anda harus mengomentari jawabannya, bukan pertanyaan jika Anda ingin mem-ping saya - pada dasarnya saya melihat ini secara tidak sengaja, semoga beruntung bahwa itu baru-baru ini :)Jawaban:
Alasan Anda tidak dapat mengubah RTO secara khusus adalah karena itu bukan nilai statis. Sebaliknya (kecuali untuk SYN awal, tentu saja) ini didasarkan pada RTT (Round Trip Time) untuk setiap koneksi. Sebenarnya, ini didasarkan pada versi RTT yang dihaluskan dan varian RTT dengan beberapa konstanta dilemparkan ke dalam campuran. Oleh karena itu, ini adalah nilai yang dinamis dan dihitung untuk setiap koneksi TCP, dan saya sangat merekomendasikan artikel ini yang lebih rinci tentang perhitungan dan RTO secara umum.
Juga relevan adalah RFC 6298 yang menyatakan (di antara banyak hal lainnya):
Apakah kernel selalu mengatur RTO ke 1 detik? Nah, dengan Linux Anda dapat menunjukkan nilai RTO saat ini untuk koneksi terbuka Anda dengan menjalankan
ss -i
perintah:Di atas adalah output dari VM yang saya masuki dengan SSH dan memiliki beberapa koneksi terbuka ke google.com. Seperti yang Anda lihat, RTO sebenarnya diatur ke 200-ish (milidetik). Anda akan mencatat bahwa tidak dibulatkan ke nilai 1 detik dari RFC, dan Anda mungkin juga berpikir bahwa itu agak tinggi. Itu karena ada batas minimum min (200 milidetik) dan maks (120 detik) ketika datang ke RTO untuk Linux (ada penjelasan bagus tentang ini dalam artikel yang saya tautkan di atas).
Jadi, Anda tidak dapat mengubah nilai RTO secara langsung, tetapi untuk jaringan lossy (seperti nirkabel) Anda dapat mencoba mengubah-ubah F-RTO (ini mungkin sudah diaktifkan tergantung pada distro Anda). Sebenarnya ada dua opsi terkait yang terkait dengan F-RTO yang dapat Anda atur (ringkasan bagus di sini ):
Bergantung pada apa yang Anda coba optimalkan, ini mungkin bermanfaat atau tidak.
EDIT: menindaklanjuti kemampuan untuk mengubah nilai rto_min / max untuk TCP dari komentar.
Anda tidak dapat mengubah RTO minimum global untuk TCP (selain itu, Anda dapat melakukannya untuk SCTP - yang diekspos dalam sysctl), tetapi kabar baiknya adalah Anda dapat mengubah nilai minimum RTO pada per-rute dasar. Ini tabel routing saya di CentOS VM saya:
Saya dapat mengubah nilai rto_min pada rute default sebagai berikut:
Dan sekarang, tabel perutean saya terlihat seperti ini:
Akhirnya, mari kita mulai koneksi dan periksa
ss -i
untuk melihat apakah ini telah dihormati:Keberhasilan! Rto pada koneksi HTTP (setelah perubahan) adalah 15ms, sedangkan koneksi SSH (sebelum perubahan) adalah 200+ seperti sebelumnya.
Saya sebenarnya menyukai pendekatan ini - ini memungkinkan Anda untuk mengatur nilai yang lebih rendah pada rute yang sesuai daripada secara global di mana mungkin mengacaukan lalu lintas lainnya. Demikian pula (lihat halaman manual ip ) Anda dapat men-tweak estimasi rtt awal dan rttvar awal untuk rute (digunakan saat menghitung RTO dinamis). Meskipun ini bukan solusi lengkap dalam hal tweaker, saya pikir sebagian besar bagian penting ada di sana. Anda tidak dapat mengubah pengaturan maks, tapi saya pikir itu tidak akan berguna secara umum dalam hal apa pun.
sumber
rto_max
? Bagaimana cara menetapkan batas waktu maksimum global?net.ipv4.tcp_retries1
dannet.ipv4.tcp_retries2
atau IIRC serupa) diperbolehkan, saya pikir Anda bisa mendapatkan setara dengan maksimum RTO.