@@ -630,6 +630,107 @@ <h3>TCP的最佳化處理</h3>
630
630
連線可以在最新高速網路裡頭傳輸資料的速率,往往是受限於接收端和發送端之間的往返時間。更進一步來說,雖然頻寬會持續增加,但延遲時間還是會被光速所侷限,而且已經是其最大值的一個最小常數係數範圍以內了。在大多數情況下,延遲(而非頻寬)就是
631
631
TCP 的效能瓶頸(如圖7所示)
632
632
</ p >
633
+ < h3 > 伺服器設定的調整作業</ h3 >
634
+ < p >
635
+ 一開始,針對 TCP
636
+ 裡的每個緩衝區和逾時變數之類的各種設定,去調整為任何特定數值之前,你最好能夠先把自己的主機升級到最新的系統版本。TCP
637
+ 的最佳實例以及用來控管它的效能的演算法,都會持續進化,而大多數的這類改變都只有在最新版的核心底下才能夠使用。簡單來說,讓你的伺服器保持在最新版本狀態,以確保發送端和接收端的
638
+ TCP 堆疊之間,能夠擁有最理想的互動狀態。
639
+ </ p >
640
+ < blockquote >
641
+ < p >
642
+ 從表面上看來,升級伺服器核心版本似乎只是個稀鬆平常的事情。但實際上,卻經常會碰到不小的麻煩一許多現有伺服器都是針對特定核心版本而被調校的,而且系統管理員也不太願意去進行系統升級動作。
643
+ </ p >
644
+ < p >
645
+ 平心而論,每次的升級也都會有它的風險,但是為了獲得最佳的 TCP
646
+ 效能,卻似乎也算是個不錯的投資。
647
+ </ p >
648
+ </ blockquote >
649
+ < p >
650
+ 有了最新版的核心之後,最好可以去確認一下,你的伺服器有被確實地設定去使用下列的最佳慣例:
651
+ </ p >
652
+ < ul >
653
+ < li >
654
+ < span >
655
+ 《提高TCP 的擁塞視窗的初始大小》較大的起始擁塞視窗允許 TCP
656
+ 在第一次的往返當中,傳輸更多資料,即可明顯加速視窗的成長速度一這是一種針對突發性的大量短連結特別有效的最佳化方式。
657
+ </ span >
658
+ </ li >
659
+ < li >
660
+ < span >
661
+ 《緩步啟動重啟(SSR)》在網路閒置後,關掉緩步啟動將會提升及時間建接,且需要傳輪大最資料的
662
+ TCP 速線的效能。
663
+ </ span >
664
+ </ li >
665
+ < li >
666
+ 《視窗縮放機制(RFC
667
+ 1323)》啟動視窗縮放機制會提高接收視窗大小的最大值,並使得高延遲連線達到更好的總
668
+ 吞吐量。
669
+ </ li >
670
+ < li >
671
+ 《TCP快啟機制》允許應用程式在特定情況下,以最初的 SYN 封包來發送資料。TFO
672
+ 是二項新的最佳化方式,而這得伺服器與客戶端都同時支援才行一假如你的應用程式可以使用此項功能的話,不妨一試。
673
+ </ li >
674
+ </ ul >
675
+ < p >
676
+ 上述設定與最新核心的結合,將可以讓個別的 TCP
677
+ 連線達到最佳效能一也就是可以具有更低的延時間以及更高的吞吐量。
678
+ </ p >
679
+ < p >
680
+ 根據你自己的應用程式,你可能也需要去調整伺服器上的其他 TCP
681
+ 設定,以便對高連線速率、記憶體使用量,或類似的規範進行最佳化處理。不過,這些配置設定都會因平台、應用程式,和硬體而有所差異。因此,你至少要去參考一下平台說明文件。
682
+ </ p >
683
+ < blockquote >
684
+ < p >
685
+ 對於 Linux 使用者來說,ss
686
+ 是一個威力強大的工具,因為它可以用來檢視開啟通訊埠連線的各種統計資訊。從命令列當中,執行
687
+ ss --options --extended --memory--processes
688
+ --info,即可檢視目前節點以及它們各自的連線設定。
689
+ </ p >
690
+ < p > 基本用法</ p >
691
+ < pre > < code class ="language-bash ">
692
+ ss -tulnp # 列出所有開啟的 TCP/UDP 連線和對應的程序
693
+ ss -s # 顯示 socket 統計資訊
694
+ ss -4 -t # 只顯示 IPv4 的 TCP 連線
695
+ ss -t state ESTABLISHED # 只顯示已建立的 TCP 連線
696
+ ss -o state TIME-WAIT # 只顯示 TIME-WAIT 狀態的連線,並附帶時間資訊
697
+ </ code > </ pre >
698
+ < p >
699
+ ss 仍然是 現代 Linux 系統上的主流工具,並沒有過時,反而比 netstat 更快、更強大。如果你的
700
+ Linux 系統還在使用 netstat,建議轉換到 ss!
701
+ </ p >
702
+ </ blockquote >
703
+
704
+ < h3 > 調整應用程式行為</ h3 >
705
+ < p > TCP 效能的調校作業可讓伺服器與客戶端,針對個別連線達到最佳吞吐量和延遲時間。</ p >
706
+ < p > 然而,應用程式對於每一個新的,或既定的 TCP 連線的使用方式,會有相當大的影響。</ p >
707
+ < ul >
708
+ < li > 不會有封包提早被發送出去;每次只發送少量資料。</ li >
709
+ < li > 我們或許無法讓傳輸的速度變得更快,但我們可以更密集地發送資料。</ li >
710
+ < li > TCP 連線的重複使用機制,對效能的提升有很大的幫助。</ li >
711
+ </ ul >
712
+ < p >
713
+ 排除非必要的資料傳輸作業,顯然是最棒的最佳化方式一比如說,藉由套用相對應的壓縮演算法,來刪除不必要的資源,或確保資料是以最少量的形式被傳送出去。接著,透過類似使用
714
+ CDN
715
+ 的方式,來把伺服器分散到世界各地,而讓資料在地理位置上能更貼近客戶端。如此將有助於降低網路往返延遲時間,進而大幅提昇
716
+ TCP 效能。最後,盡可能地重複使用現有的 TCP
717
+ 連線,以便讓緩步啟動和其他擁塞機制所造成的成本降到最低程度。
718
+ </ p >
719
+ < h3 > 效能查核清單</ h3 >
720
+ < p >
721
+ 不管應用類型為何,對 TCP
722
+ 效能進行最佳化,將可以為每個連結到你的伺服器的新連線帶來不小的好處。建議你可以把以下這份清單,加入到自己的日常工作事項裡頭:
723
+ </ p >
724
+ < ul >
725
+ < li > 將伺服器核心升級到最新版本(Linux:3.2+)。</ li >
726
+ < li > 確定 cwnd 大小確實被設定為 10。</ li >
727
+ < li > 關閉在網路閒置之後的緩步啟動功能。</ li >
728
+ < li > 確定視窗縮放機制是處於被開啟的狀態。</ li >
729
+ < li > 剔除多餘的資料傳輸作業。</ li >
730
+ < li > 對於要被傳輸的資料進行壓縮處理。</ li >
731
+ < li > 把伺服器擺放到更貼近客戶端的位置,以便降低往返傳輸時間。</ li >
732
+ < li > 盡可能重複使用既定的 TCP 連線。</ li >
733
+ </ ul >
633
734
</ article >
634
735
</ main >
635
736
</ body >
0 commit comments