1. 程式人生 > >一切都要慢慢來!

一切都要慢慢來!

延遲與頻寬

網站越快,使用者黏性越高;
網站越快,使用者忠誠度越高;
網站越快,使用者轉化率越高。

延遲與頻寬

決定網路通訊的兩個方面:延遲與頻寬。

  • 延遲: 分組從資訊源傳送到目的地所需的時間。
  • 頻寬:邏輯或物理通訊路徑最大的吞吐量。

目標: 低延遲,高頻寬

延遲

延遲是訊息分組從起點到終點經歷的時間。

影響延遲的因素:

  • 傳播延遲
    訊息從傳送端到接收端需要的時間,與訊號傳播距離和速度有關。
  • 傳輸延遲
    把訊息中的所有位元轉移到鏈路中需要的時間,與訊息長度和鏈路速率有關。
  • 處理延遲
    處理分組首部、檢查位錯誤及確定分組目標所需的時間。
  • 排隊延遲
    到來的分組排隊等待處理的時間。

以上延遲的時間總和,就是客戶端到伺服器的總延遲時間。

CDN

CDN(Content Delivery Network,內容分發網路)主要就是把內容部署到全球各地,讓使用者從最近的伺服器載入內容,大幅降低傳播分組的時間。

使用traceroute測量延遲

traceroute是一個簡單的網路診斷工具,可以列出分組經過的路由節點,以及他在IP網路中的每一跳延遲。在windows系統中可以使用tracert來測試。

tranceroute使用

當ICMP協議被禁用的時候,可以採用 lft, paketto, hping, superping.d , NetPerf, IPerf

TCP

TCP協議

傳輸控制協議,即Transmission Control Protocol,縮寫為TCP,是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,由IETF的RFC 793定義。TCP協議位於IP協議之上,應用層之下的傳輸層。

TCP連線包括了三種狀態: 連線建立資料傳送連線終止。作業系統將TCP連線抽象為套接字的程式設計介面給程式使用,並且要經歷一系列的狀態改變。

建立通路

所有的TCP連線要通過三次握手,客戶端與伺服器在交換應用資料之前,必須就起始分組序列號,以及其他的一些連線相關的細節達成一致。序列號由兩端隨機生成。

TCP三次握手

  • SYN
    客戶端選擇一個隨機序列號X,併發送一個SYN分組,其中可能包括其他TCP標識和選項。
  • SYN ACK
    伺服器給X加1,並選擇自己的一個隨機序列號Y,追加自己的標誌和選項,然後返回響應。
  • ACK
    客戶端給X和Y加1併發送握手期間的最後一個ACK分組。

三次握手完成後,客戶端與伺服器就可以通訊了。客戶端在傳送ACK分組後就可以立即傳送資料,伺服器則必須等待接收到ACK分組後才能夠傳送資料。

三次握手帶來的延遲使得每次建立一個新TCP連線都要付出巨大代價,所以這裡是提升TCP應用效能的關鍵。

TCP Fast Open 是減少新建TCP連線帶來效能損失的一種機制。通過握手開始時的 SYN 包中的 TFO cookie(一個 TCP 選用項)來驗證一個之前連線過的客戶端。如果驗證成功,它可以在三次握手最終的 ACK 包收到之前就開始傳送資料,這樣便跳過了一個繞路的行為,更在傳輸開始時就降低了延遲。

