常見的磁碟I O和網路I O優化技巧

2022-02-01 23:33:27 字數 3653 閱讀 8413

應用程式通過訪問磁碟來讀取資料,而磁碟i/o 通常都是很耗時間的,所以一般我們來判斷i/o是否有瓶頸的時候,就需要一些引數指標來參考。

通常提公升i/o效能的方法有:

(磁碟數 * 每塊磁碟的iops)/(磁碟的吞吐量 + raid因子 * 磁碟讀寫的吞吐量)=iops

raid 策略 以及說明 

磁碟陣列           

說明 raid 0 

資料被平均寫到多個磁碟陣列中,寫和讀資料都是平行的,所以磁碟的iops可以提公升一倍

raid 1

raid 1 的主要作用是能夠提高資料的安全性,它將乙份資料分別複製到多個磁碟陣列中,並不能

提公升iops ,但是相同的資料有多個備份。通常用於對資料安全性較高的場合中。

raid 5 

這種設計方式是前兩種的折中方式,它將資訊平均寫到所有磁碟陣列總數減一的磁碟中,往另外

乙個磁碟寫入這份資料的奇偶檢驗資訊。如果其中有乙個磁碟損壞,就可以通過其他磁碟的資料和

這個資料的奇偶檢驗資訊來恢復這份資料。

raid 0+1

就如名字一樣,根據資料的備份情況進行分組,乙份資料同時寫到多個備份磁碟中,同時多個磁碟也會進行讀寫。

我們知道要建立乙個tcp連線,就必須要知道對方的ip 和乙個未被使用的埠號,由於32位作業系統的埠號通常是由兩個位元組表示,所以就只有2^65535個埠號。所以說,一台主機能夠建立的連線是有限的。還有 0~1024 埠是受保護的,像80,22,21 這些埠都不是能夠被隨意占用的。

在linux 中 我們通過檢視  /proc/sys/net/ipv4/ip_local_port_range 檔案來檢視當前能夠使用的埠範圍, 如果可分配的埠較少,在遇到大量的併發請求的時候就會成為瓶頸。由於埠有限導致大量的請求等待連線,這樣效能就會壓不上去。 另外 如果發現有大量的time_wait 的話,可以設定  /proc/sys/nettcp_fin_timeout 為更小的值來快速釋放請求。

網路引數 

說明   

echo "1024 65535">/proc/sys/net/ipv4/ip_local_port_rang

設定向外連線可用埠範圍        

echo 1 >/proc/sys/net/ipv4/tcp_tw_reuse

設定  time_wait  連線重用

echo 1 >/proc/sys/net/ipv4/tcp_tw_recycle

設定快速**  time_wait  連線

echo 180000 >/proc/sys/net/ipv4/tcp_max_tw_buckets

設定最大time_wait 連線長度

echo 0 > /proc/sys/net/ipv4/tcp_timestamps 

表示是否啟用以一種比超時重發更精確的方法來啟用對rtt的計算

echo 1>/proc/sys/net/ipv4/tcp_window_scaling 

設定tcp/ip會話的滑動視窗大小是否可變 

echo 20000 >/proc/sys/net/ipv4/tcp_max_syn_backlog

設定最大等待處於客戶端還沒有應答回來的連線數

echo 10000 >/proc/sys/net/core/somaxconn

設定每乙個處於監聽狀態的埠監聽佇列的長度

echo 10000 > /proc/sys/net/core/netdev_max_backlog

設定最大等待cpu處理的包的數目

echo 2000000>/proc/sys/fs/file-max

設定最大開啟檔案數

echo 15>/proc/sys/net/ipv4/tcp_fin_timeout

設定fin-wait-2狀態等待**時間

echo 16777216 >/proc/sys/net/core/rmem_max

設定最大的系統套接字資料接收緩衝大小

echo 262144 > /proc/sys/net/core/rmem_default 

設定預設的系統套接字資料接收緩衝大小

echo 16777216 >/proc/sys/net/core/wmen_max 

設定最大的系統套接字資料傳送緩衝大小

echo 262144 >/proc/sys/net/core/wmen_default

設定預設的系統套接字資料傳送緩衝大小

echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmem

設定最大的tcp 資料傳送緩衝大小,三個值分別是 最小,預設,和最大值

