調整Linux的網路棧(Buffer Size)來提升網路效能
本文基於CENTOS 、DEBIAN/UBUNTU 編寫 。
我有兩臺位於不同資料中心的伺服器,都用來處理很多並行的大檔案傳輸。但是處理大檔案,網路效能非常差。並且涉及到一個大檔案,會導致效能降級。我怎樣通過調整Linux下面的 TCP 來解決這個問題?
預設,Linux的stack是沒有為廣域網之間的大檔案高速傳輸而配置的,這樣做是為了節約記憶體資源。為了使連線的系統服務之間能有更加高速的網路處理更多的網路包,你可以很容易的通過增加網路 buffer size 來調整 Linux 網路 stack 。
預設的 Linux buffer size 的最大值是非常小的,tcp 的記憶體是基於系統的記憶體自動計算的,你能通過鍵入以下命令找到實際的值:
$ cat /proc/sys/net/ipv4/tcp_mem
預設的和最大的接收資料包記憶體大小:
$ cat /proc/sys/net/core/rmem_default
$ cat /proc/sys/net/core/rmem_max
預設的和最大的傳送資料包記憶體的大小:
$ cat /proc/sys/net/core/wmem_default
$ cat /proc/sys/net/core/wmem_max
最大的記憶體 buffers 的選項:
$ cat /proc/sys/net/core/optmem_max
調整值
為所有的協議佇列設定作業系統層面的最大的傳送 buffer size (wmem) 和 接收 buffer size (rmem)為 12 MB。換句話說,設定記憶體數量,分配給每一個為了傳送檔案而開啟或者是建立的 tcp socket 。
警告!在大多數的 Linux 中
rmem_max
和wmem_max
被分配的值為 128 k,在一個低延遲的網路環境中,或者是 apps 比如 DNS、Web Server,這或許是足夠的。儘管如此,如果延遲太大,預設的值可能就太小了,所以請記錄以下在你的伺服器上用來提高記憶體使用方法的設定。
# echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf
# echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf
你還需要設定 minimum size, initial size, and maximum size in bytes:
# echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf
# echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf
開啟 window scaling ,這是一個用來擴充套件傳輸視窗的選項:
# echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf
確保定義在 RFC1323 中的 timestamps
開啟:
# echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf
確保 select acknowledgments:
# echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf
這個 “select acknowledgments” 不知道該如何翻譯,翻譯為“選擇確認?”
當連線關閉的時候,TCP 預設快取了很多連線指標在 route cache 中,以至於在不久的將來,連線建立的時候,可以用這些值來設定初始化條件。通常,這提升了整體的效能,但是,有時候會引起效能下降, 如果設定的話,TCP 在關閉的時候不快取這些指標。
# echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf
當 interface 接收到的資料包數量比核心處理速度的快的時候, 設定 input 佇列最大的 packets 數量值。
# echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf
現在過載這些改變,使其生效:
# sysctl -p
使用 tcpdump 命令檢視 通過 eth0 資料包流量的變化:
# tcpdump -ni eth0
相關推薦
調整Linux的網路棧(Buffer Size)來提升網路效能
本文基於CENTOS 、DEBIAN/UBUNTU 編寫 。 我有兩臺位於不同資料中心的伺服器,都用來處理很多並行的大檔案傳輸。但是處理大檔案,網路效能非常差。並且涉及到一個大檔案,會導致效能降級。我怎樣通過調整Linux下面的 TCP 來解決這個問題? 預設,Li
網路基本功(十五):細說網路效能監測與例項(上)
介紹 網路路徑效能檢測主要包括三方面的內容:頻寬測量能夠獲知網路的硬體特性,如網路的最大容量,吞吐量測量能夠獲得網路實際可提供的最大容量,資料流測量能夠了解真實佔用的網路容量。 本文介紹在評估網路效能是否合理時,需要收集的資料及收集方式。涉及工具包括:ping,
學習Linux-4.12核心網路協議棧(1.6)——協議棧的初始化(inet_init實現過程)
這篇文章主要分析inet_init()函式的實現過程: 1796 static int __init inet_init(void) 1797 { 1798 struct inet_protosw *q; 1799 struct list_head *r;
學習Linux-4.12核心網路協議棧(1.7)——網路裝置的初始化(struct net_device)
在linux的網路裝置裡,其中一個最關鍵的結構體應該要算net_device了,它由對應的網路裝置驅動進行建立和初始化,服務於核心網路子系統。 1. struct net_device 註釋分析 struct net_device這個結構體比較大,在瞭解它之前,我們先看一下
學習Linux-4.12核心網路協議棧(2.1)——介面層加快傳輸速率的特性
前面花了好多篇幅,終於將網路協議棧的初始化相關的內容介紹完了,也就是說完成前面的那些步驟以後,網路協議棧具備了資料包的收發功能。在網路介面層,它只負責資料包的接收與傳送,而不關注資料包在網路層的型別是什麼,所以傳輸速率的快慢往往與介面層的處理有著密切的關係,下面我們來了解一下在提供傳輸速率上面,現在的核心都
學習Linux-4.12核心網路協議棧(2.2)——介面層資料包的接收(上半部)
前面寫了這麼多,終於可以開始分析資料報的傳輸過程了,那我們就愉快的開始吧! 我們知道,一箇中斷處理函式主要分兩個部分,上半部和下半部,這篇文章主要介紹上半部分。 當一個數據包到達的時候,網絡卡驅動會完成接收並且觸發中斷,我們就從這個中斷處理函式開始: 當一箇中斷產生併發送
學習Linux-4.12核心網路協議棧(1.5)——協議棧的初始化(inet_init主要資料結構)
前面瞭解到網路初始化申請了兩塊skb快取記憶體和建立了一個/proc/net/protocols檔案,現在開始重頭戲,網路協議棧的初始化。這篇文章主要介紹網路棧中使用到的主要資料結構。 網路協議棧的核心實現和理論上的分層有些不一樣,在程式碼裡面的分層如下圖: 開始前,
學習Linux-4.12核心網路協議棧(1.4)——協議棧的初始化(proto_init)
這篇文章主要分析proto_init過程,它完成協議相關proc檔案的建立 3241 static __net_initdata struct pernet_operations proto_net_ops = { 3242 .init = proto_init
學習Linux-4.12核心網路協議棧(3.1)——網路層的收包處理
現在我們將進入傳輸層的分析: 在前面我們知道,資料包到達介面層的時候,它會根據ptype_base來查詢包的型別,並根據包的型別交給不同的網路層函式處理,比如ip_recv,icmp_recv等,現在我們就來看看網路層是怎麼處理不同型別的包的: 1. IP私有資訊控制塊
學習Linux-4.12核心網路協議棧(1.8)——網路裝置驅動模組的載入
1.瞭解PCI匯流排 說到網路裝置驅動,就不得不說PCI匯流排,但是這個話題可深可淺,而且網上的資料也是一大堆(比如),但是對於我們來說,目前並不需要掌握很深,下面是網上找的兩張最基本的PCI工作結構圖,雖然PCI總線上可以掛接不同種類的裝置,但我們這裡只要瞭解網路裝置就夠
解決Linux下網路程式設計(sendto send )出現 SIGPIPE 訊號導致程式異常終止的問題
引言 最近在Linux下網路程式設計時,出現SIGPIPE 訊號導致程式異常終止,本文記錄下解決的方法以及相應的知識。 SIGPIPE 訊號資料 什麼時候出現此訊號,APUE中有關此訊號的解釋如下: Linux man手冊有關此訊號的解釋: man 7 signal SI
Linux學習之網路程式設計(UDP程式設計)
言之者無罪,聞之者足以戒。 - “詩序” 前幾篇文章說的都是TCP通訊的問題,這篇文章說一下UDP通訊的相關內容: 下面來看一下基於UDP的獲取時間的客戶伺服器的程式框圖: (1)、建立一個基於IPv4(AF_INET)的資料報套接字(SOCK_DGRAM) (2)、ssize
Linux學習之網路程式設計(TCP程式設計)
言之者無罪,聞之者足以戒。 - “詩序” 1,TCP是什麼? TCP傳輸控制協議 向用戶程序提供可靠的全雙工位元組流(位元組流:給每一個位元組編序) 2,UDP是什麼? UDP使用者資料報協議 是一種無連線的協議 3,獲取時間服務的客戶端 (1),建立一個的的I
【Linux】---vmware虛擬網路配置(NAT模式)及不能ping通主機和百度
nat模式配置 nat模式配置,虛擬機器可以訪問百度 首先本機閘道器不能喝VMNET8一個閘道器 本機的IP及閘道器 VMnet8的設定 虛擬機器編輯器設定,需要和VMnet8在同一個閘道器下 虛擬機器的設定 此
linux基礎篇(二十):Redhat7系統中的高階網路配置
Bond 一、簡介 鏈路聚合主動備份網絡卡,當一個網絡卡介面故障時,另一個會接替他的工作,不中斷。bond是將多塊網絡卡虛擬連結成一塊網絡卡的技術,通過bond技術讓多塊網絡卡看起來是一個單獨的乙太網介面裝置並具有相同的ip地址。bond預設情況下支援兩塊網絡卡
小白學Linux——實踐3(修改啟動級別、配置網路、配置JDK)
安裝完CentOS 7 後必做的七件事 1、修改啟動級別 在虛擬機器新安裝了個CentOS7,圖形介面啟動太慢,想調整一下按照以前的經驗改執行級別,輸入: (1)vi /etc/inittab 然後發現跟之前不一樣了,在inittab設定不再生效: multi-
linux-網路管理(常用命令)
網路檢視 ifconfig : 檢視與臨時配置網路 ifdown 網絡卡裝置名 : 關閉網絡卡 ifup 網絡卡裝置名 : 啟用網絡卡 netstat 網路狀態查詢 -t 列出TCP協議埠 -u 列出UDP協議埠 -n 不適用域名與服務名,而是用
Linux 系統應用程式設計——網路程式設計(高階篇)
一、網路超時檢測 在網路通訊過程中,經常會出現不可預知的各種情況。例如網路線路突發故障、通訊一方異常結束等。一旦出現上述情況,很可能長時間都不會收到資料,而且無法判斷是沒有資料還是資料無法到達。如果使用的是TCP協議,可以檢測出來;但如果使用UDP協議的話,
Linux 系統安裝(5分鐘)
定義 install 啟動系統 輸入 let 客戶 nim ima 位置 安裝版本:CentOS 6.5 minimal 虛擬機工具:VMware 虛擬機配置:1核2線程 2G內存 50G硬盤 步驟: 一、虛擬機配置 1、打開VMware,創建新的虛擬機,選擇典型安裝;
Linux - 工作管理(job control),jobs,fg,bg,kill
new 沒有 yellow 字節 back 至少 roc root 都是 什麽是工作管理? 『進行工作管理的行為中, 事實上每一個工作都是眼下 bash 的子程序,亦即彼此之間是有相關性的。 我們無法以 job control 的方式由 tty1