擁塞預防及控制

  1. 流量控制
    流量控制是一種預防傳送端過多向接收端傳送資料的機制。為了實現流量控制,TCP連線的每一方都要通告自己的接收視窗(rwnd),其中包含能夠儲存資料的緩衝區空間大小資訊。

    流量控制

    第一次建立連線時,傳送端和接收端都會使用視窗預設設定來發送rwnd。在瀏覽器網頁時,需要從伺服器向瀏覽器下載資料,所以此時客戶端的視窗成為瓶頸。而在上傳圖片等資料時,伺服器的接收視窗成為了瓶頸。

    在傳輸過程中,其中一端跟不上資料傳輸,此時它可以向傳送端通告一個較小的視窗。假設視窗為0,則意味著必須有應用層先清空緩衝區,才能夠接受剩餘資料。

    每個ACK分組都會攜帶相應的最新的rwnd值,以便於兩端動態調整資料流速,使之適應傳送端和接收端的容量和處理能力。

    在Linux作業系統中,可以通過以下命令檢查TCP視窗縮放機制。

    檢視TCP視窗縮放機制

  2. 擁塞控制

    傳送端、接收端在連線建立之初,無法預測雙方的網路頻寬,因此需要一個估算機制,然後還需要根據網路中不斷變化的條件動態改變速度。

    1988年,Van Jacobson和Michael J. Karels撰文描述瞭解決這種問題的方法:慢啟動、擁塞預防、快速重發和快速恢復。

    • 擁塞預防
      TCP調節效能依賴於丟包反饋機制。擁塞預防演算法把丟包作為網路擁塞的標誌,即路徑中某個連線或者路由器已經擁堵,以至於必須採取刪包策略。因此,需要調整視窗大小,以避免更多的包丟失,保證網路暢通。重置擁塞視窗後,擁塞預防機制按照自己的演算法來增大視窗以及儘量避免丟包。
    • 慢啟動
      新的TCP連結最大資料量取決於RWND和CWND的最小值。慢啟動導致了客戶端與伺服器之間經過幾百毫秒才能夠達到接近最大速度的問題,對於大型流式下載服務影響不顯著,但對於大多數的HTTP連線,特別是一些短暫、突發的連線,常常會出現還沒達到最大視窗請求就被終止的情況,很多Web效能受到伺服器與客戶端之間往返時間的制約。慢啟動限制了可用的吞吐量,對於小檔案傳輸十分不利。
  3. 頻寬延遲積

    頻寬延遲積(Bandwidth-delay product),資料鏈路的容量與其端到端延遲的乘積。這個結果就是任意時刻處於在途未確認狀態的最大資料量。

    TCP時延頻寬積

    傳送端和接收端指甲的在途未確認的最大資料量,取決於擁塞視窗和接收視窗的最小值。接收視窗會隨著每次的ACK一起傳送,擁塞視窗則由傳送端根據擁塞控制和預防演算法動態調整。當接收或傳送的資料超過了未確認的最大資料量,都必須停下來等待另一方的ACK來確認某些分組才能夠繼續。等待的時間取決於往返時間。

    為了獲得最大的吞吐量,應該讓視窗足夠大,以保證任何一段能在ACK返回前持續傳送資料。只有傳輸不間斷,才能夠保證最大的吞吐量。

    • 流量控制視窗和擁塞控制視窗多大才合適呢?假設cwnd和rwnd的最小值為16KB,往返時間為100ms:

      計算1

      不論接受或傳送的實際頻寬,TCP連線的資料傳輸率都不會超過1.31Mbit/s。

    • 如果往返時間不變,傳送端的頻寬為10Mbit/s,接收端為100Mbit/s+,且兩端之間沒有網路擁塞。那麼視窗應該是多大呢?

      計算2

      視窗至少要122.1KB才能夠充分利用10Mbit/s頻寬。但在RFC 1323中,TCP接受視窗最大隻有64KB。所以,儘管視窗大小會自動調節,但也仍舊是TCP效能限制因素。

    BDP是往返時間和目標傳輸速度的函式,因此往返時間不僅是高傳輸延遲中的瓶頸,也是LAN中的瓶頸。

  4. 隊首阻塞

    每個TCP分組都會帶著唯一的序列號被髮出,而所有分組必須按照傳輸順序傳送到接收端。如果中途有一個分組沒能到到接收端,而後續分組必須儲存在接收端的TCP緩衝區裡,等待丟失的分組重發併到達接收端。這些情況都發生在TCP層,應用程式對TCP重發和緩衝區排隊的分組一無所知,必須等待分組全部到達才能夠訪問。在此之前,應用程式只能通過套接字讀資料時感覺延遲交付。這種效應成為TCP的隊首阻塞。

    隊首阻塞造成的延遲可以讓程式不必關心分組重排和重組的事情,從而使得我們的程式碼更加簡潔。但是,分組到達時間存在無法預知的延遲變化。這個時間變化通常被稱為抖動。對延遲或者抖動要求高或者無需按序交付資料、能夠自行處理分組丟失的應用程式可以選用UDP。

    丟包是TCP達到最佳效能的關鍵,被刪除的包是一種反饋機制,能夠讓接收端和傳送端各自調整速度,以免網路擁堵,同時保持延遲最短(緩衝區爆滿問題)。

