應用程式通過訪問磁碟來讀取資料,而磁碟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模型
阻塞與非阻塞 阻塞就是卡在那兒什麼也不做,雙方之間也沒有資訊溝通。非阻塞就是即使對方不能馬上完成請求,雙方之間也有資訊的溝通。同步與非同步 同步就是一件事件只由乙個過程處理完成,不論阻塞與非阻塞,最後完成這個事情的都是同乙個過程 非同步就是一件事由兩個過程完成,前面乙個過程通知,後面乙個過程接受返回...