1、基礎命令和工具
grep 搜索字符
grep命令用于在文件中執行關鍵詞搜索,并顯示匹配的效果。
//在指定文件查找,查找 login 關鍵字
grep login ImUser.cpp
//多個文件中搜索
grep login ImUser.cpp MsgConn.cpp
//在多個文件搜索的時候,可以使用通配符。在以 cpp 結尾的文件中,搜索包含 login 的行
grep login *.cpp
//遞歸搜索所有文件,搜索msg_server目錄下所有文件,打印出login行
grep login -r msg_server/
//反向查找,查找文件中,不包含login的行
grep -v login ImUser.cpp
//找出文件中包含 login 的行,并打印出行號
grep -n login ImUser.cpp
//找出文件中包含 login 的行,打印出行號,并顯示前后 3 行
grep -C 3 -n login ImUser.cpp
//找出文件中包含 login 的行,打印出行號,并顯示前后 3 行,并忽略大小寫
grep -C 3 -i -n login ImUser.cpp
find 查找文件
通過文件名查找文件的所在位置,文件名查找支持模糊匹配。
find [指定查找目錄] [查找規則] [查找完后執行的 action]
常用的操作:
find . -name FILE_NAME
// 忽略文件名稱大小寫
find . -iname FILE_NAME
//查找/etc/下名稱中帶有 passwd 的文件,查找一層
find /etc -maxdepth 1 -name passwd
//查找/mnt 文件大小近似 20k 的文件
find /mnt -size 20K
//查找/mnt 文件大小大于 20k 的文件
find /mnt -size +20K
//查找/mnt 文件大小小于 20k 的文件
find /mnt -size -20K
//查找/etc/下名稱中帶有*.conf 的文件,且只查找第二層
find /etc -maxdepth 2 -mindepth 2 -name *.conf
//按 type 查找/mnt 中目錄
find /mnt -type d
//按 type 查找/mnt 中文件
find /mnt -type f
//查找/mnt 中十分鐘左右修改的
find /mnt -cmin 10
//查找/mnt 中十分鐘以上修改的
find /mnt -cmin +10
//查找/mnt 中十分鐘以內修改的
find /mnt -cmin -10
//查找/mnt 中十天左右修改
find /mnt -ctime 10
//查找/mnt 中十天以上修改
find /mnt -ctime +10
//查找/mnt 中十天以內修改
find /mnt -ctime -10
wc 命令
wc 命令用于計算字數。可以計算文件的 Byte 數、字數、或是列數,若不指定文件名稱、或是所給予的文件名為"-",則 wc 指令會從標準輸入設備讀取數據。
語法
wc [-clw][--help][--version][文件...]
參數:
-c 或--bytes 或--chars 只顯示 Bytes 數。
-l 或--lines 只顯示行數。
-w 或--words 只顯示字數。
--help 在線幫助。
--version 顯示版本信息。
wc testfile # testfile 文件的統計信息
7 92 607 testfile # testfile 文件的行數為 7、單詞數 92、字節數 607
uptime 機器啟動時間+負載
查看機器的啟動時間、登錄用戶、平均負載等情況,通常用于在線上應急或者技術攻關中,確定操作系統的重啟時間。
系統負載如下圖:
系統的平均負載是指在特定的時間間隔內隊列中運行的平均進程數。如果一個進程滿足條件,就會位于運行隊列中。
(1)沒有在等待 I/O 操作的結果。
(2)沒有主動進入等待狀態,也就是沒有調用’wait'相關的系統 API
(3)沒有被停止(例如:等待終止)。
如果每個 CPU 內核的當前活動進程數不大于 3 的話,那么系統的性能還算可以支持。如果每個 CPU 內核的任務數大于 5,那么這臺機器的性能有嚴重問題。如果你的 linux 主機是 1 個雙核 CPU 的話,當 Load Average 為 6 的時候說明機器已經被充分使用了。
負載說明
以下是針對單核情況說明:
load<1:沒有等待。
load==1:系統已無額外的資源跑更多的進程了。
load>1:進程都堵著等待資源。
注意:
load < 0.7 :系統很閑,要考慮多部署一些服務。
0.7 < load < 1 :系統狀態不錯。
load == 1 時:系統馬上要超負載了。
load > 5:系統已經非常繁忙。
不同 load 值說明的問題:
(1)1 分鐘 load >5,5 分鐘 load <3,15 分鐘 load <1。
短期內繁忙,中長期空閑,初步判斷是一個抖動或者是擁塞前兆
(2)1 分鐘 load >5,5 分鐘 load >3,15 分鐘 load <1
短期內繁忙,中期內緊張,很可能是一個擁塞的開始。
(3)1 分鐘 load >5,5 分鐘 load >5,15 分鐘 load >5
短中長期都繁忙,系統正在擁塞
(4)1 分鐘 load <1,5 分鐘 Load>3,15 分鐘 load >5
短期內空閑,中長期繁忙,不用緊張,系統擁塞正在好轉。
查看 cpu 信息:
cat /proc/cpuinfo
直接獲取 cpu 核數:
grep 'model name' /proc/cpuinfo | wc -l
ulimit 用戶資源
可以根據硬件資源的具體情況設置各個用戶的最大進程數和打開的最大文件句柄數。可以用 ulimit -a 來顯示當前的各種系統對用戶使用資源的限制:
設置用戶的最大進程數:
ulimit -u 1024
設置用戶可以打開的最大文件句柄數:
ulimit -n 65530
curl http
由于當前的線上服務較多地使用了 RESTful 風格的 API,所以集成測試就需要進行HTTP 調用,查看返回的結果是否符合預期,curl 命令當然是首選的測試方法。使用方式如下:
//打印請求響應頭信息
curl -i "http://www.sina.com"
// 僅返回 http 頭
curl -I "http://www.sina.com"
// 打印更多的調試信息
curl -v "http://www.sina.com"
// 打印更多的調試信息
curl -verbose "http://www.sina.com"
// 使用 post 方法提交 http 請求
curl -d 'abc=def' "http://www.sina.com"
// 打印 http 響應碼
curl -sw '%{http_code}' "http://www.sina.com"
scp 遠程拷貝
secure copy 的縮寫, scp 是 linux 系統下基于 ssh 登陸進行安全的遠程文件拷貝命令。scp 命令是 Linux 系統中功能強大的文件傳輸命令,可以實現從本地到遠程,以及從遠程到本地的雙向文件傳輸,用起來非常方便,常用來在線上定位問題時將線卜的一些文件下載到本地進行詳查,或者將本地的修改上傳到服務器上。
使用方式:
sudo apt-get install openssh-server
//下載服務器上的文件
scp 用戶名@host name://服務器目錄
//上傳文件
scp 文件 用戶名@host name://服務器目錄
//下載服務器上的文件到本地
scp -r 用戶名@host name://服務器目錄 .
//上傳本地test整個目錄到另外服務器地址
scp -r test 用戶名@host name://服務器目錄 另外服務器地址
dos2unix 和 unix2dos
用于轉換 windows 和 UNIX 的換行符,通常在 Windows 系統 h 開發的腳本和配置,UNIX 系統下都需要轉換。
使用方式:
dos2unix test.txt
unix2dos test.txt
//轉換整個目錄
find . -type f -exec dos2unix {} ;
//顯示當前目錄下所有的文件
find ./ -type f
sed 字符替換
命令格式 1:sed 's/原字符串/新字符串/' 文件
命令格式 2:sed 's/原字符串/新字符串/g' 文件
兩種命令格式的區別在于是否有個“g”。沒有“g”表示只替換第一個匹配到的字符串,有“g”表示替換所有能匹配到的字符串,“g”可以認為是“global”(全局的)的縮寫,沒有“全局的”結尾就不要替換全部。
查看活動進程的命令
ps 用一于顯示系統內的所有進程。
-l 或 l 采用詳細的格式來顯示進程狀況
常用方式:ps -elf 和 ps -ef
根據進程的名字或者其他信息,通過 grep 命令找到目標進程,也可以看到進程啟動腳本的全路徑。
(1)檢測是否有活動進程:
sudo ps -ef |grep "Nginx: master process" |grep -v grep
(2)檢測有幾個同樣的活動進程
sudo ps -ef |grep "nginx: master process" |grep -v grep |wc -l
top
op 命令用于查看活動進程的 CPU 和內存信息,能夠實時顯示系統中各個進程的資源占用情況,可以按照 CPU、內存的使用情況和執行時間對進程進行排序。
從輸出可以看到整體的 CPU 占用率、CPU 負載,以及進程占用 CPU 和內存等資源的情況。
用以下所示的 top 命令的快捷鍵對輸出的顯示信息進行轉換。
t:切換報示進程和 CPU 狀態信息。
n:切換顯示內存信息。
r:重新設置一個進程的優先級。系統提示用戶輸人需要改變的進程 PID 及需要設置的進程優先級,然后輸入個正數值使優先級降低,反之則可以使該進程擁有更高的優先級,即是在原有基礎上進行相加,默認優先級的值是 100。
k:終止一個進程,系統將提示用戶輸入需要終止的進程 PID o
s:改變刷新的時間間隔。
u:查看指定用戶的進程。
top 命令查找 cpu 占用率最高的程序,找到對應的 PID。
top -Hp pid ,查看具體進程下的線程,比如:
pidstat 進程資源
pidstat 用于監控全部或指定的進程占用系統資源的情況,包括 CPU、內存、磁盤 I/O、程切換、線程數等數據。
-u:表示查看 cpu 相關的性能指標
• -w:表示查看上下文切換情況
• -t:查看線程相關的信息,默認是進程的;常與-w 結合使用(cpu 的上下文切換包
括進程的切換、線程的切換、中斷的切換)
• -d:展示磁盤 I/O 統計數據
• -p:指明進程號
使用方式:pidstat [option] interval [count]
使用范例:pidstat -urd -p 進程號
CPU 信息
%usr #用戶層任務正在使用的 CPU 百分比(with or without nice
priority ,NOT include time spent running a virtual processor)
• %system #系統層正在執行的任務的 CPU 使用百分比
• %guest #運行虛擬機的 CPU 占用百分比
• %CPU #所有的使用的 CPU 的時間百分比
• CPU #處理器數量
• Command #命令
內存信息
PID #進程號
• minflt/s #每秒次缺頁錯誤次數(minor page faults),次缺頁錯誤次數,即虛擬內存地址映射成物理內存地址產生的 page fault 次數。
• majflt/s #每秒主缺頁錯誤次數(major page faults),當虛擬內存地址映射成物理內存地址時,相應的 page 在 swap 中,這樣的 page fault 為 major page fault,一般在內存使用緊張時產生。
• VSZ #該進程使用的虛擬內存(以 kB 為單位)
• RSS #該進程使用的物理內存(以 kB 為單位)
• %MEM #當前任務使用的有效內存的百分比
• Command #任務的命令名
磁盤 I/O
• PID #進程號
• kB_rd/s #每秒此進程從磁盤讀取的千字節數
• kB_wr/s #此進程已經或者將要寫入磁盤的每秒千字節數
• kB_ccwr/s #由任務取消的寫入磁盤的千字節數
• Command #命令的名字
上下文切換
//PID 號
PID
//每秒自動上下文切換
cswch/s
//每秒非自愿的上下文切換
nvcswch/s
//命令
Command
free
用于顯示系統內存的使用情況,包括總體內存、已經使用的內存。用于顯示系統內核使用的緩沖區,包括緩沖和緩存等。
1. Mem 行(第二行)是內存的使用情況。
2. Swap 行(第三行)是交換空間的使用情況。
• total 列顯示系統總的可用物理內存和交換空間大小。
• used 列顯示已經被使用的物理內存和交換空間。
• free 列顯示還有多少物理內存和交換空間可用使用。
• shared 列顯示被共享使用的物理內存大小。
• buff/cache 列顯示被 buffer 和 cache 使用的物理內存大小。
• available 列顯示還可以被應用程序使用的物理內存大小。
free 與 available,這到底有什么區別呢?
free 是真正尚未被使用的物理內存數量。至于 available 就比較有意思了,它是從應用程序的角度看到的可用內存數量。Linux 內核為了提升磁盤操作的性能,會消耗一部分內存去緩存磁盤數據,就是我們介紹的 buffer 和 cache。對于內核來說,buffer 和 cache 都屬于已經被使用的內存。當應用程序需要內存時,如果沒有足夠的 free 內存可以用,內核就會從 buffer 和 cache 中回收內存來滿足應用程序的請求。所以從應用程序的角度來說,available = free + buffer + cache。
請注意,這只是一個很理想的計算方式,實際中的數據往往有較大的誤差。
加上 -h 選項
持續觀察內存的狀況,此時可以使用 -s 選項并指定間隔的秒數:
1、Buffer(緩沖區)是系統兩端處理速度平衡(從長時間尺度上看)時使用的。它的引入是為了減小短期內突發 I/O 的影響,起到流量整形的作用。比如生產者——消費者問題,他們產生和消耗資源的速度大體接近,加一個 buffer 可以抵消掉資源剛產生/消耗時的突然變化。
2、Cache(緩存)則是解決系統兩端處理速度不匹配時的一種策略。CPU 和memory 之間的速度差異越來越大,一般就是利用數據的局部性特征,通過使用存儲系統分級(memory hierarchy)的策略來減小這種差異帶來的影響。
3、buffer可以減少對磁盤的傷害。存儲器訪問變得跟 CPU 做計算一樣快,cache 就可以消失,但是 buffer 依然存在。比如從網絡上下載東西,瞬時速率可能會有較大變化,但從長期來看卻是穩定的,這樣就能通過引入一個 buffer 使得 OS 接收數據的速率更穩定。
CPU監控命令
vmstat:
此命令顯示關于內核線程、虛擬內存、磁盤 I/O 、陷阱和 CPU 占用率的統計信息。
buff:IO系統存儲的磁盤塊文件的元數據的統計信息。
cache:操作系統用來緩存磁盤數據的緩沖區,大小由操作系統調節,在內存緊張時系統會減少cache占用空間,并保證其它進程可用。
cs:參數表示線程環境的切換次數,此數據太大時,表面線程的同步機制有問題。
si和so較大時,說明系統頻繁使用交換區,應該查看操作系統的內存是否夠用。
bi 和 bo 代表 I/O 活動,根據大小知道磁盤IO的負載情況。
mpstat
實時監控系統 CPU 的一些統計信息,這些信息存放在/proc/stat 文件中,在多核 CPU 系統里,不但能查看所有 CPU 的平均使用信息,還能查看某個特定 CPU 的信息。
使用方式:mpstat [-P {cpu|ALL}] [internal [count]]
當 mpstat 不帶參數時,輸出為從系統啟動以來的平均值。
上面有每個CPU核心的占用率、IO等待、軟中斷、硬中斷等。
輸出各參數含義:
-P {cpu l ALL} : 表示監控哪個 CPU, cpu 在[0,cpu 個數-1]中取值
internal:相鄰的兩次采樣的間隔時間
count:采樣的次數,count 只能和 internal 一起使用
mpstat -P ALL 5 2 命令:表示每 5 秒產生一個報告,總共產生 2 個。
輸出參數含義
當沒有參數時,mpstat 則顯示系統啟動以后所有信息的平均值。有 interval 時,第一行的信息自系統啟動以來的平均信息。從第二行開始,輸出為前一個 interval 時間段的平均信息。 輸出各參數含義:
vmstat 和 mpstat 命令的差別:
1.mpstat 可以顯示每個處理器的統計,而vmstat顯示所有處理器的統計。因此,編寫糟糕的應用程序(不使用多線程體系結構)可能會運行在一個多處理器機器上,而不使用所有處理器。從而導致一個 CPU 過載,而其他CPU 卻很空閑。通過 mpstat 可以輕松診斷這些類型的問題。
2.vmstat 中所有關于 CPU 的總結都適合 mpstat。較低的%idle數字時,出現了CPU不足,看到較高的%iowait 數字,知道在當前負載下IO子系統出現了某些問題。
4.監控磁盤 I/O 命令
IOStat IO 狀態
該命令用于監控CPU占用率,平均負載值及IO讀寫速度等。
await指的是平均等待時間,一般在10ms左右。
cpu 的統計信息,如果是多 cpu 系統,顯示的所有 cpu 的平均統計信息。
%user:用戶進程消耗 cpu 的比例
• %nice:用戶進程優先級調整消耗的 cpu 比例
• %sys:系統內核消耗的 cpu 比例
• %iowait:等待磁盤 io 所消耗的 cpu 比例
• %idle:閑置 cpu 的比例(不包括等待磁盤 I/O)
磁盤的統計參數
tps:該設備每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。"一次傳輸"意思是"一次 I/O 請求"。
多個邏輯請求可能會被合并為"一次 I/O 請求"。"一次傳輸"請求的大小是未知的。
kB_read/s:每秒從設備(drive expressed)讀取的數據量;
kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;
kB_read:讀取的總數據量;
kB_wrtn:寫入的總數量數據量;這些單位都為 Kilobytes。
顯示擴展統計信息
rrqm/s: 每秒對該設備的讀請求被合并次數,文件系統會對讀取同塊(block)的請求進行合并。
wrqm/s:每秒對該設備的寫請求被合并次數。
r/s: 每秒完成的讀次數。
w/s: 每秒完成的寫次數。
rkB/s: 每秒讀數據量(kB 為單位)。
wkB/s: 每秒寫數據量(kB 為單位)
avgrq-sz:平均每次 IO 操作的數據量(扇區數為單位)
avgqu-sz: 平均等待處理的 IO 請求隊列長度
await: 平均每次 IO 請求等待時間(包括等待時間和處理時間,毫秒為單位)
svctm: 平均每次 IO 請求的處理時間(毫秒為單位)
%util: 采用周期內用于 IO 操作的時間比率,即 IO 隊列非空的時間比率。
常用用法
# kb/s 顯示磁盤信息,每 2s 刷新一次
iostat -d -k 2
# kb/s 顯示磁盤統計信息及擴展信息,每 1s 刷新 ,刷新 10 次結束
iostat -dkx 1 10
swapon 查看分區
查看交互分區的使用情況
使用方法:swapon -s
swap 分區通常被稱為交換分區,這是一塊特殊的硬盤空間,即當實際內存不夠用的時候,操作系統會從內存中取出一部分暫時不用的數據,放在交換分區中,從而為當前運行的程序騰出足夠的內存空間。也就是說,當內存不夠用時,我們使用 swap 分區來臨時頂替。這種“拆東墻,補西墻”的方式應用于幾乎所有的操作系統中。一般來講,swap 分區容量應大于物理內存大小,建議是內存的兩倍,但不超過2GB。
df 硬盤
查看文件系統的硬盤掛載點和空間。
使用方式:df -h
du 目錄文件
du 常用的選項:
-h:以人類可讀的方式顯示,顯示 M 或 K
-a:顯示目錄占用的磁盤空間大小,還要顯示其下目錄和文件占用磁盤空間的大小
-s:顯示目錄占用的磁盤空間大小,不顯示其下子目錄和文件占用的磁盤空間大小
-c:顯示幾個目錄或文件占用的磁盤空間大小,還要統計它們的總和
du -a 顯示目錄和目錄下子目錄和文件占用磁盤空間的大小。直接使用-a 以字節為單位,-ha 如下圖以 M 或 K 為結果顯示。
du -s 顯示當前所在目錄大小
du -s -h home 顯示 home 目錄大小
du -c 顯示幾個目錄或文件占用的磁盤空間大小,還要統計它們的總和
du -lh --max-depth=1 : 查看當前目錄下一級子文件和子目錄占用的磁盤容量
5.查看網絡相關的命令
ifconfig 查看和設置網絡設備
該命令用于查看機器掛載的網卡情況。
add<地址> 設置網絡設備 IPv6 的 IP 地址。
del<地址> 刪除網絡設備 IPv6 的 IP 地址。
down 關閉指定的網絡設備。
<hw<網絡設備類型><硬件地址> 設置網絡設備的類型與硬件地址。
io_addr<I/O 地址> 設置網絡設備的 I/O 地址。
irq<IRQ 地址> 設置網絡設備的 IRQ。
media<網絡媒介類型> 設置網絡設備的媒介類型。
mem_start<內存地址> 設置網絡設備在主內存所占用的起始地址。
metric<數目> 指定在計算數據包的轉送次數時,所要加上的數目。
mtu<字節> 設置網絡設備的 MTU。
netmask<子網掩碼> 設置網絡設備的子網掩碼。
tunnel<地址> 建立 IPv4 與 IPv6 之間的隧道通信地址。
up 啟動指定的網絡設備。
-broadcast<地址> 將要送往指定地址的數據包當成廣播數據包來處理。
-pointopoint<地址> 與指定地址的網絡設備建立直接連線,此模式具有保密功能
-promisc 關閉或啟動指定網絡設備的 promiscuous 模式。
[IP 地址] 指定網絡設備的 IP 地址。
[網絡設備] 指定網絡設備的名稱。
顯示網絡設備信息:ifconfig
啟動關閉指定網卡
# ifconfig eth0 down
# ifconfig eth0 up
配置 IP 地址
# ifconfig eth0 192.168.1.56
//給 eth0 網卡配置 IP 地址
# ifconfig eth0 192.168.1.56 netmask 255.255.255.0
// 給 eth0 網卡配置 IP 地址,并加上子掩碼
# ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255
// 給 eth0 網卡配置 IP 地址,加上子掩碼,加上個廣播地址
ping
ping [-dfnqrRv][-c<完成次數>][-i<間隔秒數>][-I<網絡界面>][-l<前置載入>][-p<范本樣式>][-s<數據包大小>][-t<存活數值>][主機名稱或 IP 地址]
-d 使用 Socket 的 SO_DEBUG 功能。
-c<完成次數> 設置完成要求回應的次數。
-f 極限檢測。
-i<間隔秒數> 指定收發信息的間隔時間。
-I<網絡界面> 使用指定的網絡接口送出數據包。
-l<前置載入> 設置在送出要求信息之前,先行發出的數據包。
-n 只輸出數值
-p<范本樣式> 設置填滿數據包的范本樣式。
-q 不顯示指令執行過程,開頭和結尾的相關信息除外。
-r 忽略普通的 Routing Table,直接將數據包送到遠端主機上。
-R 記錄路由過程。
-s<數據包大小> 設置數據包的大小。
-t<存活數值> 設置存活數值 TTL 的大小。
-v 詳細顯示指令的執行過程。
檢測和主機是否連通
ping baidu.com
ping 指定次數
(1)ping 目標主機的域名和 IP(ping 會自動將域名轉換為 IP)
(2)不帶包頭的包大小和帶包頭的包大小(參考“-s”參數)
(3)cmp_seq:ping 序列,從 1 開始;如果數字不是按順序遞增也就意味著丟包了 ttl:剩余的 ttl;見 TTL 解釋。time: 響應時間,數值越小,連通速度越快。
(4)發出去的包數,返回的包數,丟包率,耗費時間。
(5)最小/最大/平均響應時間和本機硬件耗費時間。
TTL:每經過一個‘路由點‘,就把預先設定的這個 TTL 數值減 1,直到最后 TTL=1 時報文就被扔掉,不向下轉發。ping 顯示的 TTL 是指:被 ping 主機那里返回的報文,到了你這里,從它自己預設的 TTL 減小到還剩下多少。簡單點說,就是經過了多少個路由。
telnet
telnet 是 TCP/IP 協議族的一員,是網絡遠程登錄服務的標準協議,幫助用戶在本地計算機上連接遠程主機。
使用方式:telnet IP:PORT
與ssh區別
端口區別:telnet 端口是 23 ,ssh端口 是 22。
本質:telnet 是明碼傳輸,ssh 是加密傳輸。
nc
驗證服務器端口有沒有開放。
nc 是 NetCat 的簡稱,在網絡調試工具中享有“瑞士軍刀”的美譽,此命令功能豐富、短小精悍、簡單實用,被設計成一款易用的網絡工具,可通過 TCP/LJDP 傳輸數據。
參數
-l 用于指定 nc 將處于偵聽模式。指定該參數,則意味著 nc 被當作 server,偵聽并接受連接,而非向其它地址發起連接。
-p 暫未用到(老版本的 nc 可能需要在端口號前加-p 參數,下面測試環境是centos6.6,nc 版本是 nc-1.84,未用到-p 參數)。
-s 指定發送數據的源 IP 地址,適用于多網卡機。
-u 指定 nc 使用 UDP 協議,默認為 TCP。
-v 輸出交互或出錯信息,新手調試時尤為有用。
-w 超時秒數,后面跟數字。
常用示例
# 開啟一個本地 9999 的 TCP 協議端口,由客戶端主動發起連接,一旦連接必須由服務端發起關閉
nc -l 9999
# 通過 nc 去訪問 129.204.197.215 主機的 11111 端口,確認是否存活;可不加參數
nc -vw 2 129.204.197.215 11111
# 開啟一個本地 9999 的 UDP 協議端口,客戶端不需要由服務端主動發起關閉
nc -ul 9999
# 通過 129.204.197.215 的 9999TCP 端口發送數據文件
nc 129.204.197.215 9999 < test
# 開啟一個本地 9999 的 TCP 端口,用來接收文件內容
nc -l 9999 > zabbix.file
# 測試網速
A 機器操作如下:
nc -l 9999 > /dev/null
//B機器開啟數據傳輸
nc 129.204.197.215 9999 </dev/zero
//A 機器進行網絡監控
sar -n DEV 2 100000
在不熟悉公司的防火墻設置時,也可以通過監聽端口來確定指定的端口是否被封。
mtr 連通性測試
mtr 命令是 Linux 系統中的網絡連通性測試工具,也可以用來檢測丟包率。
使用方式:mtr baidu.com
其中的第 2 列為丟包率,可以用來判斷網絡中兩臺機器的連通質量。
模擬丟包:sudo tc qdisc add dev eth0 root netem loss 10%
nslookup
這是一款檢測網絡中 DNS 服務器能否正確解析域名的工具命令,并且可以輸出。
使用方式: nslookup sina.com
traceroute
traceroute 可以提供從用戶的主機到互聯網另一端的主機的路徑,雖然每次數據包由同一出發點到達同一目的地的路徑可能會不一樣,但通常來說大多數情況下路徑是相同的。
使用方式:traceroute sina.com
在輸出中記錄按序列號從 1 開始,每個記錄代表網絡一跳,每跳一次表示經過一個網關或者路由;我們看到每行有三個個時間,單位是毫秒,指的是這一跳需要的時間。
sar
sar 是一個多功能的監控工具,使用簡單,不需要管理員權限,可以輸出每秒的網卡存取速度,適合線上排查問題時使用。
使用方式:
sar -n DEV 1 1
從輸出中可以看到網卡的讀寫速度和流量,在應急過程中可以用來判斷服務器是否上量。此命令除了可以用于查看網卡的信息,還可以用來收集如下服務的狀態信息。
-A:所有報告的總和。
-u:CPU 利用率。
-v:進程、I 節點、文件和鎖表狀態。
-d:硬盤的使用報告。
-r:沒有使用的內存頁面和硬盤快。
-g:串口 I/O 的情況。
-b:緩沖區的使用情況。
-a:文件的讀寫情況。
-c:系統的調用情況。
-R:進程的活動情況。
-y:終端設備的活動情況。
-w:系統的交換活動。
netstat
此命令顯示網絡連接、端口信息等。
根據進程查找端口
(1)根據進程名查找進程 ID
ps -elf | grep 進程
(2)根據進程 ID 查找進程開啟的端口
netstat -nap | grep 24614
根據端口查找進程
(1)根據使用端口
netstat -nap | grep 8080
(2)根據進程 ID 查找進程的詳細信息
iptraf 強大的網絡監控
iptraf 是一個實時監控網絡流量的交互式的彩色文本屏幕界面。它監控的數據比較全面,可以輸出 TCP 連接、網絡接口、協議、端口、網絡包大小等信息,但是耗費的系統資源比較多,且需要管理員權限。
使用方式:sudo iptraf
在進入主界面之前可以選擇不同的選項,在不同的選項下可以查看不同維度的網絡信息。
# ubuntu
sudo apt-get install iptraf
tcpdump
tcpdump 是網絡狀況分析和跟蹤工具,是可以用來抓包的實用命令,使用前需要對TCP/IP 有所熟悉,因為過濾使用的信息都是 TCP/IP 格式。
Ubuntu 安裝:sudo apt-get install tcpdump
捕獲及停止條件
-D 列舉所有網卡設備
? -i 選擇網卡設備
? -c 抓取多少條報文
? --time-stamp-precision 指定捕獲時的時間精度,默認微妙 micro,可選納秒 nano
? -s 指定每條報文的最大字節數,默認 262144 字節
tcpdump 抓取各種報文
tcpdump -D 顯示網卡設備
tcpdump -i eth0 抓取 eth0 的報文
tcpdump -i lo 抓取回環報文
tcpdump -i eth0 -c 2 抓取 2 條報文后退出
tcpdump -i eth0 -c 2 --time-stamp-precision=nano 默認按納秒
telnet 127.0.0.1 80 可以通過 telnet 上去測試抓包,此時應用抓取 lo
表達式
原語:名稱或數字,以及描述它的多個限定詞組成
限定詞:
Type:設置數字或者名稱所指示類型,例如 host www.baidu.com
Dir:設置網絡出入方向,例如 dst port 80
Proto: 指定協議類型,例如 udp
原語運算:
與:&&或者 and
或:||或者 or
非:!或者 not
src or dst portrange 6000-8000 && tcp
tcpdump -i eth0 -c 10 host www.baidu.com and port 80
同時在另一個終端 curl www.baidu.com
限定詞
Type:設置數字或者名稱所指示類型
host、port
? net, 設定子網, net 192.168.0.0 mask 等價于 net 192.168.0.0/24
? portrange,設置端口范圍,例如 portrange 6000-8000
Dir:設置網絡出入方向
src、dst、src or dst、src and dst
? ra、ta、addr1、addr2、addr3、addr4(僅對 IEEE 802.11 Wireless Lan 有效)
Proto:指定協議類型
ethr、fddi、tr、wlan、ip、ip6、arp、tcp、udp 等
文件操作
-w 輸出結果至文件
-C 限制輸入文件的大小,超出以后綴 1 等數字的方式遞增。注意單位是 1,000,000 字節
-W 指定輸出文件的最大數量,到達后重新復寫第一個文件
-G 指定每個 N 秒就重新輸出至新文件,注意-w 參數應基于 strftime 參數指定文件名
-r 讀取一個抓包文件
-V 將待讀取的多個文件名寫入一個文件中,通過讀取該文件同時讀取多個文件
tcpdump -c 2 -w a 保存 2 個包到 a 文件
tcpdump -r a 讀取 a 文件顯示
tcpdump -c 2 -w b 保存 2 個包到 b 文件
vim c 文件,把逐行寫入 a、b,如下所示
tcpdump -V c 讀取多個文件
tcpdump -C 1 -W 3 abc 限制文件大小為 1,000,000 字節,輸出文件最大數量為 3
tcpdump -G 3 -w def%M-%S
strftime 參考:
輸出時間格式
-e 顯示數據鏈路層頭部
-q 不顯示傳輸層信息
-v 顯示網絡層頭部更多的信息,如 TTL、id 等
-n 顯示 IP 地址、數字端口代替 hostname 等
-S TCP 信息以絕對序列號代替相對序列號
-A 以 ASCII 方式顯示報文內容,適用 HTTP 分析
-x 以 16 進制方式顯示報文內容,不顯示數據鏈路層
-xx 以 16 進制方式顯示報文內容,顯示數據鏈路層
-X 同時以 16 進制及 ASCII 方式顯示報文內容,不顯示數據鏈路層
-XX 同時以 16 進制及 ASCII 方式顯示報文內容,顯示數據鏈路層
sudo tcpdump -r a -e
sudo tcpdump -r a -q
sudo tcpdump -r a -v
sudo tcpdump -r a -n
sudo tcpdump -r a -S
sudo tcpdump -r a -A
sudo tcpdump -r a -x
sudo tcpdump -r a -xx
sudo tcpdump -r a -X
sudo tcpdump -r a -XX
顯示去往 102.168.1.102 的所有會話信息:
tcpdump -i eth1 'dst 192.168.1.102 and (port 21 or 20)'
顯示去往 102.168.1.102 的所有會話信息:
tcpdump -i eth0 'dst 192.168.1.102 and tcp and port 8080'
nmap
通常用于查看本機有哪些端口對外提供服務,或者服務器有哪些端口對外開放。
注意,實際能否進行連通還要看防火墻的設置。
使用方式:nmap -v -A localhost
# ubuntu 安裝
sudo apt install nmap
#查看主機當前開放的端口
nmap localhost
#查看主機端口(1024-65535)中開放的端口
nmap -p 1024-65535 localhost
#探測目標主機開放的端口
nmap -PS 192.168.56.101
#探測所列出的目標主機端口
nmap -PS22,80,3306 192.168.56.101
#探測目標主機操作系統類型
nmap -O 192.168.56.101
#探測目標主機操作系統類型
nmap -A 192.168.56.101
ethtool
ethtool 用于查看網卡的配置情況。
sudo apt install ethtool
命令使用格式:ethtool [option] interface
查看網卡:
ethtool ens33
注意:在云主機檢測不到網卡信息
(1)查看網卡的接口信息
ethtool eth1
(2)關閉網卡 eth1 的自動協商
ethtool -s eth1 autoneg off
(3)修改網卡速率為 100Mb/s
ethtool -s eth4 speed 100
(4)查看網卡驅動信息
ethtool -i eth0
(5)查看網卡的一些工作統計信息
ethtool –S eth0
(6)停止和查看網卡的發送模塊 TX 的狀態
#修改 tx 的狀態
ethtool -A tx off eth0
//查看 tx 的狀態
ethtool -a eth0
(7)關閉網卡對收到的數據包的校驗功能
//關閉校驗
ethtool -K rx off eth0
//查看校驗啟動狀態
ethtool –k eth0
lsof
lsof 是系統管理/安全的尤伯工具。指“列出打開文件(lists openfiles)”。
可以使用它來獲得你系統上設備的信息,你能通過它了解到指定的用戶在指定的地點正在碰什么東西,或者甚至是一個進程正在使用什么文件或網絡連接。具體可以使用 man lsof 查看幫助文檔。
關鍵選項
默認 : 沒有選項,lsof 列出活躍進程的所有打開文件。
組合 : 可以將選項組合到一起,如-abc,但要當心哪些選項需要參數
-a : 結果進行“與”運算(而不是“或”)
-l : 在輸出顯示用戶 ID 而不是用戶名
-h : 獲得幫助
-t : 僅獲取進程 ID
-U : 獲取 UNIX 套接口地址
-F : 格式化輸出結果,用于其它命令。如-F pcfn(用于進程 id、命令名、文件描述符、文件名,并以空終止)
獲取網絡信息
顯示端口被某個程序占用
lsof -i:port
lsof -c abc 顯示 abc 進程現在打開的文件,可以使用 less 進行分頁,b 向后翻一頁,d 向后翻半頁
6 Linux 系統的高級工具
pstack
sudo apt install pstack
pstack 命令用來顯示每個進程的調用棧。可以使用 pstack 來查看進程正在掛起的執行方法,也可以用來查看進程的本地線程堆棧,與 JVM 的 jstack 配合可以看到 JVM 線程運行的全景。
使用方式:pstack 進程 ID
strace
系統調用工具,是 Linux 系統下的一款程序調試工具,用來監控一個應用程序所使用的 系統調用,通過它可以跟蹤系統調用,讓你熟悉一個 Linux 程序在背后是怎么工作的。 適用于想研究 Linux 底層的工作機制的場景。
參數
-c 統計每一系統調用的所執行的時間,次數和出錯的次數等。
-d 輸出 strace 關于標準錯誤的調試信息。
-f 跟蹤由 fork 調用所產生的子進程。
-ff 如果提供-o filename,則所有進程的跟蹤結果輸出到相應的 filename.pid 中,pid 是各進程的進程號
-F 嘗試跟蹤 vfork 調用.在-f 時,vfork 不被跟蹤.
-h 輸出簡要的幫助信息
-i 輸出系統調用的入口指針
-q 禁止輸出關于脫離的消息
-r 打印出相對時間關于,每一個系統調用
-t 在輸出中的每一行前加上時間信息
-tt 在輸出中的每一行前加上時間信息,微秒級
-ttt 微秒級輸出,以秒了表示時間
-T 顯示每一調用所耗的時間
-v 輸出所有的系統調用.一些調用關于環境變量,狀態,輸入輸出等調用由于使用頻繁,默認不輸出
-V 輸出 strace 的版本信息
-x 以十六進制形式輸出非標準字符串
-xx 所有字符串以十六進制形式輸出
-a column
設置返回值的輸出位置.默認 為 40
-e expr
指定一個表達式,用來控制如何跟蹤.格式如下
[qualifier=][!]value1[,value2]...
qualifier 只能是 trace,abbrev,verbose,raw,signal,read,write 其中之一.value 是用來限定的符號或數字.默認的 qualifier 是 trace.感嘆號是否定符號.例如:
-eopen 等價于 -e trace=open,表示只跟蹤 open 調用.而-etrace!=open 表示跟蹤除了 open以外的其他調用.有兩個特殊的符號 all 和 none.
注意有些 shell 使用!來執行歷史記錄里的命令,所以要使用\.
-e trace=set
只跟蹤指定的系統 調用.例如:-e trace=open,close,rean,write 表示只跟蹤這四個系統調用.默認的為 set=all.
只跟蹤有關文件操作的系統調用
-e trace=file
只跟蹤有關進程控制的系統調用
-e trace=process
跟蹤與網絡有關的所有系統調用
-e trace=network
跟蹤所有與系統信號有關的 系統調用
-e strace=signal
跟蹤所有與進程通訊有關的系統調用
-e trace=ipc
設定 strace 輸出的系統調用的結果集.-v 等與 abbrev=none.默認為 abbrev=all
-e abbrev=set
指定跟蹤的系統信號.默認為 all.如 signal=!SIGIO(或者 signal=!io),表示不跟蹤 SIGIO 信號.
-e signal=set
輸出從指定文件中讀出 的數據.例如:
-e read=set
-e read=3,5
輸出寫入到指定文件中的數據
-e write=set
輸出寫入到指定文件中的數據
-o filename
將 strace 的輸出寫入文件 filename
跟蹤指定的進程 pid.
-p pid
指定輸出的字符串的最大長度.默認為 32.文件名一直全部輸出
-s strsize
以 username 的 UID 和 GID 執行被跟蹤的命令
-u username
實時查看進程
proc 文件系統
顯示 CPU 信息:
cat /proc/cpuinfo
顯示內存信息:
cat /proc/meminfo
顯示詳細的內存映射信息:
cat /proc/zoneinfo
顯示磁盤映射信息:
cat /proc/mounts
查看系統平均負載命令:
cat /proc/loadavg
7 日志監控工具
tail
在實時日志上打印顏色,給每個狀態給上不同的顏色,INF 綠色、WARN 黃色、ERROR 紅色。
multitail
可同時開啟多視窗看 log,適合用在看部署在很多機器上的項目的 log -cS。
[color_scheme] : 可以選擇輸出的 log 的顏色,推薦使用 goldengate,也可自定義(修改
/etc/multitail.conf)
8 性能監控
pmap
pmap [options] PID
Pmap 提供了進程的內存映射,pmap 命令用于顯示一個或多個進程的內存狀態。其報告進程的地址空間和內存狀態信息。Pmap 實際上是一個 Sun OS 上的命令,linux 僅支持其有限的功能。但是它還是對查看完整的進程地址空間很有幫助。需要 PID 或者運行的進程的唯一進程 ID 來查看進程內存狀態,可以通過/proc 或者常規命令比如 top 或 ps 得到。
更詳細的輸出可以使用-X 參數。
這里的輸出有很多的[ anon ]行,表示在磁盤上沒有對應的文件,這些一般都是可執行文件或者動態庫里的 bss 段。當然有對應文件的 mApping 也有可能是 anonymous,比如文件的數據段。
接下來 8 個字段的含義分別如下:
1. Size:表示該映射區域在虛擬內存空間中的大小。
2. Rss:表示該映射區域當前在物理內存中占用了多少空間。
3. Shared_Clean:和其他進程共享的未被改寫的 page 的大小。
4. Shared_Dirty: 和其他進程共享的被改寫的 page 的大小。
5. Private_Clean:未被改寫的私有頁面的大小。
6. Swap:表示非 mmap 內存(也叫 anonymous memory,比如 malloc 動態分配出
來的內存)由于物理內存不足被 swap 到交換空間的大小。
7. Pss:該虛擬內存區域平攤計算后使用的物理內存大小(有些內存會和其他進程共
享,例如 mmap 進來的)。比如該區域所映射的物理內存部分同時也被另一個進
程映射了,且該部分物理內存的大小為 1000KB,那么該進程分攤其中一半的內
存,即 Pss=500KB。
nmon 性能監控
$ sudo apt-get install nmon
$ nmon
后臺監控
為了配合性能測試,往往需要將一個時間段內系統資源消耗情況記錄下來,這時可以使用命令在遠程窗口執行命令:
./nmon/ nmon_x86_rhel5 -f -N -m /nmon/log -s 30 -c 120
其中各參數表示:
-f 按標準格式輸出文件:_YYYYMMDD_HHMM.nmon
-N include NFS sections
-m 切換到路徑去保存日志文件
-s 每隔 n 秒抽樣一次,這里為 30
-c 取出多少個抽樣數量,這里為 120,即監控=120*(30/60/60)=1 小時
根據小時計算這個數字的公式為:c=h3600/s,比如要監控 10 小時,每隔 30 秒采樣一次,則 c=103600/30=1200
該命令啟動后,會在 nmon 所在目錄下生成監控文件,并持續寫入資源數據,直至 360個監控點收集完成——即監控 1 小時,這些操作均自動完成,無需手工干 預,測試人員可以繼續完成其他操作。如果想停止該監控,需要通過“#ps –ef|grep nmon”查詢進程號,然后殺掉該進程以停止監控。
定時任務
除配合性能測試的短期監控,也可以實現對系統的定期監控,作為運營維護階段的參考。定期監控實現如下:
(1) 執行命令:#crontab –e
(2)在最后一行添加如下命令:
0 8 * * 1,2,3,4,5 /nmon/nmon_x86_rhel5 -f -N -m /nmon/log -s 30 -c 1200
表示:周一到周五,從早上 08 點開始,監控 10 個小時(到 18:00 整為止),輸出到/nmon/log
測試指標可視化
nmon 命令 生成的 nmon 可以通過工具進行可視化展示,一般可以使用 nmonchart、nmon_analyser、nmonchart、nmonechart 使用 google charts 生成 html 報告。
glances 系統監控
sudo apt-add-repository ppa:arnaud-hartmann/glances-stable
sudo apt-get update
sudo apt-get install glances
執行:glances
除了很多命令行選項之外,Glances 還提供了更多的可在其運行時開關輸出信息選項的快捷鍵,下面是一些例子:
a – 對進程自動排序
• c – 按 CPU 百分比對進程排序
• m – 按內存百分比對進程排序
p – 按進程名字母順序對進程排序
• i – 按讀寫頻率(I/O)對進程排序
• d – 顯示/隱藏磁盤 I/O 統計信息
• f – 顯示/隱藏文件系統統計信息
• n – 顯示/隱藏網絡接口統計信息
• s – 顯示/隱藏傳感器統計信息
• y – 顯示/隱藏硬盤溫度統計信息
• l – 顯示/隱藏日志(log)
• b – 切換網絡 I/O 單位(Bytes/bits)
• w – 刪除警告日志
• x – 刪除警告和嚴重日志
• 1 – 切換全局 CPU 使用情況和每個 CPU 的使用情況
• h – 顯示/隱藏這個幫助畫面
• t – 以組合形式瀏覽網絡 I/O
• u – 以累計形式瀏覽網絡 I/O
• q – 退出(‘ESC‘ 和 ‘Ctrl&C‘ 也可以)
Glances 對于大多用戶而言是個在系統資源上提供過多信息的工具。但是如果你是一個想要僅從命令行就能快速獲取系統整體狀況的系統管理員,那這個工具絕對是你的必備利器。
今天的文章就分享到這里,歡迎關注,收藏,轉發,點贊。