針對TCP優化意見

優化目標: 最大吞吐量 最小延遲

TCP是一個自適應、對所有網路節點一視同仁的、最大限制利用底層的網路協議。

優化TCP的最佳路徑就是調整它感知當前網路狀況的方式,根據它之上或之下的抽象層型別和需求來改變他的行為

TCP的核心原理和影響是不變的:

  • TCP三次握手增加了整整一次的往返時間;
  • TCP慢啟動被應用到每一次的新連線;
  • TCP流量及擁塞控制會影響所有連線的吞吐量。
  • TCP的吞吐量由當前擁塞視窗大小確定。

現代高速網路中的TCP連線的資料傳輸速度受到接收端和傳送端的往返時間的限制。此外,延遲依舊受限於光速,而且已經限定在其最大值的一個很小的常數因子之內。所以,大多數情況下,TCP的瓶頸都是延遲,而非頻寬。

伺服器配置調優

  • 增大TCP的初始擁塞視窗
    加大擁塞視窗能夠讓TCP在第一次往返中就可以傳輸較多的資料,而隨後的速度提升明顯。對於突發性的短暫連線,這是一個很重要的優化的點。
  • 慢啟動重啟
    在連線空閒時禁用慢啟動可以改善瞬時傳送資料的長TCP連線的效能。
  • 視窗縮放(RFC 1323)
    啟用視窗縮放可以增大最大接收視窗的大小,可以讓高延遲的連線達到更好的吞吐量。
  • TCP快速開啟
    在某些條件下,允許在第一個SYN分組中傳送應用程式資料。不過需要傳送端和客戶端同時支援TFO(TCP快速開啟)

在Linux系統中,可以使用ss檢視當前開啟的套接字的各種統計資訊。

ss --options --extended --memory --processes --info

可以檢視到當前的通訊節點以及他們相應的連線設定。

應用程式行為調優

  • 消除不必要的資料傳輸,如不必要的資源下載後者通過壓縮演算法將傳送的資料量降到最低;
  • 實現資料的短距離傳輸,如採用CDN技術來減少網路往返的延遲,從而顯著提升TCP的效能;
  • 儘可能重用TCP連線,把慢啟動和其他擁塞控制機制的影響降低到最小。

效能檢查清單

  • 把伺服器核心升級到最新版(Linux 3.2+)
  • 確保cwnd大小為10
  • 禁用空閒後的慢啟動
  • 確保啟動視窗的縮放
  • 減少傳輸的冗餘資料
  • 壓縮要傳輸的資料
  • 把伺服器放到離使用者最近的地方減少往返時間
  • 盡最大可能重用已經建立的TCP連線

來源

  1. 《Web效能權威指南》
  2. 《圖解TCP/IP》

相關推薦

一切慢慢來

延遲與頻寬 網站越快,使用者黏性越高; 網站越快,使用者忠誠度越高; 網站越快,使用者轉化率越高。 決定網路通訊的兩個方面:延遲與頻寬。 延遲: 分組從資訊源傳送到目的地所需的時間。 頻寬:邏輯或物理通訊路徑最大的吞吐量。 目標: 低延遲,高

1024,程式設計師節快樂科技改變生活,沒有程式設計師一切是浮雲

