Gunakan TCP_QUICKACK, bukan TCP_NODELAY
Mengaktifkan TCP_NODELAY memiliki efek yang serupa, tetapi dapat memperburuk throughput untuk penulisan kecil. Jika Anda menulis loop yang mengirim hanya beberapa byte (kasus terburuk, satu byte) ke soket dengan "write()", dan algoritma Nagle dinonaktifkan dengan TCP_NODELAY, setiap penulisan menjadi satu paket IP. Ini meningkatkan lalu lintas dengan faktor 40, dengan IP dan TCPheader untuk setiap muatan. Pencegahan Tinygram tidak akan membiarkan Anda mengirim paket kedua jika Anda memilikinya dalam penerbangan, kecuali Anda memiliki cukup data untuk mengisi paket berukuran maksimum. Itu mengakumulasi byte untuk satu kali perjalanan pulang pergi, lalu mengirimkan semuanya dalam antrean. Itu hampir selalu yang Anda inginkan. Jika Anda memiliki set TCP_NODELAY, Anda harus lebih waspada terhadap masalah buffering dan pembilasan. Semua ini tidak penting untuk transfer massal satu arah, yang merupakan sebagian besar HTTP saat ini. (Saya tidak pernah melihat dampaknya pada jabat tangan SSL, yang mungkin penting.) Versi singkat:atur TCP_QUICKACK. Jika Anda menemukan kasus yang memperburuk keadaan, beri tahu saya. John Nagle
https://news.ycombinator.com/item?id=10608356
Tidak ada hubungan langsung antara kedua opsi tersebut, keduanya hanya untuk tujuan yang berbeda.
TCP_NODELAY dimaksudkan untuk menonaktifkan/mengaktifkan buffering segmen sehingga data dapat dikirim ke peer secepat mungkin, jadi ini biasanya digunakan untuk meningkatkan pemanfaatan jaringan. TCP_QUICKACK digunakan untuk mengirimkan ucapan terima kasih sedini mungkin daripada tertunda di bawah beberapa pertukaran tingkat protokol, dan itu tidak stabil/permanen, transaksi TCP berikutnya (yang mungkin terjadi di bawah terpal) dapat mengabaikan opsi ini tergantung pada pemrosesan tingkat protokol aktual atau ketidaksepakatan aktual apa pun antara pengaturan pengguna dan perilaku tumpukan.
CATATAN TCP_NODELAY
portabel sementara TCP_QUICKACK
tidak (hanya berfungsi di Linux 2.4.4+).
TCP_QUICKACK
dan TCP_NODELAY
mempengaruhi operasi yang berbeda di TCP. tcp(7)
halaman manual menjelaskan opsi soket mana untuk TCP yang saling mengganggu, mis. TCP_CORK
dan TCP_NODELAY
.
Jawaban singkat
- Untuk menonaktifkan algoritme buffering Nagle, gunakan opsi soket TCP_NODELAY.
- Untuk menonaktifkan ACK Tertunda, gunakan opsi soket TCP_QUICKACK.
Detail
-
Algoritme Nagle
- Algoritme Nagle, dinamai menurut penciptanya John Nagle, adalah salah satu mekanisme untuk meningkatkan efisiensi TCP dengan mengurangi jumlah paket kecil yang dikirim melalui jaringan.
- Tujuannya adalah untuk mencegah node mengirimkan banyak paket kecil jika aplikasi mengirimkan data ke soket agak lambat.
- Jika suatu proses menyebabkan banyak paket kecil ditransmisikan, proses tersebut mungkin menyebabkan kemacetan jaringan yang tidak semestinya. Hal ini terutama terjadi jika muatan paket lebih kecil daripada data header TCP.
-
ACK tertunda
- Pengakuan tertunda TCP atau Delayed ACK adalah teknik lain yang digunakan oleh beberapa implementasi TCP dalam upaya meningkatkan kinerja jaringan dan mengurangi kemacetan.
- Delayed ACK ditemukan untuk mengurangi jumlah ACK yang diperlukan untuk mengenali segmen dan mengurangi overhead protokol.
- ACK tertunda berarti TCP tidak langsung mengakui setiap segmen TCP yang diterima. Beberapa respons ACK dapat digabungkan menjadi satu respons, sehingga mengurangi overhead protokol.
-
Algoritma Nagle dan ACK Tertunda Tidak Dapat Dimainkan Bersama dengan Baik di Jaringan TCP/IP
- ACK yang tertunda mencoba mengirim lebih banyak data per segmen jika bisa. Namun bagian dari algoritme Nagle bergantung pada ACK untuk mengirim data.
- Algoritme Nagle dan ACK Tertunda bersama-sama menciptakan masalah karena ACK Tertunda menunggu untuk mengirim ACK sementara Nagle menunggu untuk menerima ACK
-
Bagaimana cara mengatasi masalah yang disebabkan oleh algoritme Nagle dan ACK Tertunda
- Aktifkan TCP_NODELAY untuk menonaktifkan algoritme Nagle melalui opsi soket global di server
- Buat tweak profil di server proxy dan Load Balancers:Ini sangat relevan jika Anda menjalankan aplikasi atau lingkungan yang terkadang hanya memiliki lalu lintas yang sangat interaktif dan protokol yang cerewet. Dengan mengaktifkan dan menonaktifkan Algoritma Nagle dan TCP_NODELAY secara dinamis pada tingkat penyeimbang muatan, Anda dapat menjaga campuran lalu lintas yang sangat heterogen tetap berjalan secara optimal.
- Kurangi timer ACK Tertunda di server dan load balancer Anda. Terkadang, pengoptimalan semacam ini ditangani dalam perangkat lunak, di tingkat aplikasi, tetapi jika tidak demikian, Anda mungkin masih dapat mengelola timer ACK secara dinamis di tingkat server atau penyeimbang muatan.
- Saat Anda melakukan perubahan ini, tetap awasi dengan cermat lalu lintas jaringan Anda dan lihat bagaimana setiap penyesuaian memengaruhi kemacetan.
Untuk detail selengkapnya, silakan lihat ini