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