1024,程式設計師節快樂!請對身邊的程式設計師們好一點! 有了程式設計師,讓溝通更加便捷! QQ,微信,釘釘為代表! 有了程式設計師,生活更方便!點評,美團! 有了程式設計師,讓你消費更便利!京東,淘寶,天貓! 生活的方方面面都已經離不開程式設計師了,很難想象沒有程

Netflix OSS、Spring Cloud還是Kubernetes?

Netflix OSS是由Netflix公司主持開發的一套程式碼框架和庫,目的是解決上了規模之後的分散式系統可能出現的一些有趣問題。對於當今時代的Java開發者們來說,Netflix OSS簡直就是在雲端開發微服務的代名詞。服務發現、負載均衡、容錯等對於可擴充套件的分散式系

媽媽寫給熱戀中的女兒的信建議女孩

致我的女兒:     現在很愛他嗎?如果是,就愛吧,不要逃避,但也不要沉迷!     熱戀中的你把他看的很重嗎?想過以後和他能在一起嗎?孩子,不是媽媽打擊你,理智一點,大學裡的戀愛又有多少最終能在一起的呢?,現在的男生很現實的,到該讓他為你做犧牲的時候,他只會和你說對不起。兩年以後,或工作,或深造。總之多是各

公眾號做APP了

國內 原因 gpo 我們 習慣 消息 提升 娛樂 流量 2018新年伊始,微信方面就提出了爆炸性消息,即將推出公眾號APP,贊賞功能重新開通。目前,公眾號APP上線時間和主要功能還未對外透露,但這卻引發了內容從業者的密切關註。業內人士認為,微信即將開發公眾號APP這一重要決

Python真的無所不能連黑客技術用它你知道用哪些技術嗎

獲取 ctypes env 應用 轉儲 apt 當前 發行版 社區 網絡愛好者總是要掌握編程語言的,這裏推薦:python。下面,一文了解黑客們會用到哪些Python技術! 進群:548377875 即可獲取數十套PDF哦! 安裝依賴包 很多時候讀者們會

放寬心,堅持住,一切是最好的安排

    早 上起來,她發現家裡停電了。於是沒辦法用熱水洗漱,用電吹風吹頭髮,不能熱牛奶,烤麵包,只好草草打理一下就出門。   剛走進電梯,鄰居家養的小狗一下子衝進來撲住,上週剛買的米白長裙上頓時出現兩隻黑黑的爪印兒。   開車被警察

2018時代,為什麼鼓勵大家學Python,特別是程式設計師行業

回首以前,讓我們知道且更加了解Python這門程式語言是在2017年,很多人都說是人工智慧將要爆發導致Python熱度上升,Python是最適合程式設計人工智慧的語言。 2018時代,為什麼要鼓勵大家都要學Python,特別是程式設計師行業! 那們我們受限來看下Python它的優勢在哪

有個程式設計師男友是什麼感覺?女網友:連約個會處理BUG

程式設計師給人的印象就是很忙,加班加點的忙,那作為程式設計師的女朋友,又是怎樣一種體驗呢?有一名女網友就在網路上吐槽起來,稱自己的男朋友是個程式設計師,本來約好了見面,按時到了十五分鐘後,男朋友卻告訴我在處理BUG,讓我等一會兒,好傢伙,結果我現在在寒風中等了半個多小時還沒有回覆。這名女網友

WeCode政策解讀:小學生學Python程式設計被納入應試教育體系

  程式設計是網際網路、人工智慧等高新技術的基礎和核心,而當下,正是計算機程式設計普及的風口浪尖,誰能搶先一步抓住這個風口,就會在未來的計算機時代佔有主動地位。現在程式設計教育正在逐漸普及,學習程式設計對孩子的成長有著重要意義。 一、不會程式設計就是文盲 “程式設計促進你的思維

耶魯女孩:改變,從背單詞開始(劉暢:我知道耶魯會錄取我的。學習,經歷死記硬背)

