1、cd命令
成都創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、成都網(wǎng)站制作與策劃設(shè)計(jì),滑縣網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:滑縣等地區(qū)。滑縣做網(wǎng)站價(jià)格咨詢:18980820575
這是一個(gè)非?;?,也是大家經(jīng)常需要使用的命令,它用于切換當(dāng)前目錄,它的參數(shù)是要切換到的目錄的路徑,可以是絕對(duì)路徑,也可以是相對(duì)路徑。如:
cd
/root/Docements # 切換到目錄/root/Docements
cd ./path #
切換到當(dāng)前目錄下的path目錄中,“.”表示當(dāng)前目錄
cd ../path #
切換到上層目錄中的path目錄中,“..”表示上一層目錄
2、ls命令
這是一個(gè)非常有用的查看文件與目錄的命令,list之意,它的參數(shù)非常多,下面就列出一些我常用的參數(shù)吧,如下:
-l
:列出長(zhǎng)數(shù)據(jù)串,包含文件的屬性與權(quán)限數(shù)據(jù)等
-a
:列出全部的文件,連同隱藏文件(開頭為.的文件)一起列出來(常用)
-d
:僅列出目錄本身,而不是列出目錄的文件數(shù)據(jù)
-h
:將文件容量以較易讀的方式(GB,kB等)列出來
-R
:連同子目錄的內(nèi)容一起列出(遞歸列出),等于該目錄下的所有文件都會(huì)顯示出來
注:這些參數(shù)也可以組合使用,下面舉兩個(gè)例子:
ls -l
#以長(zhǎng)數(shù)據(jù)串的形式列出當(dāng)前目錄下的數(shù)據(jù)文件和目錄
ls -lR
#以長(zhǎng)數(shù)據(jù)串的形式列出當(dāng)前目錄下的所有文件
3、grep命令
該命令常用于分析一行的信息,若當(dāng)中有我們所需要的信息,就將該行顯示出來,該命令通常與管道命令一起使用,用于對(duì)一些命令的輸出進(jìn)行篩選加工等等,它的簡(jiǎn)單語(yǔ)法為
grep [-acinv]
[--color=auto] '查找字符串' filename
它的常用參數(shù)如下:
-a
:將binary文件以text文件的方式查找數(shù)據(jù)
-c
:計(jì)算找到‘查找字符串’的次數(shù)
-i
:忽略大小寫的區(qū)別,即把大小寫視為相同
-v
:反向選擇,即顯示出沒有‘查找字符串’內(nèi)容的那一行
# 例如:
#
取出文件/etc/man.config中包含MANPATH的行,并把找到的關(guān)鍵字加上顏色
grep --color=auto
'MANPATH' /etc/man.config
# 把ls
-l的輸出中包含字母file(不區(qū)分大小寫)的內(nèi)容輸出
ls -l | grep -i
file
4、find命令
find是一個(gè)基于查找的功能非常強(qiáng)大的命令,相對(duì)而言,它的使用也相對(duì)較為復(fù)雜,參數(shù)也比較多,所以在這里將給把它們分類列出,它的基本語(yǔ)法如下:
find [PATH]
[option] [action]
# 與時(shí)間有關(guān)的參數(shù):
-mtime n :
n為數(shù)字,意思為在n天之前的“一天內(nèi)”被更改過的文件;
-mtime +n :
列出在n天之前(不含n天本身)被更改過的文件名;
-mtime -n :
列出在n天之內(nèi)(含n天本身)被更改過的文件名;
-newer file :
列出比f(wàn)ile還要新的文件名
# 例如:
find /root -mtime
0 # 在當(dāng)前目錄下查找今天之內(nèi)有改動(dòng)的文件
# 與用戶或用戶組名有關(guān)的參數(shù):
-user name :
列出文件所有者為name的文件
-group name :
列出文件所屬用戶組為name的文件
-uid n :
列出文件所有者為用戶ID為n的文件
-gid n :
列出文件所屬用戶組為用戶組ID為n的文件
# 例如:
find
/home/ljianhui -user ljianhui # 在目錄/home/ljianhui中找出所有者為ljianhui的文件
# 與文件權(quán)限及名稱有關(guān)的參數(shù):
-name filename
:找出文件名為filename的文件
-size [+-]SIZE
:找出比SIZE還要大(+)或小(-)的文件
-tpye TYPE
:查找文件的類型為TYPE的文件,TYPE的值主要有:一般文件(f)、設(shè)備文件(b、c)、
目錄(d)、連接文件(l)、socket(s)、FIFO管道文件(p);
-perm mode
:查找文件權(quán)限剛好等于mode的文件,mode用數(shù)字表示,如0755;
-perm -mode
:查找文件權(quán)限必須要全部包括mode權(quán)限的文件,mode用數(shù)字表示
-perm +mode
:查找文件權(quán)限包含任一mode的權(quán)限的文件,mode用數(shù)字表示
# 例如:
find / -name
passwd # 查找文件名為passwd的文件
find . -perm 0755
# 查找當(dāng)前目錄中文件權(quán)限的0755的文件
find . -size +12k
# 查找當(dāng)前目錄中大于12KB的文件,注意c表示byte
5、cp命令
該命令用于復(fù)制文件,copy之意,它還可以把多個(gè)文件一次性地復(fù)制到一個(gè)目錄下,它的常用參數(shù)如下:
-a :將文件的特性一起復(fù)制
-p
:連同文件的屬性一起復(fù)制,而非使用默認(rèn)方式,與-a相似,常用于備份
-i
:若目標(biāo)文件已經(jīng)存在時(shí),在覆蓋時(shí)會(huì)先詢問操作的進(jìn)行
-r
:遞歸持續(xù)復(fù)制,用于目錄的復(fù)制行為
-u
:目標(biāo)文件與源文件有差異時(shí)才會(huì)復(fù)制
例如 :
cp -a file1 file2
#連同文件的所有特性把文件file1復(fù)制成文件file2
cp file1 file2
file3 dir #把文件file1、file2、file3復(fù)制到目錄dir中
6、mv命令
該命令用于移動(dòng)文件、目錄或更名,move之意,它的常用參數(shù)如下:
-f
:force強(qiáng)制的意思,如果目標(biāo)文件已經(jīng)存在,不會(huì)詢問而直接覆蓋
-i
:若目標(biāo)文件已經(jīng)存在,就會(huì)詢問是否覆蓋
-u
:若目標(biāo)文件已經(jīng)存在,且比目標(biāo)文件新,才會(huì)更新
注:該命令可以把一個(gè)文件或多個(gè)文件一次移動(dòng)一個(gè)文件夾中,但是最后一個(gè)目標(biāo)文件一定要是“目錄”。
例如:
mv file1 file2
file3 dir # 把文件file1、file2、file3移動(dòng)到目錄dir中
mv file1 file2 #
把文件file1重命名為file2
7、rm命令
該命令用于刪除文件或目錄,remove之間,它的常用參數(shù)如下:
-f
:就是force的意思,忽略不存在的文件,不會(huì)出現(xiàn)警告消息
-i
:互動(dòng)模式,在刪除前會(huì)詢問用戶是否操作
-r
:遞歸刪除,最常用于目錄刪除,它是一個(gè)非常危險(xiǎn)的參數(shù)
例如:
rm -i file #
刪除文件file,在刪除之前會(huì)詢問是否進(jìn)行該操作
rm -fr dir #
強(qiáng)制刪除目錄dir中的所有文件
8、ps命令
該命令用于將某個(gè)時(shí)間點(diǎn)的進(jìn)程運(yùn)行情況選取下來并輸出,process之意,它的常用參數(shù)如下:
-A :所有的進(jìn)程均顯示出來
-a
:不與terminal有關(guān)的所有進(jìn)程
-u :有效用戶的相關(guān)進(jìn)程
-x
:一般與a參數(shù)一起使用,可列出較完整的信息
-l
:較長(zhǎng),較詳細(xì)地將PID的信息列出
其實(shí)我們只要記住ps一般使用的命令參數(shù)搭配即可,它們并不多,如下:
ps aux #
查看系統(tǒng)所有的進(jìn)程數(shù)據(jù)
ps ax #
查看不與terminal有關(guān)的所有進(jìn)程
ps -lA #
查看系統(tǒng)所有的進(jìn)程數(shù)據(jù)
ps axjf #
查看連同一部分進(jìn)程樹狀態(tài)
9、kill命令
該命令用于向某個(gè)工作(%jobnumber)或者是某個(gè)PID(數(shù)字)傳送一個(gè)信號(hào),它通常與ps和jobs命令一起使用,它的基本語(yǔ)法如下:
kill -signal PID
signal的常用參數(shù)如下:
注:最前面的數(shù)字為信號(hào)的代號(hào),使用時(shí)可以用代號(hào)代替相應(yīng)的信號(hào)。
1:SIGHUP,啟動(dòng)被終止的進(jìn)程
2:SIGINT,相當(dāng)于輸入ctrl+c,中斷一個(gè)程序的進(jìn)行
9:SIGKILL,強(qiáng)制中斷一個(gè)進(jìn)程的進(jìn)行
15:SIGTERM,以正常的結(jié)束進(jìn)程方式來終止進(jìn)程
17:SIGSTOP,相當(dāng)于輸入ctrl+z,暫停一個(gè)進(jìn)程的進(jìn)行
例如:
#
以正常的結(jié)束進(jìn)程方式來終于第一個(gè)后臺(tái)工作,可用jobs命令查看后臺(tái)中的第一個(gè)工作進(jìn)程
kill -SIGTERM
%1
#
重新改動(dòng)進(jìn)程ID為PID的進(jìn)程,PID可用ps命令通過管道命令加上grep命令進(jìn)行篩選獲得
kill -SIGHUP PID
10、killall命令
該命令用于向一個(gè)命令啟動(dòng)的進(jìn)程發(fā)送一個(gè)信號(hào),它的一般語(yǔ)法如下:
killall [-iIe]
[command name]
它的參數(shù)如下:
-i
:交互式的意思,若需要?jiǎng)h除時(shí),會(huì)詢問用戶
-e :表示后面接的command
name要一致,但command name不能超過15個(gè)字符
-I :命令名稱忽略大小寫
# 例如:
killall -SIGHUP
syslogd # 重新啟動(dòng)syslogd
11、file命令
該命令用于判斷接在file命令后的文件的基本數(shù)據(jù),因?yàn)樵贚inux下文件的類型并不是以后綴為分的,所以這個(gè)命令對(duì)我們來說就很有用了,它的用法非常簡(jiǎn)單,基本語(yǔ)法如下:
file filename
#例如:
file ./test
12、tar命令
該命令用于對(duì)文件進(jìn)行打包,默認(rèn)情況并不會(huì)壓縮,如果指定了相應(yīng)的參數(shù),它還會(huì)調(diào)用相應(yīng)的壓縮程序(如gzip和bzip等)進(jìn)行壓縮和解壓。它的常用參數(shù)如下:
-c :新建打包文件
-t
:查看打包文件的內(nèi)容含有哪些文件名
-x
:解打包或解壓縮的功能,可以搭配-C(大寫)指定解壓的目錄,注意-c,-t,-x不能同時(shí)出現(xiàn)在同一條命令中
-j
:通過bzip2的支持進(jìn)行壓縮/解壓縮
-z
:通過gzip的支持進(jìn)行壓縮/解壓縮
-v
:在壓縮/解壓縮過程中,將正在處理的文件名顯示出來
-f filename
:filename為要處理的文件
-C dir
:指定壓縮/解壓縮的目錄dir
上面的解說可以已經(jīng)讓你暈過去了,但是通常我們只需要記住下面三條命令即可:
壓縮:tar -jcv -f
filename.tar.bz2 要被處理的文件或目錄名稱
查詢:tar -jtv -f
filename.tar.bz2
解壓:tar -jxv -f
filename.tar.bz2 -C 欲解壓縮的目錄
注:文件名并不定要以后綴tar.bz2結(jié)尾,這里主要是為了說明使用的壓縮程序?yàn)閎zip2
13、cat命令
該命令用于查看文本文件的內(nèi)容,后接要查看的文件名,通??捎霉艿琅cmore和less一起使用,從而可以一頁(yè)頁(yè)地查看數(shù)據(jù)。例如:
cat text | less #
查看text文件中的內(nèi)容
# 注:這條命令也可以使用less
text來代替
14、chgrp命令
該命令用于改變文件所屬用戶組,它的使用非常簡(jiǎn)單,它的基本用法如下:
chgrp [-R]
dirname/filename
-R
:進(jìn)行遞歸的持續(xù)對(duì)所有文件和子目錄更改
# 例如:
chgrp users -R
./dir # 遞歸地把dir目錄下中的所有文件和子目錄下所有文件的用戶組修改為users
15、chown命令
該命令用于改變文件的所有者,與chgrp命令的使用方法相同,只是修改的文件屬性不同,不再詳述。
16、chmod命令
該命令用于改變文件的權(quán)限,一般的用法如下:
chmod [-R] xyz
文件或目錄
-R:進(jìn)行遞歸的持續(xù)更改,即連同子目錄下的所有文件都會(huì)更改
同時(shí),chmod還可以使用u(user)、g(group)、o(other)、a(all)和+(加入)、-(刪除)、=(設(shè)置)跟rwx搭配來對(duì)文件的權(quán)限進(jìn)行更改。
# 例如:
chmod 0755 file #
把file的文件權(quán)限改變?yōu)?rxwr-xr-x
chmod g+w file #
向file的文件權(quán)限中加入用戶組可寫權(quán)限
18、vim命令
該命令主要用于文本編輯,它接一個(gè)或多個(gè)文件名作為參數(shù),如果文件存在就打開,如果文件不存在就以該文件名創(chuàng)建一個(gè)文件。vim是一個(gè)非常好用的文本編輯器,它里面有很多非常好用的命令,在這里不再多說。你可以從這里下載vim常用操作的詳細(xì)說明。
19、gcc命令
對(duì)于一個(gè)用Linux開發(fā)C程序的人來說,這個(gè)命令就非常重要了,它用于把C語(yǔ)言的源程序文件,編譯成可執(zhí)行程序,由于g++的很多參數(shù)跟它非常相似,所以這里只介紹gcc的參數(shù),它的常用參數(shù)如下:
-o
:output之意,用于指定生成一個(gè)可執(zhí)行文件的文件名
-c
:用于把源文件生成目標(biāo)文件(.o),并阻止編譯器創(chuàng)建一個(gè)完整的程序
-I :增加編譯時(shí)搜索頭文件的路徑
-L
:增加編譯時(shí)搜索靜態(tài)連接庫(kù)的路徑
-S :把源文件生成匯編代碼文件
-lm:表示標(biāo)準(zhǔn)庫(kù)的目錄中名為libm.a的函數(shù)庫(kù)
-lpthread
:連接NPTL實(shí)現(xiàn)的線程庫(kù)
-std=
:用于指定把使用的C語(yǔ)言的版本
# 例如:
#
把源文件test.c按照c99標(biāo)準(zhǔn)編譯成可執(zhí)行程序test
gcc -o test
test.c -lm -std=c99
#把源文件test.c轉(zhuǎn)換為相應(yīng)的匯編程序源文件test.s
gcc -S test.c
20、time命令
該命令用于測(cè)算一個(gè)命令(即程序)的執(zhí)行時(shí)間。它的使用非常簡(jiǎn)單,就像平時(shí)輸入命令一樣,不過在命令的前面加入一個(gè)time即可,例如:
time ./process
time ps aux
在程序或命令運(yùn)行結(jié)束后,在最后輸出了三個(gè)時(shí)間,它們分別是:
user:用戶CPU時(shí)間,命令執(zhí)行完成花費(fèi)的用戶CPU時(shí)間,即命令在用戶態(tài)中執(zhí)行時(shí)間總和;
system:系統(tǒng)CPU時(shí)間,命令執(zhí)行完成花費(fèi)的系統(tǒng)CPU時(shí)間,即命令在核心態(tài)中執(zhí)行時(shí)間總和;
real:實(shí)際時(shí)間,從command命令行開始執(zhí)行到運(yùn)行終止的消逝時(shí)間;
來自 ;
#!/bin/bash
while [ true ] ; do
netstat -an|grep LISTEN /tmp/temp.log
tail -s 1 /tmp/temp.log
done
這個(gè)是一個(gè)小小的sell腳本每一秒刷新一次信息,可以自己修改時(shí)間不過1秒時(shí)間比較恰當(dāng)?shù)?,時(shí)間太少會(huì)增加cpu的占用率的。
#!/bin/bash
while [ true ] ; do
netstat -an|grep LISTEN | tail -s 1
done
其實(shí)我還是覺得這個(gè)比較的精煉,直接使用管道符來輸出,這樣不用讀寫硬盤,減輕系統(tǒng)的負(fù)擔(dān)。
通過執(zhí)行以下命令,可以在1分鐘內(nèi)對(duì)系統(tǒng)資源使用情況有個(gè)大致的了解。
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top
其中一些命令需要安裝sysstat包,有一些由procps包提供。這些命令的輸出,有助于快速定位性能瓶頸,檢查出所有資源(CPU、內(nèi)存、磁盤IO等)的利用率(utilization)、飽和度(saturation)和錯(cuò)誤(error)度量,也就是所謂的USE方法。
下面我們來逐一介紹下這些命令,有關(guān)這些命令更多的參數(shù)和說明,請(qǐng)參照命令的手冊(cè)。
uptime
$ uptime
23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02
這個(gè)命令可以快速查看機(jī)器的負(fù)載情況。在Linux系統(tǒng)中,這些數(shù)據(jù)表示等待CPU資源的進(jìn)程和阻塞在不可中斷IO進(jìn)程(進(jìn)程狀態(tài)為D)的數(shù)量。這些數(shù)據(jù)可以讓我們對(duì)系統(tǒng)資源使用有一個(gè)宏觀的了解。
命令的輸出分別表示1分鐘、5分鐘、15分鐘的平均負(fù)載情況。通過這三個(gè)數(shù)據(jù),可以了解服務(wù)器負(fù)載是在趨于緊張還是區(qū)域緩解。如果1分鐘平均負(fù)載很高,而15分鐘平均負(fù)載很低,說明服務(wù)器正在命令高負(fù)載情況,需要進(jìn)一步排查CPU資源都消耗在了哪里。反之,如果15分鐘平均負(fù)載很高,1分鐘平均負(fù)載較低,則有可能是CPU資源緊張時(shí)刻已經(jīng)過去。
上面例子中的輸出,可以看見最近1分鐘的平均負(fù)載非常高,且遠(yuǎn)高于最近15分鐘負(fù)載,因此我們需要繼續(xù)排查當(dāng)前系統(tǒng)中有什么進(jìn)程消耗了大量的資源。可以通過下文將會(huì)介紹的vmstat、mpstat等命令進(jìn)一步排查。
dmesg | tail
$ dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP counters.
該命令會(huì)輸出系統(tǒng)日志的最后10行。示例中的輸出,可以看見一次內(nèi)核的oom kill和一次TCP丟包。這些日志可以幫助排查性能問題。千萬(wàn)不要忘了這一步。
vmstat 1
$ vmstat 1
procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
34 0 0 200889792 73708 591828 0 0 0 5 6 10 96 1 3 0 0
32 0 0 200889920 73708 591860 0 0 0 592 13284 4282 98 1 1 0 0
32 0 0 200890112 73708 591860 0 0 0 0 9501 2154 99 1 0 0 0
32 0 0 200889568 73712 591856 0 0 0 48 11900 2459 99 0 0 0 0
32 0 0 200890208 73712 591860 0 0 0 0 15898 4840 98 1 1 0 0
^C
vmstat(8) 命令,每行會(huì)輸出一些系統(tǒng)核心指標(biāo),這些指標(biāo)可以讓我們更詳細(xì)的了解系統(tǒng)狀態(tài)。后面跟的參數(shù)1,表示每秒輸出一次統(tǒng)計(jì)信息,表頭提示了每一列的含義,這幾介紹一些和性能調(diào)優(yōu)相關(guān)的列:
r:等待在CPU資源的進(jìn)程數(shù)。這個(gè)數(shù)據(jù)比平均負(fù)載更加能夠體現(xiàn)CPU負(fù)載情況,數(shù)據(jù)中不包含等待IO的進(jìn)程。如果這個(gè)數(shù)值大于機(jī)器CPU核數(shù),那么機(jī)器的CPU資源已經(jīng)飽和。
free:系統(tǒng)可用內(nèi)存數(shù)(以千字節(jié)為單位),如果剩余內(nèi)存不足,也會(huì)導(dǎo)致系統(tǒng)性能問題。下文介紹到的free命令,可以更詳細(xì)的了解系統(tǒng)內(nèi)存的使用情況。
si, so:交換區(qū)寫入和讀取的數(shù)量。如果這個(gè)數(shù)據(jù)不為0,說明系統(tǒng)已經(jīng)在使用交換區(qū)(swap),機(jī)器物理內(nèi)存已經(jīng)不足。
us, sy, id, wa, st:這些都代表了CPU時(shí)間的消耗,它們分別表示用戶時(shí)間(user)、系統(tǒng)(內(nèi)核)時(shí)間(sys)、空閑時(shí)間(idle)、IO等待時(shí)間(wait)和被偷走的時(shí)間(stolen,一般被其他虛擬機(jī)消耗)。
上述這些CPU時(shí)間,可以讓我們很快了解CPU是否出于繁忙狀態(tài)。一般情況下,如果用戶時(shí)間和系統(tǒng)時(shí)間相加非常大,CPU出于忙于執(zhí)行指令。如果IO等待時(shí)間很長(zhǎng),那么系統(tǒng)的瓶頸可能在磁盤IO。
示例命令的輸出可以看見,大量CPU時(shí)間消耗在用戶態(tài),也就是用戶應(yīng)用程序消耗了CPU時(shí)間。這不一定是性能問題,需要結(jié)合r隊(duì)列,一起分析。
mpstat -P ALL 1
$ mpstat -P ALL 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
07:38:49 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:38:50 PM all 98.47 0.00 0.75 0.00 0.00 0.00 0.00 0.00 0.00 0.78
07:38:50 PM 0 96.04 0.00 2.97 0.00 0.00 0.00 0.00 0.00 0.00 0.99
07:38:50 PM 1 97.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00
07:38:50 PM 2 98.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00
07:38:50 PM 3 96.97 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 3.03
[...]
該命令可以顯示每個(gè)CPU的占用情況,如果有一個(gè)CPU占用率特別高,那么有可能是一個(gè)單線程應(yīng)用程序引起的。
pidstat 1
$ pidstat 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
07:41:02 PM UID PID %usr %system %guest %CPU CPU Command
07:41:03 PM 0 9 0.00 0.94 0.00 0.94 1 rcuos/0
07:41:03 PM 0 4214 5.66 5.66 0.00 11.32 15 mesos-slave
07:41:03 PM 0 4354 0.94 0.94 0.00 1.89 8 java
07:41:03 PM 0 6521 1596.23 1.89 0.00 1598.11 27 java
07:41:03 PM 0 6564 1571.70 7.55 0.00 1579.25 28 java
07:41:03 PM 60004 60154 0.94 4.72 0.00 5.66 9 pidstat
07:41:03 PM UID PID %usr %system %guest %CPU CPU Command
07:41:04 PM 0 4214 6.00 2.00 0.00 8.00 15 mesos-slave
07:41:04 PM 0 6521 1590.00 1.00 0.00 1591.00 27 java
07:41:04 PM 0 6564 1573.00 10.00 0.00 1583.00 28 java
07:41:04 PM 108 6718 1.00 0.00 0.00 1.00 0 snmp-pass
07:41:04 PM 60004 60154 1.00 4.00 0.00 5.00 9 pidstat
^C
pidstat命令輸出進(jìn)程的CPU占用率,該命令會(huì)持續(xù)輸出,并且不會(huì)覆蓋之前的數(shù)據(jù),可以方便觀察系統(tǒng)動(dòng)態(tài)。如上的輸出,可以看見兩個(gè)JAVA進(jìn)程占用了將近1600%的CPU時(shí)間,既消耗了大約16個(gè)CPU核心的運(yùn)算資源。
iostat -xz 1
$ iostat -xz 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
73.96 0.00 3.73 0.03 0.06 22.21
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
xvda 0.00 0.23 0.21 0.18 4.52 2.08 34.37 0.00 9.98 13.80 5.42 2.44 0.09
xvdb 0.01 0.00 1.02 8.94 127.97 598.53 145.79 0.00 0.43 1.78 0.28 0.25 0.25
xvdc 0.01 0.00 1.02 8.86 127.79 595.94 146.50 0.00 0.45 1.82 0.30 0.27 0.26
dm-0 0.00 0.00 0.69 2.32 10.47 31.69 28.01 0.01 3.23 0.71 3.98 0.13 0.04
dm-1 0.00 0.00 0.00 0.94 0.01 3.78 8.00 0.33 345.84 0.04 346.81 0.01 0.00
dm-2 0.00 0.00 0.09 0.07 1.35 0.36 22.50 0.00 2.55 0.23 5.62 1.78 0.03
[...]
^C
iostat命令主要用于查看機(jī)器磁盤IO情況。該命令輸出的列,主要含義是:
r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數(shù)和每秒讀寫數(shù)據(jù)量(千字節(jié))。讀寫量過大,可能會(huì)引起性能問題。
await:IO操作的平均等待時(shí)間,單位是毫秒。這是應(yīng)用程序在和磁盤交互時(shí),需要消耗的時(shí)間,包括IO等待和實(shí)際操作的耗時(shí)。如果這個(gè)數(shù)值過大,可能是硬件設(shè)備遇到了瓶頸或者出現(xiàn)故障。
avgqu-sz:向設(shè)備發(fā)出的請(qǐng)求平均數(shù)量。如果這個(gè)數(shù)值大于1,可能是硬件設(shè)備已經(jīng)飽和(部分前端硬件設(shè)備支持并行寫入)。
%util:設(shè)備利用率。這個(gè)數(shù)值表示設(shè)備的繁忙程度,經(jīng)驗(yàn)值是如果超過60,可能會(huì)影響IO性能(可以參照IO操作平均等待時(shí)間)。如果到達(dá)100%,說明硬件設(shè)備已經(jīng)飽和。
如果顯示的是邏輯設(shè)備的數(shù)據(jù),那么設(shè)備利用率不代表后端實(shí)際的硬件設(shè)備已經(jīng)飽和。值得注意的是,即使IO性能不理想,也不一定意味這應(yīng)用程序性能會(huì)不好,可以利用諸如預(yù)讀取、寫緩存等策略提升應(yīng)用性能。
free –m
$ free -m
total used free shared buffers cached
Mem: 245998 24545 221453 83 59 541
-/+ buffers/cache: 23944 222053
Swap: 0 0 0
free命令可以查看系統(tǒng)內(nèi)存的使用情況,-m參數(shù)表示按照兆字節(jié)展示。最后兩列分別表示用于IO緩存的內(nèi)存數(shù),和用于文件系統(tǒng)頁(yè)緩存的內(nèi)存數(shù)。需要注意的是,第二行-/+ buffers/cache,看上去緩存占用了大量?jī)?nèi)存空間。這是Linux系統(tǒng)的內(nèi)存使用策略,盡可能的利用內(nèi)存,如果應(yīng)用程序需要內(nèi)存,這部分內(nèi)存會(huì)立即被回收并分配給應(yīng)用程序。因此,這部分內(nèi)存一般也被當(dāng)成是可用內(nèi)存。
如果可用內(nèi)存非常少,系統(tǒng)可能會(huì)動(dòng)用交換區(qū)(如果配置了的話),這樣會(huì)增加IO開銷(可以在iostat命令中提現(xiàn)),降低系統(tǒng)性能。
sar -n DEV 1
$ sar -n DEV 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
12:16:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:49 AM eth0 18763.00 5032.00 20686.42 478.30 0.00 0.00 0.00 0.00
12:16:49 AM lo 14.00 14.00 1.36 1.36 0.00 0.00 0.00 0.00
12:16:49 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
12:16:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:50 AM eth0 19763.00 5101.00 21999.10 482.56 0.00 0.00 0.00 0.00
12:16:50 AM lo 20.00 20.00 3.25 3.25 0.00 0.00 0.00 0.00
12:16:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
^C
sar命令在這里可以查看網(wǎng)絡(luò)設(shè)備的吞吐率。在排查性能問題時(shí),可以通過網(wǎng)絡(luò)設(shè)備的吞吐量,判斷網(wǎng)絡(luò)設(shè)備是否已經(jīng)飽和。如示例輸出中,eth0網(wǎng)卡設(shè)備,吞吐率大概在22 Mbytes/s,既176 Mbits/sec,沒有達(dá)到1Gbit/sec的硬件上限。
sar -n TCP,ETCP 1
$ sar -n TCP,ETCP 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
12:17:19 AM active/s passive/s iseg/s oseg/s
12:17:20 AM 1.00 0.00 10233.00 18846.00
12:17:19 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
12:17:20 AM 0.00 0.00 0.00 0.00 0.00
12:17:20 AM active/s passive/s iseg/s oseg/s
12:17:21 AM 1.00 0.00 8359.00 6039.00
12:17:20 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
12:17:21 AM 0.00 0.00 0.00 0.00 0.00
^C
sar命令在這里用于查看TCP連接狀態(tài),其中包括:
active/s:每秒本地發(fā)起的TCP連接數(shù),既通過connect調(diào)用創(chuàng)建的TCP連接;
passive/s:每秒遠(yuǎn)程發(fā)起的TCP連接數(shù),即通過accept調(diào)用創(chuàng)建的TCP連接;
retrans/s:每秒TCP重傳數(shù)量;
TCP連接數(shù)可以用來判斷性能問題是否由于建立了過多的連接,進(jìn)一步可以判斷是主動(dòng)發(fā)起的連接,還是被動(dòng)接受的連接。TCP重傳可能是因?yàn)榫W(wǎng)絡(luò)環(huán)境惡劣,或者服務(wù)器壓力過大導(dǎo)致丟包。
top
$ top
top - 00:15:40 up 21:56, 1 user, load average: 31.09, 29.87, 29.92
Tasks: 871 total, 1 running, 868 sleeping, 0 stopped, 2 zombie
%Cpu(s): 96.8 us, 0.4 sy, 0.0 ni, 2.7 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 25190241+total, 24921688 used, 22698073+free, 60448 buffers
KiB Swap: 0 total, 0 used, 0 free. 554208 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20248 root 20 0 0.227t 0.012t 18748 S 3090 5.2 29812:58 java
4213 root 20 0 2722544 64640 44232 S 23.5 0.0 233:35.37 mesos-slave
66128 titancl+ 20 0 24344 2332 1172 R 1.0 0.0 0:00.07 top
5235 root 20 0 38.227g 547004 49996 S 0.7 0.2 2:02.74 java
4299 root 20 0 20.015g 2.682g 16836 S 0.3 1.1 33:14.42 java
1 root 20 0 33620 2920 1496 S 0.0 0.0 0:03.82 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:05.35 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:06.94 kworker/u256:0
8 root 20 0 0 0 0 S 0.0 0.0 2:38.05 rcu_sched
top命令包含了前面好幾個(gè)命令的檢查的內(nèi)容。比如系統(tǒng)負(fù)載情況(uptime)、系統(tǒng)內(nèi)存使用情況(free)、系統(tǒng)CPU使用情況(vmstat)等。因此通過這個(gè)命令,可以相對(duì)全面的查看系統(tǒng)負(fù)載的來源。同時(shí),top命令支持排序,可以按照不同的列排序,方便查找出諸如內(nèi)存占用最多的進(jìn)程、CPU占用率最高的進(jìn)程等。
但是,top命令相對(duì)于前面一些命令,輸出是一個(gè)瞬間值,如果不持續(xù)盯著,可能會(huì)錯(cuò)過一些線索。這時(shí)可能需要暫停top命令刷新,來記錄和比對(duì)數(shù)據(jù)。
總結(jié)
排查L(zhǎng)inux服務(wù)器性能問題還有很多工具,上面介紹的一些命令,可以幫助我們快速的定位問題。例如前面的示例輸出,多個(gè)證據(jù)證明有JAVA進(jìn)程占用了大量CPU資源,之后的性能調(diào)優(yōu)就可以針對(duì)應(yīng)用程序進(jìn)行。
1、編寫一個(gè)shell腳本,在腳本中編寫循環(huán)執(zhí)行的代碼(可以是死循環(huán)),然后在linux上運(yùn)行這個(gè)腳本即可。
2、可以把這個(gè)腳本在當(dāng)前運(yùn)行,也可以讓這個(gè)腳本在后臺(tái)運(yùn)行。
3、當(dāng)前運(yùn)行的腳本如果要kill掉的話,可以直接ctrl+c;后臺(tái)運(yùn)行的腳本要kill掉的話,可以PS查看進(jìn)程ID號(hào),然后執(zhí)行“kill 進(jìn)程ID”命令即可。