echo "4096 65535 16777216"/proc/sys/net/ipv4/tcp_wmem

設定預設的tcp資料接收緩衝大小,三個值分別是 最小,預設,和最大值

調優引數

以上的設定都是臨時的,系統重啟之後會自動丟失, linux 還提供其他檢視當前tcp 統計的資訊

網路i/o 優化的基本處理原則。

同步:非同步:

將使用者請求放入訊息佇列,並反饋給使用者,系統遷移程式已經啟動,你可以關閉瀏覽器了。然後程式再慢慢地去寫入資料庫去。這就是非同步。但是使用者沒有卡死的感覺,會告訴你,你的請求系統已經響應了。你可以關閉介面了。 非同步 是一種不可靠的任務序列。

阻塞與非阻塞主要是從cpu的消耗上來說的,阻塞就是cpu停下來等待乙個慢的操作完成以後,cpu 才接著完成其他工作。 非阻塞就是在這個慢的操作執行時,cpu去做其他地方工作,等這個操作完成時cpu再接著完成後續操作。  雖然從表面上看,非阻塞的方式可以明顯的提高cpu的利用率,但是也帶來另一種結果,就是系統的執行緒切換增加。增加的cpu 使用時間能不能補償系統的切換成本就需要好好的評估。 

組合的方式有四種,分別是同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞,四種方式都對i/o效能有影響。

組合方式

效能分析

同步阻塞

最常用的一種用法,使用也是最簡單的,但是i/o效能一般很差,cpu 大部分處於空閒狀態

同步非阻塞

提公升i/o效能的常用手段,就是將i/o阻塞改成非阻塞的方式,尤其是在網路i/o是長連線同時傳輸資料也不是很多

的情況下,提公升效能非常有效。

這種方式通常能提公升i/o效能,但是會增加cpu 消耗,要考慮增加的i/o效能能不能補償cpu 的消耗,也就是系統

的瓶頸是在cpu上還是i/o上。

非同步阻塞

這種方式在分布式資料庫上經常用到,比如,在乙個分布式資料庫中寫一條記錄,通常會有乙份是同步阻塞的的記錄

,還有2~3份備份記錄會寫到其他機器上,這些備份記錄通常都採用非同步阻塞的方式寫i/o 

非同步阻塞對網路 i/o 能夠提公升效率,尤其是像上面說的,能夠同時寫多份相同的資料的情況。

非同步非阻塞

這種組合方式用起來比較複雜,只有在一些非常複雜的分布式情況下使用,集群之間的訊息同步機制一般都採用這種

i/o 組合形式,

它適合同時要傳很多份相同的資料到集群中不同的機器。同時資料的傳輸量雖然不大,卻非常繁瑣的情況,這種網路

i/o用這種方式效能能達到最高。

四種組合方式以及效能分析

雖然非同步和非阻塞能夠提公升i/o 的效能,但是也會帶來一些額外的效能成本,比如:會增加執行緒數量從而增加cpu的消耗,同時也會導致程式設計複雜度的上公升。如果設計得不好,反而會導致效能下降。所以在實際應用時要根據應用場景綜合評估。

nginx 的磁碟IO優化

磁碟io優化的幾個方面 優化讀取 sendfile 零拷貝 記憶體盤 ssd盤 減少寫入 aio增大error log級別的日誌 關閉access log 壓縮access log 是否啟用proxy buffering syslog替代本地io 執行緒池 thread pool 適用於大檔案的直接...

mysql 磁碟讀寫的I O優化

在 mysql 5.1.x 版本中曾使用引數innodb file io threads,指負責處理資料頁上讀寫io請求的後台執行緒數量。在 mysql 5.5.x 中拆成2個引數 innodb read io threads,innodb write io threads。該引數值之和 2 cpu...

網路I O模型 5種常見的網路I O模型

阻塞與非阻塞 阻塞就是卡在那兒什麼也不做,雙方之間也沒有資訊溝通。非阻塞就是即使對方不能馬上完成請求,雙方之間也有資訊的溝通。同步與非同步 同步就是一件事件只由乙個過程處理完成,不論阻塞與非阻塞,最後完成這個事情的都是同乙個過程 非同步就是一件事由兩個過程完成,前面乙個過程通知,後面乙個過程接受返回...