天天看點

linux日常維護(iostat,free,ps,netstat,tcp三次握手,tcpdump)

監控io性能

iostat在安裝sysstat時就已經安裝,和sar屬于同一個包

[root@abc ~]# iostat -x

Linux 3.10.0-514.el7.x86_64 (abc.com) 2017年11月27日 _x86_64_(1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.25    0.00    0.35    0.36    0.00   99.04

Device:rrqm/s   wrqm/s  r/s  w/s   rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util

sda  0.00   0.06   2.36   1.30   51.77   5.41    31.22     0.03   7.07  5.25  0.39    2.27    0.83

sdb  0.00   0.00   0.14   0.00   0.86   0.00    12.55     0.00    0.53  0.53  0.00   0.39   0.01

scd0 0.00   0.00  0.01    0.00   0.02   0.00     8.00     0.00    1.00  1.00  0.00   1.00   0.00

dm-0 0.00  0.00    0.03   0.00   0.21   0.00    15.20     0.00    0.58   0.58  0.00  0.52  0.00

sar -b也可以檢視磁盤資訊,但是iostat -x可以看到很重要的一個%util

iotop:是一個用來監視磁盤I/O使用狀況的top類工具。iotop具有與top相似的UI,其中包括PID、使用者、I/O、程序等相關資訊。Linux下的IO統計工具如iostat,nmon等大多數是隻能統計到per裝置的讀寫情況,如果你想知道每個程序是如何使用IO的就比較麻煩,使用iotop指令可以很友善的檢視。

Total DISK READ :0.00 B/s                                磁盤讀速度

 Total DISK WRITE :       0.00 B/s                                   磁盤寫入速度

2.free 檢視記憶體的使用情況

[root@abc ~]# free

           total        used        free      shared    buff/cache     vailable

Mem:        1008392      112632      662172        6864      233588      733800

Swap:       2097148           0     2097148

[root@abc ~]# free -h              (加上-h 更清晰的顯示記憶體大小)

              total        used        free      shared  buff/cache   available

Mem:           984M        109M        646M        6.7M        228M        716M

Swap:          2.0G          0B        2.0G

total            記憶體總大小

used             已經使用的記憶體大小

free             剩餘記憶體大小

shared            目前已經廢棄不用

buff             緩沖記憶體數

cache            緩存記憶體數

available         free記憶體+buffer/cache剩餘部分, 真正的剩餘記憶體

公式:total=used+free+buff/cache(系統預留出來空間給cache和buff)

磁盤(010101)--> 記憶體(cache) --> cpu         從磁盤先把資料讀出來放到記憶體裡,記憶體在交給cpu

cpu(010101)--> 記憶體(buffer) --> 磁盤        cpu運算速度是很快的,寫入資料沒那麼快要在磁盤裡有一個緩沖空間

3.ps  (report a snapshot of the current processes)  彙報目前程序的快照

指令用于報告目前系統的程序狀态。可以搭配kill指令随時中斷、删除不必要的程式。ps指令是最基本同時也是非常強大的程序檢視指令,使用該指令可以确定有哪些程序正在運作和運作的狀态、程序是否結束、程序有沒有僵死、哪些程序占用了過多的資源等等,總之大部分資訊都是可以通過執行該指令得到的。

Ps 隻為您提供目前程序的快照。要即時檢視最活躍的程序,可使用 top。

Top 實時地提供程序資訊。它還擁有互動式的狀态,允許使用者輸入指令,如 n 後面跟有 5 或 10 等數字。其結果是訓示 top 顯示 5 或 10 個最活躍的程序。Top 持續運作,直到您按 "q" 退出 top 為止。 

[root@abc ~]# ps aux 

USER       PID  %CPU  %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

USER     使用程序的使用者名

PID     程序ID,kill指令加程序ID可以殺死一個程序。當系統被黑時,可以檢視惡意程序,并殺死它

%CPU     程序CPU占用率

%MEM     程序記憶體占用率

VSZ     程序所使用的虛拟記憶體

RSS     程序所使用的實際記憶體

TTY     與程序關聯的終端

STAT    程序的狀态

R 運作    Runnable (on run queue)            正在運作或在運作隊列中等待。

S 睡眠    Sleeping                休眠中, 受阻, 在等待某個條件的形成或接受到信号。

I 空閑    Idle

Z 僵死    Zombie(a defunct process)        程序已終止, 但程序描述符存在, 直到父程序調用wait4()系統調用後釋放。

D 不可中斷    Uninterruptible sleep (ususally IO)    收到信号不喚醒和不可運作, 程序必須等待直到有中斷發生。

T 終止    Terminate                程序收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号後停止運作運作。

P 等待交換頁

W 無駐留頁    has no resident pages        沒有足夠的記憶體分頁可配置設定。

X 死掉的程序

< 高優先級程序                    高優先序的程序

N 低優先    級程序                    低優先序的程序

L 記憶體鎖頁    Lock                有記憶體分頁配置設定并縮在記憶體内

s 程序的上司者(在它之下有子程序);

l 多程序的(使用 CLONE_THREAD, 類似 NPTL pthreads)

+ 位于背景的程序組  

START    程序啟動時間和日期

TIME     程序使用的總cpu時間

COMMAND  正在執行的指令行指令

4.netstat   檢視網絡狀态     tcp/ip通信狀态。

netstat -lnp 檢視監聽端口   隻要是與外部通信,都會有一個端口

Socket是程序間通信的一種機制。前提是同一台伺服器。netstat也可以檢視系統檔案裡有哪些socket檔案在監聽

etstat -an   檢視所有連接配接   

一個小技巧:

[root@abc ~]# netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'

ESTABLISHED  2               有多少客戶段連接配接占用着你的伺服器。這個是要着重關注的,幾千來說是正常的

TIME_WAIT                     連接配接你的伺服器但是沒有占用你的伺服器資源

tcp三次握手,四次揮手:

(A)URG:緊急指針(urgent pointer)有效。

(B)ACK:确認序号有效。

(C)PSH:接收方應該盡快将這個封包交給應用層。

(D)RST:重置連接配接。

(E)SYN:發起一個新連接配接。

(F)FIN:釋放一個連接配接。

三次握手:(建立TCP連接配接)

host1會将标志位SYN=1,并随機産生一個seq=j的資料包發給host2,并進入SYN_SENT狀态,等待host2确認

host2收到資料包後,由SYN=1确定是host1請求連接配接,host2把标志位SYN=1和ACK都設定為1,ack=j+1,并随機産生一個seq的值,并将資料包發送給host1以确認連接配接請求,進入SYN_RCVD狀态。

host1收到确定後,檢查ACK是否為1.ack是否為j+1,,如果正确将标志位ACK設定為1.ack=K+1,并将資料包發給host2,host2檢查cck是否為K+1,ACK是否為1.如果正确則完成建立,host1與host2進入ESTABLISHED狀态,完成三次握手,開始傳輸資料

linux日常維護(iostat,free,ps,netstat,tcp三次握手,tcpdump)

SYN攻擊:

     在三次握手過程中,host2發送SYN-ACK之後,收到host1的ACK之前的TCP連接配接稱為半連接配接(half-open connect),此時host2處于SYN_RCVD狀态,當收到ACK後,host2轉入ESTABLISHED狀态。SYN攻擊就是host1在短時間内僞造大量不存在的IP位址,并向host2不斷地發送SYN包,host2回複确認包,并等待host1的确認,由于源位址是不存在的,是以,host2需要不斷重發直至逾時,這些僞造的SYN包将産時間占用未連接配接隊列,導緻正常的SYN請求因為隊列滿而被丢棄,進而引起網絡堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接配接狀态且源IP位址是随機的,則可以斷定遭到SYN攻擊了,使用如下指令可以讓之現行:

 #netstat -nap | grep SYN_RECV

四次揮手:(終止TPC連接配接) 在socket程式設計中,這一過程由用戶端或服務端任一方執行close來觸發

由于TCP連接配接時全雙工的,是以,每個方向都必須要單獨進行關閉,這一原則是當一方完成資料發送任務後,發送一個FIN來終止這一方向的連接配接,收到一個FIN隻是意味着這一方向上沒有資料流動了,即不會再收到資料了,但是在這個TCP連接配接上仍然能夠發送資料,直到這一方向也發送了FIN。首先進行關閉的一方将執行主動關閉,而另一方則執行被動關閉

1.host1發送一個FIN,用來關閉host1到host2的資料傳送,host1進入FIN_WAIA_1狀态

2.host2收到FIN後,發送一個ACK給host1,确認序号為收到序号+1,(與SYN相同,一個FIN占用一個序号),host2進入CLOSE_WAIT狀态

3.host2發送一個FIN,用來關閉host2到host1的資料傳送,host2進入LAST_ACK狀态。

4.host1收到FIN後,進入TIME_WAIT狀态,接着發從一個ACK給host2,确認序号為收到序号+1.host2進入CLOSED狀态,完成四次揮手。

linux日常維護(iostat,free,ps,netstat,tcp三次握手,tcpdump)

實際還會同時發起主動關閉的情況。

linux日常維護(iostat,free,ps,netstat,tcp三次握手,tcpdump)

為什麼建立連接配接是三次握手,而關閉連接配接卻是四次揮手呢?

   這是因為服務端在LISTEN狀态下,收到建立連接配接請求的SYN封包後,把ACK和SYN放在一個封包裡發送給用戶端。而關閉連接配接時,當收到對方的FIN封包時,僅僅表示對方不再發送資料了但是還能接收資料,己方也未必全部資料都發送給對方了,是以己方可以立即close,也可以發送一些資料給對方後,再發送FIN封包給對方來表示同意現在關閉連接配接,是以,己方ACK和FIN一般都會分開發送。

5.tcpdunmp抓包

linux下抓包

yum install -y tcpdump

tcpdunmp (dump the traffic on a network)

根據使用者的定義對網絡上的資料包進行截獲的包分析工具。 tcpdump可以将網絡中傳送的資料包的“頭”完全截獲下來提供分析。它支援針對網絡層、協定、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來幫助你去掉無用的資訊。

tcpdump -nn -i +網卡名字

(第一個n表示ip用數字形式顯示出來)

port        指定端口号 

not port     不是指定端口的端口号

-c         指定抓多少包

-w         抓到的包存到指定檔案(不能cat,是從網卡裡捕獲的資料包資訊。隻能用tcpdump -r 檢視)

大部分是tcp服務,當你看到udp要注意,說不定是DDos攻擊,叫做udp flood(udp洪水攻擊),隻能接入防攻擊的服務或者工具。

[root@abc ~]# yum install -y wireshark   安裝一個tshark的工具

[root@abc ~]#  tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri" 

這條指令無法實驗,類似于外部的通路日志,因為虛拟機沒有外部連結,這條指令可以檢視用戶端通路我的ip,通路網站的名字已經通路的檔案/連結名字

本文轉自 小新銳 51CTO部落格,原文連結:http://blog.51cto.com/13407306/2045804,如需轉載請自行聯系原作者

繼續閱讀