一名濟南中學生與耶魯大學的距離有多遠?山東省實驗中學劉暢用一顆善於思考的心給出了答案。 劉暢是省實驗中學學生會主席、省學聯副主席、高三(15)班班長,2009年暑假,劉暢自行報名參加了聯合國青年大會。就在不久前,這名19歲女生被耶魯大學、斯坦福大學等10所美國高校錄取,耶魯和斯坦福同時為她提

學了指標沒學動態記憶體一切白搭C語言基礎教程之記憶體管理

本文將講解 C 中的動態記憶體管理。C 語言為記憶體的分配和管理提供了幾個函式。這些函式可以在<stdlib.h>標頭檔案中找到。 在記憶體中動態地分配 num 個長度為 size 的連續空間,並將每一個位元組都初始化為 0。所以它的結果是分配了 n

WhatMariaDB、Postgre投入阿里雲的懷抱?

在每年的雲棲大會上,都會有一些重磅訊息的公佈,去年的雲棲大會,“達摩院”刷了屏,而在今年的2018雲棲大會上,“平頭哥”又搶盡了風頭,但是在阿里雲資料庫領域,最令老孫感到意外又在情理之中的重磅訊息,就是MariaDB和Postgre與阿里雲的重磅合作了。 MariaDB的情

以前的程式設計師和現在的程式設計師對比圖,看完後去學程式設計

時代在變化,我們在變化, 程式設計師也不例外, 有人最近做了個調查, 發現現在的程式設計師和以前的程式設計師, 還是變化蠻大的…… 以前的程式設計師:天天加不完的班,哪個部分出問題了立馬去改。 現在的程式設計師:年輕有為,參與公司各種大型會議,經常出入各種高

【Python(Windows)】numpy matploylib 及相關庫的安裝教程(附資源,賊良心好嘛CSDN上各種庫下載氪金的客官滿意的話關注一下點個贊)

我自己的經驗,搞這個只有兩步:一、下載安裝包;二、安裝安裝包。 各軟體及庫的下載連結附在後面,自取不謝。 除了python是.exe檔案,直接很簡單的安裝軟體一般流程之外,其他的都需要一點點操作。 安裝安裝包(.whl)檔案過程: 開啟Cmd的命令視窗(Win+

#女生為什麼嫁給程式設計師,看看程式設計師薪資你就知道了

很多女生都喜歡嫁給程式設計師,聽她們說,程式設計師工資高,人好。程式設計師這個行業的薪資高我想大家都是聽說過的,但是大家一直都不知道一個明確的數,作為程式設計師,他們在百度,阿里巴巴,騰訊的工資是怎麼樣的呢?到底有多高?據媒體報道,總結了BAT程式設計師工資的統

這些網際網路大佬竟然是程式設計師出身,夢想還是有的

經常被網友問學計算機做程式猿有沒前途,其實我個人看來,不管你是哪個行業,如果能做到更堅持、更極致

年底了,但我就是忍不住想跳槽

         年底機會不多,但仍有求職者想要為自己謀個好出路。前程無憂調查顯示,超五成網友仍會在年底尋找工作機會。到底是什麼原因觸發了你的跳槽按鈕呢?      &nb

智慧社群APP、智慧社群小程式,你想在這裡

現階段隨著我國智慧手機普及,手機功能的不斷整合與強化,手機成為了我們日常工作與生活中使用頻率最高的產品之一。除了時下熱門的移動支付外,手機開門也成為當下流行的趨勢。 隨著人工智慧、物聯網、大資料技術的成熟與發展,智慧社群建設也如火如荼,當下智慧社群APP、智慧社群小程式被年輕人的追崇,趣

現在相親面試了,這些面試題還不趕快碼住

後臺有朋友提到 想要面試阿里 今天整理了這幾年 朋友面試,自己面試 各種面試的面試題 阿里京東美團 一次齊活了 沒有什麼技術 都是題目 想要了解答案的話 請聽下下下下下下集分解 一、阿里巴巴面試 1、開發中Java用了比