調整Linux的網絡棧(Buffer Size)來提高網絡性能

『Write by NIX CRAFT 』
本文章來自於http://www.cyberciti.biz/faq/linux-tcp-tuning linux

注:如需轉載,請註明來源,謝謝!緩存

本文基於CENTOS 、DEBIAN/UBUNTU 編寫 。服務器

我有兩臺位於不一樣數據中心的服務器,都用來處理不少並行的大文件傳輸。可是處理大文件,網絡性能很是差。而且涉及到一個大文件,會致使性能降級。我怎樣經過調整Linux下面的 TCP 來解決這個問題?網絡

默認,Linux的stack是沒有爲廣域網之間的大文件高速傳輸而配置的,這樣作是爲了節約內存資源。爲了使鏈接的系統服務之間能有更加高速的網絡處理更多的網絡包,你能夠很容易的經過增長網絡 buffer size 來調整 Linux 網絡 stack 。app

默認的 Linux buffer size 的最大值是很是小的,tcp 的內存是基於系統的內存自動計算的,你能經過鍵入如下命令找到實際的值:socket

$ cat /proc/sys/net/ipv4/tcp_mem

默認的和最大的接收數據包內存大小:tcp

$ 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 的選項:spa

$ cat /proc/sys/net/core/optmem_max

調整值

爲全部的協議隊列設置操做系統層面的最大的發送 buffer size (wmem) 和 接收 buffer size (rmem)爲 12 MB。換句話說,設置內存數量,分配給每個爲了傳送文件而打開或者是建立的 tcp socket 。操作系統

警告 警告!在大多數的 Linux 中 rmem_maxwmem_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

推薦閱讀:

備註:

注:如翻譯有誤的地方,歡迎指正,而且歡迎針對文章裏面的內容探討

相關文章
相關標籤/搜索