網絡性能評估
在Linux中常見的網絡性能指標如下
l 帶寬
表示鏈路的最大傳輸速率,單位是b/s 比特/秒,在位服務器選網卡時,帶寬就是最核心的參考指標,常用的帶寬有1000M,10G,40G,100G等
網絡帶寬測試,測試的不是帶寬,而是網絡吞吐量,Linux服務器的網絡吞吐量一般會比帶寬小,而對交換機等專門的網絡設備來說,吞吐量一般會接近帶寬
l 吞吐量
表示沒有丟包時最大的數據傳輸速率,單位通常是b/s比特/秒,或B/s字節/秒,吞吐量受帶寬的限制,吞吐量/帶寬也是該網絡鏈路的使用率
l 延遲
表示從網絡請求發出后,一直到收到遠端響應所需要的時間延遲,這個指標在不同場景中有不同含義,它可以表示建立連接需要的時間(TCP握手延時),或者一個數據包往返所需時間RTT
l PPS
Packet Per Second,表示已網絡包為單位的傳輸速率,PPS通常用來評估網絡的轉發能力,基於Linux服務器的轉發,很容易受到網絡包大小的影響(交換機通常不會受太大影響,交換機可以線性轉發)
PPS,通常用在需要大量轉發的場景中,而對TCP或者Web服務器來說,更多會用並發連接數和每秒請求數(QPS Query per Second)等指標,他們更能反映實際應用程序的性能
網絡測試基准
Linux網絡基於TCP/IP協議棧,不同協議層的行為不同,在測試之前,根據應用程序基於的協議層進行針對性網絡性能評估,比如:
基於HTTP或HTTPS的Web應用程序,屬於應用層,需要我們測試HTTP/HTTPS的性能
大多數游戲服務器,為了支持更大的同時在線人數,通常會基於TCP或UDP,與客戶端交互,這時就需要測試TCP/UDP的性能
針對把Linux作為一個軟交換機或路由器來用的場景,需要關注網絡包的處理能力PPS,重點關注網絡層的轉發性能
低層協議是其上的各層網絡協議的基礎,低層協議的性能,也就決定了高層網絡性能
轉發性能
網絡接口層和網絡層,主要負責網絡包的封裝,尋址,路由,轉發和接收,在這兩個網絡協議層中,每秒可以處理的網絡包數PPS,就是最終的性能指標,特別是64B小包的處理能力,值得我們特別關注?????
PPS包轉發率
傳輸過程中,幀之間有間距(12個字節),每個幀前面還有前導(7個字節)、幀首界定符(1個字節)。
幀理論轉發率= BitRate/8 / (幀前導+幀間距+幀首界定符+報文長度)
最大吞吐量(最大幀大小:1538B,最大以太幀大小:1518B)
最大的以太網吞吐量是通過單個傳輸節點實現的,當以太網幀處於最大大小時,該傳輸節點不會發生任何沖突。
以太網的幀開銷是18字節,目的MAC(6)+源MAC(6)+Type(2)+CRC(4)。局域網規定IP最大傳輸單元1500字節,實際上加上以太網幀的18字節,再加上8B就是1518字節
最大幀率(最小幀大小:84B,最小以太幀:64B,最小以太網幀有效載荷:46B)
以太網是無連接的,不可靠的服務,采用盡力傳輸的機制。IEEE標准,一個碰撞域內,最遠的兩台機器之間的round-trip time 要小於512bit time.(來回時間小於512位時,所謂位時就是傳輸一個比特需要的時間)。這也是我們常說的一個碰撞域直徑。512個位時,也就是64字節的傳輸時間,如果以太網數據包大於或等於64個字節,就能保證碰撞信號到達A的時候,數據包還沒有傳完。這就是為什么以太網要最小64個字節,同樣,在正常的情況下,碰撞信號應該出現在64個字節之內,這是正常的以太網碰撞,如果碰撞信號出現在64個字節之后,叫 late collision。這是不正常的。
以太網鏈路的最大幀速率和吞吐量計算
框架部分 |
最小鏡框尺寸 |
最大畫面尺寸 |
幀間間隙(9.6毫秒) |
12字節 |
12字節 |
MAC前置碼(+ SFD) |
8字節 |
8字節 |
MAC目標地址 |
6個字節 |
6個字節 |
MAC源地址 |
6個字節 |
6個字節 |
MAC類型(或長度) |
2字節 |
2字節 |
有效載荷(網絡PDU) |
46個字節 |
1,500字節 |
校驗序列(CRC) |
4字節 |
4字節 |
總框物理尺寸 |
84字節 |
1,538字節 |
理論上限
百兆端口線速包轉發率=100Mbps/672=0.1488095Mpps,約等於0.14881Mpps,14萬pps
千兆端口線速包轉發率=1000Mbps/672=1.488095Mpps,約等於1.4881Mpps,148萬pps
萬兆端口線速包轉發率=10000Mbps/672=14.88095Mpps,約等於14.881Mpps,1488萬pps
arrival為每個數據包之間的時間間隔。
rte:runtime environment 即運行環境。
eal: environment abstraction layer 即抽象環境層。
測試方法
pktgen是linux內核自帶的發包工具,省卻了用戶態socket的參與,純粹在內核構造skb送netdev的txqueue上,可以達到極高pps。pktgen只有UDP協議,適合做吞吐量測試。
基線測試
在性能測試中首先要做的是建立基線(Baseline),這樣后續的調整才會有一個參考標准。值得注意的是,在測試基線的時候,一定要保證系統工作在正常的狀態下。
測試結果
測試結論
64B小包,千兆網卡可以達到帶寬,萬兆網卡遠遠達不到帶寬,前者受限於帶寬,后者受限於cpu包中斷處理
單個cpu ksoftirqd占用100%
結論分析
萬兆網卡包收發瓶頸:是cpu而不是網卡帶寬
1) 網絡數據包來了之后通過中斷模式進行通知,而cpu處理中斷的能力是一定的,如果網絡中有大量的小數據包,造成了網絡的擁堵,cpu處理不及時。
2) 操作系統的協議棧是單核處理,沒辦法利用現在操作系統的多核。
網絡數據包從網卡到內核空間,再到用戶空間,進行了多次數據拷貝,性能比較差。
Linux + x86網絡IO瓶頸
- 數據必須從內核態用戶態之間切換拷貝帶來大量CPU消耗,全局鎖競爭。
- 收發包都有系統調用的開銷。
- 內核工作在多核上,為可全局一致,即使采用Lock Free,也避免不了鎖總線、內存屏障帶來的性能損耗。
- 從網卡到業務進程,經過的路徑太長,有些其實未必要的,例如netfilter框架,這些都帶來一定的消耗,而且容易Cache Miss。一次Cache Miss,不管是TLB、數據Cache、指令Cache發生Miss,回內存讀取大約65納秒,NUMA體系下跨Node通訊大約40納秒
網卡收包流程
多隊列網卡硬件實現
2.6.21后網卡驅動實現
2.6.21開始支持多隊列特性,當網卡驅動加載時,通過獲取的網卡型號,得到網卡的硬件queue的數量,並結合CPU核的數量,最終通過Sum=Min(網卡queue,CPU core)得出所要激活的網卡queue數量(Sum),並申請Sum個中斷號,分配給激活的各個queue。
如圖1,當某個queue收到報文時,觸發相應的中斷,收到中斷的核,將該任務加入到協議棧負責收包的該核的NET_RX_SOFTIRQ隊列中(NET_RX_SOFTIRQ在每個核上都有一個實例),在NET_RX_SOFTIRQ中,調用NAPI的收包接口,將報文收到CPU中如圖2的有多個netdev_queue的net_device數據結構中。
這樣,CPU的各個核可以並發的收包,就不會應為一個核不能滿足需求,導致網絡IO性能下降。
2.6.21之后內核協議棧
2.6.21之后net_device
中斷綁定
cat /proc/interrupts|grep enp134s0f1-TxRx
當CPU可以平行收包時,就會出現不同的核收取了同一個queue的報文,這就會產生報文亂序的問題,解決方法是將一個queue的中斷綁定到唯一的一個核上去,從而避免了亂序問題。同時如果網絡流量大的時候,可以將軟中斷均勻的分散到各個核上,避免CPU成為瓶頸。
多隊列網卡識別
# lspci -vvv -s 86:00.1
Ethernet controller的條目內容,如果有MSI-X && Enable+ && TabSize > 1,則該網卡是多隊列網卡
Message Signaled Interrupts(MSI)是PCI規范的一個實現,可以突破CPU 256條interrupt的限制,使每個設備具有多個中斷線變成可能,多隊列網卡驅動給每個queue申請了MSI。MSI-X是MSI數組,Enable+指使能,TabSize是數組大小。
驅動程序隊列(又名環形緩沖區)
驅動程序隊列位於IP堆棧和網絡接口控制器(NIC)之間。此隊列通常實現為先進先出(FIFO) 環形緩沖區 –只需將其視為固定大小的緩沖區即可。驅動程序隊列不包含數據包數據。相反,它由指向其他數據結構的描述符組成,這些數據結構稱為套接字內核緩沖區(SKB) ,用於保存分組數據並在整個內核中使用。
網卡好文
https://www.cnblogs.com/yangykaifa/p/7398833.html
https://cloud.tencent.com/developer/article/1030881
https://www.coverfire.com/articles/queueing-in-the-linux-network-stack/
https://tech.meituan.com/2018/03/16/redis-high-concurrency-optimization.html
網卡收包從整體上是網線中的高低電平轉換到網卡FIFO存儲再拷貝到系統主內存(DDR3)的過程,其中涉及到網卡控制器,CPU,DMA,驅動程序,在OSI模型中屬於物理層和鏈路層,如下圖所示。
關鍵數據結構
在內核中網絡數據流涉及到的代碼比較復雜,見圖1(原圖在附件中),其中有3個數據結構在網卡收包的流程中是最主要的角色,它們是:sk_buff,softnet_data,net_device。
sk_buff
sk_buff結構是Linux網絡模塊中最重要的數據結構之一。sk_buff可以在不同的網絡協議層之間傳遞,為了適配不同的協議,里面的大多數成員都是指針,還有一些union,其中data指針和len會在不同的協議層中發生改變,在收包流程中,即數據向上層傳遞時,下層的首部就不再需要了。圖2即演示了數據包發送時指針和len的變化情況。(linux源碼不同的版本有些差別,下面的截圖來自linux 2.6.20)。
softnet_data
softnet_data 結構內的字段就是 NIC 和網絡層之間處理隊列,這個結構是全局的,每個cpu一個,它從 NIC中斷和 POLL 方法之間傳遞數據信息。圖3說明了softnet_data中的變量的作用。
net_device
net_device中poll方法即在NAPI回調的收包函數。
net_device代表的是一種網絡設備,既可以是物理網卡,也可以是虛擬網卡。在sk_buff中有一個net_device * dev變量,這個變量會隨着sk_buff的流向而改變。在網絡設備驅動初始化時,會分配接收sk_buff緩存隊列,這個dev指針會指向收到數據包的網絡設備。當原始網絡設備接收到報文后,會根據某種算法選擇某個合適的虛擬網絡設備,並將dev指針修改為指向這個虛擬設備的net_device結構。
3.網絡收包原理
本節主要引用網絡上的文章,在關鍵的地方加了一些備注,騰訊公司內部主要使用Intel 82576網卡和Intel igb驅動,和下面的網卡和驅動不一樣,實際上原理是一樣的,只是一些函數命名和處理的細節不一樣,並不影響理解。
網絡驅動收包大致有3種情況:
no NAPI:mac每收到一個以太網包,都會產生一個接收中斷給cpu,即完全靠中斷方式來收包
缺點是當網絡流量很大時,cpu大部分時間都耗在了處理mac的中斷。
netpoll:在網絡和I/O子系統尚不能完整可用時,模擬了來自指定設備的中斷,即輪詢收包。
缺點是實時性差
NAPI:采用中斷 + 輪詢的方式:mac收到一個包來后會產生接收中斷,但是馬上關閉。
直到收夠了netdev_max_backlog個包(默認300),或者收完mac上所有包后,才再打開接收中斷
通過sysctl來修改 net.core.netdev_max_backlog
或者通過proc修改 /proc/sys/net/core/netdev_max_backlog
softnet_data與接口層
和網絡層之間的關系
下面只寫內核配置成使用NAPI的情況,只寫TSEC驅動。內核版本 linux 2.6.24。
NAPI相關數據結構
解決方案
DPDK
PMD
PMD, Poll Mode Driver 即輪詢驅動模式 ,DPDK用這種輪詢的模式替換中斷模式
RSS
RSS(Receive Side Scaling)是一種能夠在多處理器系統下使接收報文在多個CPU之間高效分發的網卡驅動技術。
網卡對接收到的報文進行解析,獲取IP地址、協議和端口五元組信息,網卡通過配置的HASH函數根據五元組信息計算出HASH值,取HASH值的低幾位(這個具體網卡可能不同)作為RETA(redirection table)的索引,根據RETA中存儲的值分發到對應的CPU,運行在不同CPU的應用程序就從不同的接收隊列接收報文,這樣就達到了報文分發的效果。
當RSS功能開啟后,報文對應的rte_pktmbuf中就會存有RSS計算的hash值,可以通過pktmbuf.hash.rss來訪問。 這個值可以直接用在后續報文處理過程中而不需要重新計算hash值,如快速轉發,標識報文流等。
Hugepages大頁內存
操作系統中,內存分配是按照頁為單位分配的,頁面的大小一般為4kB,如果頁面大小固定內存越大,對應的頁項越多,通過多級內存訪問越慢,TLB方式訪問內存更快,
但是TLB存儲的頁項不多,所以需要減少頁面的個數,那么就通過增加頁面大小的辦法,增大內存頁大小到2MB或1GB等。
DPDK主要分為2M和1G兩種頁面,具體支持要靠CPU,可以從cpu的flags里面看出來,舉個例子:
如果flags里面有pse標識,標識支持2M的大內存頁面;
如果有pdge1gb 標識,說明支持1G的大內存頁。
cat /proc/meminfo|grep -i page
NUMA
NUMA(Non-Uniform Memory Architecture 非一致性內存架構)系統。
特點是每個處理器都有本地內存、訪問本地的內存塊,訪問其他處理器對應的內存需要通過總線,慢。
NUMA的幾個概念(Node,socket,core,thread)
socket就是主板上的CPU插槽; (物理cpu)
Core就是socket里獨立的一組程序執行的硬件單元,比如寄存器,計算單元等; (邏輯cpu)
Thread:就是超線程hyperthread的概念,邏輯的執行單元,獨立的執行上下文,但是共享core內的寄存器和計算單元。(超線程)
NUMA體系結構中多了Node的概念,這個概念其實是用來解決core的分組的問題,具體參見下圖來理解(圖中的OS CPU可以理解thread,那么core就沒有在圖中畫出),從圖中可以看出每個Socket里有兩個node,共有4個socket,每個socket 2個node,每個node中有8個thread,總共4(Socket)× 2(Node)× 8 (4core × 2 Thread) = 64個thread。
每個node有自己的內部CPU,總線和內存,同時還可以訪問其他node內的內存,NUMA的最大的優勢就是可以方便的增加CPU的數量,因為Node內有自己內部總線,所以增加CPU數量可以通過增加Node的數目來實現,如果單純的增加CPU的數量,會對總線造成很大的壓力,所以UMA結構不可能支持很多的核
由於每個node內部有自己的CPU總線和內存,所以如果一個虛擬機的vCPU跨不同的Node的話,就會導致一個node中的CPU去訪問另外一個node中的內存的情況,這就導致內存訪問延遲的增加。在有些特殊場景下,比如NFV環境中,對性能有比較高的要求,就非常需要同一個虛擬機的vCPU盡量被分配到同一個Node中的pCPU上,所以在OpenStack的Kilo版本中增加了基於NUMA感知的虛擬機調度的特性
查看機器的NUMA拓撲結構lscpu
VFIO
VFIO是一個可以安全的吧設備IO、中斷、DMA等暴露到用戶空間(usespace),從而在用戶空間完成設備驅動的框架。用戶空間直接訪問設備,虛擬設備的分配可以獲得更高的IO性能。
參考(https://blog.csdn.net/wentyoon/article/details/60144824)
重要模塊划分
dpdk 為 Intel 處理器架構下用戶空間高效的數據包處理提供了庫函數和驅動的支持,它不同於 Linux 系統以通用性設計為目的,而是專注於網絡應用中數據包的高性能處理。
也就是 dpdk 繞過了 Linux 內核協議棧對數據包的處理過程,在用戶空間實現了一套數據平面來進行數據包的收發與處理。在內核看來,dpdk 就是一個普通的用戶態進程,它的編譯、連接和加載方式和普通程序沒有什么兩樣。
dpdk 的突破
相對傳統的基於內核的網絡數據處理,dpdk 對從內核層到用戶層的網絡數據流程進行了重大突破,我們先看看傳統的數據流程和 dpdk 中的網絡流程有什么不同。
傳統 Linux 內核網絡數據流程:
Copy
硬件中斷--->取包分發至內核線程--->軟件中斷--->內核線程在協議棧中處理包--->處理完畢通知用戶層
用戶層收包-->網絡層--->邏輯層--->業務層
dpdk 網絡數據流程:
Copy
硬件中斷--->放棄中斷流程
用戶層通過設備映射取包--->進入用戶層協議棧--->邏輯層--->業務層
其他基礎
單個cpu ksoftirqd占用100%
ksoftirqd是一個cpu內核線程,當機器在軟中斷負載很重時運行。計算機通過IRQ (中斷請求)與連接到它的設備通信,當設備中斷時,操作系統會暫停它正在做的事情,並開始處理中斷。當高速網卡在短時間內接收大量數據包時,由於到達操作系統(因為他們到達的速度太快了)時無法處理IRQ,所以,操作系統將它們排隊,讓一個名為ksoftirqd的特殊內部進程在后台處理。這表明機器在中斷負載很重。
內核中實現的方案不會立即處理處理重新觸發的軟中斷。而作為改進,當大量軟中斷出現的時候,內核會喚醒一組內核線程來處理這些負載。這些線程在最低的優先級上運行(nice值是19),這能避免它們跟其他重要的任務搶奪資源。但它們最終肯定會被執行,所以這個折中方案能夠保證在軟中斷負擔很重的時候用戶程序不會因為得不到處理時間處於飢餓狀態。相應的,也能保證”過量“的軟中斷終究會得到處理。
每個處理器都有一個這樣的線程。所有線程的名字都叫做ksoftirq/n,區別在於n,它對應的是處理器的編號。在一個雙CPU的機器上就有兩個這樣的線程,分別叫做ksoftirqd/0和ksoftirqd/1。為了保證只要有空閑的處理器,它們就會處理軟中斷,所以給每個處理器都分配一個這樣的線程。一旦該線程被初始化,它就會執行類似下面這樣的死循環:
在<Softirq.c(kernel)>中
static int ksoftirqd(void * __bind_cpu)
只要有待處理的軟中斷(由softirq_pending()函數負責發現),ksoftirq就會調用do_softirq去處理它們。通過重復執行這樣的操作,重新觸發的軟中斷也會被執行。如果有必要,每次迭代后都會調用schedule()以便讓更重要的進程得到處理機會。當所有需要執行的操作都完成以后,該內核線程將自己設置為TASK_INTERRUPTIBLE狀態,喚起調度程序選擇其他可執行進程投入運行。
只要do_softirq()函數發現已經執行過的內核線程重新觸發了它自己,軟中斷內核線程就會被喚醒。
1、軟中斷
UN1X系統提供軟中斷機制作為進程通信的一種手段。軟中斷是通過發送規定的信號到指定進程,對方進程定時地查詢有無外來信號,若有則按約定進行處理,處理完畢,返回斷點繼續執行原來的指令。可見,軟中斷是對硬中斷的一種模擬。軟中斷存在較大的時延,不象硬中斷能獲得及時響應。例如,對方進程若處在阻塞隊列,那么只有等到該進程執行時才能查詢軟中斷信號。顯然,從軟中斷信號發出到對方響應,時間可能拖得很長。此外,軟中斷處理程序運行在用戶態,硬中斷處理程序則運行在核心態。
各種UNIX版本設置的軟中斷信號一般不超過32種,其中部分信號已規定了它們的意義,另一部分留給用戶自己定義。信號由鍵盤產生或由進程中的錯誤(例如不合理的存儲訪問)或由許多異步事件(例如時鍾或來自C-Shell的作業控制)產生。
1)主要數據結構
軟中斷通信涉及進程的proc和user結構,有關部分介紹如下:
(1)p_clktim
它是報警時鍾時間計數器,由系統調用alarm來設置它,時間一到就發送14號信號。
(2)p_sigign
它是忽略信號標記,共32位,每位對應一個信號。當進程需要忽略某些信號時,就把p_sigign中與這些信號對應的位置上1。
(3)p_sig
它是本進程接收信號的地方,共32位,正好對應32種不同的信號(因為信號只有27種,所以有5位未用)。第0位對應信號 1,第1位對應信號2,…,當本進程收到一個信號時,就在p_sig的對應位上置1。
(4)u_signal[NSIG]
它是一個有32個元素的一維數組,每個元素占32位,正好存放一個地址值。此地址為軟中斷處理程序的入口。當u_signal[i](i =1 , 2 , ... , 32)的值為非零偶數時,表明它是信號軟中斷處理程序入口地址,本進程按該處理程序來響應軟中斷;當u_signal[i]的值為0時,則終止進程本身;當u_signal[i]的值為非零奇數時,該軟中斷不起作用,本進程忽略它,不予處理。
2)信號發送
供用戶進程發送軟中斷信號的系統調用是kill(pid, sig),其中pid為對方進程的標識號,sig為信號名稱。如果pid為正整數,則把sig發給pid 號進程;如果pid 為0,則把sig發給同一進程組內的所有進程;如果pid 為-1,則把sig發送給自己或發送給除進程0和進程1之外的每個進程(用戶是超級用戶時)。具體發送工作由程序_psignal(&proc, sig)和_signal(p_pgrp, sig)完成。
_psignal(&proc, sig)中的參數&proc是對方進程的proc首址,sig為信號名。當對方進程未忽略sig時,就在對方進程的p_sig中相應的位上設置sig 。為盡快處理軟中斷信號,當對方進程處於睡眠態SSLEEP且它的優先數p_pri大於25時,則喚醒它,並把它排入就緒隊列中。
_signal(p_pgrp, sig)中的第1參數p_pgrp為同組進程的組標識號,sig為信號名。該程序把信號發給同組其他進程,其實現比較簡單:查找所有proc數組,凡其中proc結構中p_pgrp與第1參數相同者,就調用_psignal程序將sig發送給它。
3)信號接收與處理
UN1X系統V有一條系統調用signal(sig, func)用於軟中斷信號的接收與處理。正在執行的進程遇到時鍾中斷或核心態轉至用戶態或進入睡眠態之前或它退出低優先級睡眠之時,總要執行signal(sig, func)。
signal(sig, func)中的第1參數sig為信號名,第2參數func為對該信號的處理方式。當func為 1時,忽略該信號;當func為0 時,終止本進程;當func非奇數,非零的正整數時,按u_signal[sig]中的入口地址轉軟中斷處理程序。軟中斷處理程序必須預先設計好。
當進程處於核心態時,即使收到軟中斷信號也不予理睬,只有當它返回用戶態后,才處理收到的軟中斷信號。對於3號和12號軟中斷,則在調用_exit自我終止(因func=0)之前,還需要調用_core程序,將進程的數據段轉貯到文件core中,轉貯成功時置成功標記,該標記連同信號一起作為參數提供給_exit程序,由該程序負責返回給接受進程。
4)27種軟中斷信號
27種軟中斷信號的注釋部分即為它的功能說明
#define SIGHUP 1 /* hangup */
#define SIGINT 2 /* interrupt */
#define SIGQUIT 3 /* quit */
#define SIGILL 4 /* illegal instruction (not reset when caught ) */
#define SIGTRAP 5 /* trace trap (not reset when caught ) */
#define SIGIOT 6 /* IOT instruction */
#define SIGEMT 7 /* EMT instr uction */
#define SIGFPE 8 /* floating point exception */
#define SIGKILL 9 /* kill (cannot be caught or ignored) */
#define SIGBUS 10 /* bus error */
#define SIGSEGV 11 /* segmentation violation */
#define SIGSYS 12 /* bad argument to system call */
#define SIGPIPE 13 /* write on a pipe with no one to read it */
#define SIGALAM 14 /* alarm clock */
#define SIGTERM 15 /* software termination signal from kill */
#define SIGSTOP 17 /* sendoble stop signal not from tty */
#define SIGTSTP 18 /* stop signal from tty */
#define SIGCONT 19 /* continue a stopped process */
#define SIGCHLD 20 /* to parent on child stop or exit */
#define SIGTTIN 21 /* to readers pgrp upon background tty read */
#define SIGTTOOU 22 /* like TTIN for output it (tp→t-local &LTOSTOP) */
#define SIGTINT 23 /* to pgrp on every input character if LINTRUP */
#define SIGXCPU 24 /* exceeded CPU time limit */
#define SIGXFSZ 25 /* exceeded file size limit */
#define SIGSTAT 26 /* status update requsted */
#define SIGMOUS 27 /* mouse interrupt */
#define NSIG 32
上述信號中,中斷信號SIGNT(信號2)通常是從終端鍵盤上打入^c字符所產生的,該信號常用於停止一條未完成的命令。退出信號SIGQUIT通常由打入^\字符所產生,該信號還要使得有關的進程把它當前的存儲器映象寫入當前目錄下的稱之為core 的文件中, 以便於診斷程序使用。信號SIGSTOP和SIGCONT用於C-Shell的作業控制中停止和重新啟動某個進程;信號SIGILL是由非法指令所產生的,SIGSEGV是由訪問的存儲器超出了進程的合法虛擬存儲器空間所產生的。
在下列地方會執行軟中斷:
1. 從一個硬件中斷代碼中返回
2. 在ksoftirqd內核線程中
3. 在顯示檢查和執行待處理的軟中斷代碼中,如網絡子系統.
cat /proc/interrupts
我們測試的系統,總的來說可分為二類:
- IO Bound,這類系統會大量消耗內存和底層的存儲系統,它並不消耗過多的CPU和網絡資源(除非系統是網絡的)。IO bound系統消耗CPU資源用來接受IO請求,然后會進入休眠狀態。數據庫通常被認為是IO bound系統。
- CPU Bound,這類系統需要消耗大量的CPU資源。他們往往進行大量的數學計算。高吞吐量的Web server,Mail Server通常被認為是CPU Bound系統。
系統負載過重時往往會引起其它子系統的問題,比如:
->大量的讀入內存的IO請求(page-in IO)會用完內存隊列;
->大量的網絡流量會造成CPU的過載;
->CPU的高使用率可能正在處理空閑內存隊列;
->大量的磁盤讀寫會消耗CPU和IO資源。
pps不是網絡設備唯一重要的指標
對於路由,pps是最重要的參數之一,但是對於其他設備,例如防火牆,負載平衡,入侵防御系統,NAT轉換設備和其他有狀態系統,也必須考慮不同的指標。根據其性質,有狀態設備會在每個連接上創建和管理唯一信息。例如,新的TCP連接可以通過TCP SYN數據包的到達來識別,並且設備維護的狀態信息通常包括源IP地址,目標IP地址,源端口,目標端口和協議號(五元組)用於連接。一旦此狀態連接信息被緩存,設備就可以自由執行其設計所針對的功能(例如,防火牆,負載平衡等)。
在這種情況下,可以描述幾個不同的指標:
每秒連接數
每秒連接數(cps)是指設備可以為新連接建立狀態參數的速率。如前所述,有狀態設備必須在傳輸該設備的所有唯一IP流上創建和管理連接信息。通常,設備必須以不同於所有后續數據包的方式處理新連接的第一個數據包,以便設備可以為新連接建立狀態參數。因為此過程是專門的,所以它通常發生在設備的軟件過程中,這與常規的基於硬件的轉發過程相反。設備可以為新連接建立狀態的速率與諸如處理器(CPU)速度,內存速度,體系結構,TCP / IP堆棧效率等因素有關。就數據包處理性能而言,建立狀態參數時,設備可以處理數據包的速率通常是一旦建立狀態參數,同一設備就可以在硬件中轉發數據包的速率的一小部分。例如,列出了用於Cisco Catalyst 6500系列交換機和Cisco 7600系列路由器的Cisco應用控制引擎(ACE),每個模塊可提供16 Gb / s和6.5 Mp / s的吞吐量。思科ACE還被列為每秒支持325,000個新連接(c / s)。每個模塊的吞吐量為5 Mp / s。思科ACE還被列為每秒支持325,000個新連接(c / s)。每個模塊的吞吐量為5 Mp / s。思科ACE還被列為每秒支持325,000個新連接(c / s)。
最大並發連接
最大並發連接數(mcc)是指設備可以同時維持狀態的會話(連接)總數。此值主要與專用於此任務的內存量有關。但是,即使內存價格便宜,當c / s速率較低時,添加內存以支持更多的並發連接也沒有多大意義。例如,如果某個設備具有足夠的內存來處理一百萬個並發連接,但該設備的最大連接建立速率為10 c / s,則要完全利用所有此狀態將花費超過100,000秒(或28個小時)。因此,具有低c / s速率的設備通常也具有較低的mcc值。繼續以Cisco ACE為例,Cisco ACE支持四百萬個並發連接,這與其新的325的連接速率兼容,000 c / s。以最大c / s速率,可以在12秒內建立最大並發連接數。(其他信息,例如單個連接的壽命,在設計需要狀態的系統時非常重要。)
每秒交易
每秒事務數(t / s)是指每秒可以執行的特定類型的完整動作的數量。t / s度量不僅涉及單個數據包的處理,甚至還涉及新連接的建立。它指的是完成特定動作的整個周期。在數據庫設計中,t / s是一個常用指標,它表示每秒執行的數據庫事務數。在聯網中,某些設備使用此度量來描述某些復雜過程對數據包的應用,以構成完整的會話。例如,Cisco ACE XML網關通過處理XML消息和強制執行XML模式來幫助確保XML應用程序和Web服務的部署,被列為行業領先的性能,超過30,000 t / s。
這些度量中的每一個都可能與某種類型的網絡設備有關。但是,在適當時,這些指標對於正確評估網絡設備性能和正確設計可以支持所需服務的網絡體系結構至關重要。
例如,假設一個新的防火牆服務被設計為使用1Gbps以太網接口,並且為該服務設計的正常流量配置文件每秒用於5,000個合法客戶流量的新連接。如果這些標准是用於確定防火牆服務的大小和規模的唯一度量標准,則最終設計可能會得出結論,一種特定類型或大小的防火牆可以處理負載。但是,先前的數學示例表明,可以預期該設備可以處理高達1.4 Mp / s的入口流量(假設有小數據包)。考慮到所有這些流量都可能是新的連接嘗試,例如在閃存人群或分布式拒絕服務(DDoS)事件中,很明顯,最終設計應該選擇一個合適的設備,並且還要考慮該指標。或者,也可以將此度量轉換為用於定義此服務的其他設計選擇。可能考慮的選項可能包括增加已部署的防火牆服務的容量,或部署其他上游機制,例如速率限制或 Clean-Pipes 服務,以保護防火牆部署。盡管在某些情況下防火牆可能需要其自身的保護的說法似乎很奇怪,但在高帶寬環境中經常需要使用防火牆。實際上,必須評估所有有狀態設備的意外負載和狀況。
性能測試工具
mpstat
是 Multiprocessor Statistics,是實時系統監控工具。其報告與CPU的一些統計信息,這些信息存放在/proc/stat文件中。在多CPUs系統里,其不但能查看所有CPU的平均狀況信息,而且能夠查看特定CPU的信息。當沒有參數時,mpstat則顯示系統啟動以后所有信息的平均值。有interval時,第一行的信息自系統啟動以來的平均信息。從第二行開始,輸出為前一個interval時間段的平均信息。mpstat -P ALL 1
top 后1更清晰
vmstat
是Virtual Meomory Statistics(虛擬內存統計)的縮寫, 是實時系統監控工具。該命令通過使用knlist子程序和/dev/kmen偽設備驅動器訪問這些數據,輸出信息直接打印在屏幕。
sar
System Activity Reporter(系統活躍情況報告)的縮寫。顧名思義,sar工具將對系統當前的狀態進行采樣,然后通過計算數據和比例來表達系統的當前運行狀態。它的特點是可以連續對系統采樣,獲得大量的采樣數據;采樣數據和分析的結果都可以存入文件,所需的負載很小。sar的數據是一段時間保存的內容,因此可以察看過去的信息。 lastcomm可以現在系統最近被執行的命令。這些可以用在系統審計中。sar可以在*BSD和Linux中找到,它給用戶在系統審計中更多的選項來收集信息。
MEMORY
首先說說虛擬內存和物理內存:
虛擬內存就是采用硬盤來對物理內存進行擴展,將暫時不用的內存頁寫到硬盤上而騰出更多的物理內存讓有需要的進程來用。當這些內存頁需要用的時候在從硬盤讀回內存。這一切對於用戶來說是透明的。通常在Linux系統說,虛擬內存就是swap分區。在X86系統上虛擬內存被分為大小為4K的頁。
每一個進程啟動時都會向系統申請虛擬內存(VSZ),內核同意或者拒就請求。當程序真正用到內存時,系統就它映射到物理內存。RSS表示程序所占的物理內存的大小。用ps命令我們可以看到進程占用的VSZ和RSS。
iostat –x
網絡工具
網絡是所有子系統中最難監控的了。首先是由於網絡是抽象的,更重要的是許多影響網絡的因素並不在我們的控制范圍之內。這些因素包括,延遲、沖突、阻塞等等。
網絡方向的性能分析既包括主機測的網絡配置查看、監控,又包括網絡鏈路上的包轉發時延、吞吐量、帶寬等指標分析。包括但不限於以下分析工具:
ip:網絡接口統計信息
netsat:多種網絡棧和接口統計信息
ifstat:接口網絡流量監控工具
tcpdump:抓包工具
sar:統計信息歷史
pathchar:確定網絡路徑特征
dtrace:TCP/IP 棧跟蹤
iperf / netperf / netserver:網絡性能測試工具
perf 性能分析神器
ping
ping 發送 ICMP echo 數據包來探測網絡的連通性,除了能直觀地看出網絡的連通狀況外,還能獲得本次連接的往返時間(RTT 時間),丟包情況,以及訪問的域名所對應的 IP 地址(使用 DNS 域名解析)
ifconfig
ifconfig 命令被用於配置和顯示 Linux 內核中網絡接口的統計信息。通過這些統計信息,我們也能夠進行一定的網絡性能調優。性能調優時可以重點關注 MTU(最大傳輸單元) 和 txqueuelen(發送隊列長度),比如可以用下面的命令來對這兩個參數進行微調:
ifconfig eth0 txqueuelen 2000
ifconfig eth0 mtu 1500
ip
ip 命令用來顯示或設置 Linux 主機的網絡接口、路由、網絡設備、策略路由和隧道等信息,是 Linux 下功能強大的網絡配置工具,旨在替代 ifconfig 命令,如下顯示 IP 命令的強大之處,功能涵蓋到 ifconfig、netstat、route 三個命令。
https://linoxide.com/linux-command/use-ip-command-linux/
netstat
netstat 可以查看整個 Linux 系統關於網絡的情況,是一個集多鍾網絡工具於一身的組合工具。
常用的選項包括以下幾個:
默認:列出連接的套接字
-a:列出所有套接字的信息
-s:各種網絡協議棧統計信息
-i:網絡接口信息
-r:列出路由表
-l:僅列出有在 Listen 的服務狀態
-p:顯示 PID 和進程名稱
各參數組合使用實例如下:
netstat -at 列出所有 TCP 端口
netstat -au 列出所有 UDP 端口
netstat -lt 列出所有監聽 TCP 端口的 socket
netstat -lu 列出所有監聽 UDP 端口的 socket
netstat -lx 列出所有監聽 UNIX 端口的 socket
netstat -ap | grep ssh 找出程序運行的端口
netstat -an | grep ':80' 找出運行在指定端口的進程
1)netstat 默認顯示連接的套接字數據
整體上來看,輸出結果包括兩個部分:
Active Internet connections :有源 TCP 連接,其中 Recv-Q 和 Send-Q 指的是接收隊列和發送隊列,這些數字一般都是 0,如果不是,說明請求包和回包正在隊列中堆積。
Active UNIX domain sockets:有源 UNIX 域套接口,其中 proto 顯示連接使用的協議,RefCnt 表示連接到本套接口上的進程號,Types 是套接口的類型,State 是套接口當前的狀態,Path 是連接到套接口的進程使用的路徑名。
2)netstat -i 顯示網絡接口信息
接口信息包括網絡接口名稱(Iface)、MTU,以及一系列接收(RX-)和傳輸(TX-)的指標。其中 OK 表示傳輸成功的包,ERR 是錯誤包,DRP 是丟包,OVR 是超限包。
這些參數有助於我們對網絡收包情況進行分析,從而判斷瓶頸所在。
3)netstat -s 顯示所有網絡協議棧的信息
可以看到,這條命令能夠顯示每個協議詳細的信息,這有助於我們針對協議棧進行更細粒度的分析。
4)netstat -r 顯示路由表信息
這條命令能夠看到主機路由表的一個情況。當然查路由我們也可以用 ip route 和 route 命令,這個命令顯示的信息會更詳細一些。
ifstat#
ifstat 主要用來監測主機網口的網絡流量,常用的選項包括:
-a:監測主機所有網口
-i:指定要監測的網口
-t:在每行輸出信息前加上時間戳
-b:以 Kbit/s 顯示流量數據,而不是默認的 KB/s
-delay:采樣間隔(單位是 s),即每隔 delay 的時間輸出一次統計信息
-count:采樣次數,即共輸出 count 次統計信息
比如,通過以下命令統計主機所有網口某一段時間內的流量數據:
可以看出,分別統計了三個網口的流量數據,前面輸出的時間戳,有助於我們統計一段時間內各網口總的輸入、輸出流量。
除了網絡工具,cpu和內存也是網絡瓶頸可能的上限,也需要監控
監控CPU調度程序運行隊列
linux可以使用vmstat命令
vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫, 是實時系統監控工具。該命令通過使用knlist子程序和/dev/kmen偽設備驅動器訪問這些數據,輸出信息直接打印在屏幕。vmstat反饋的與CPU相關的信息包括:
(1)多少任務在運行
(2)CPU使用的情況
(3)CPU收到多少中斷
(4)發生多少上下文切換
監控鎖競爭
使用 sysstat包中的pidstat命令來監控
監控網絡I/O使用率
nicstat原本是Solaris平台下顯示網卡流量的工具,Tim Cook將它移植到linux平台