【linux】关于分析系统问题的前几分钟
為了解決性能問題,你登入了一臺Linux服務(wù)器,在最開始的一分鐘內(nèi)需要查看什么?你可以在幾分鐘內(nèi)就對系統(tǒng)資源的使用情況和進(jìn)程的運(yùn)行狀況有大體上的了解。無非是先查看錯誤信息和飽和指標(biāo),再看下資源的使用量
1、之前發(fā)生了什么
[root@localhost ~]# history1 2015-12-11_21:35:16 htop2 2015-12-11_21:35:19 df -h3 2015-12-11_21:35:25 cd /data/backup/4 2015-12-11_21:35:26 ll查看一下之前服務(wù)器上執(zhí)行過的命令。看一下總是沒錯的,可以通過HISTTIMEFORMAT來設(shè)置一下命令的執(zhí)行時間
2、用戶狀態(tài)
[root@localhost ~]# last -6 test pts/0 192.168.1.57 Fri Dec 11 21:35 still logged in test pts/0 192.168.1.57 Fri Dec 11 18:24 - 18:24 (00:00) test pts/3 192.168.1.57 Fri Dec 11 18:14 - 18:14 (00:00) test pts/3 192.168.1.57 Fri Dec 11 18:13 - 18:14 (00:00) test pts/0 192.168.1.57 Fri Dec 11 18:02 - 18:14 (00:11) test pts/0 192.168.1.57 Fri Dec 11 17:29 - 17:29 (00:00) [root@localhost ~]# w21:42:20 up 284 days, 6:12, 1 user, load average: 0.27, 0.23, 0.19 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT test pts/0 192.168.1.57 21:35 0.00s 0.02s 0.00s sshd: test [priv]用這個命令看看都有誰在線,有哪些用戶訪問過
3. 服務(wù)器的運(yùn)行狀態(tài)
$ uptime $ top $ htop $ free -m $ df -h- 查看服務(wù)器最大的負(fù)載來自什么地方、 平均負(fù)載是多少
- 查看服務(wù)器還有空余的內(nèi)存嗎,是否正在內(nèi)存和硬盤之間進(jìn)行swap
- 查看還有剩余的CPU嗎, 是否有某些CPU核負(fù)載過多了
- 查看服務(wù)器上磁盤是不是滿了
4、服務(wù)器的進(jìn)程
[root@localhost ~]# pstree -a [root@localhost ~]# ps aux [root@localhost ~]# htop服務(wù)器在運(yùn)行什么進(jìn)程,php-fpm、nginx、cron等
5、系統(tǒng)日志和內(nèi)核消息
[root@localhost ~]# dmesg | tail [root@localhost ~]# less /var/log/messages [root@localhost ~]# less /var/log/secure [root@localhost ~]# less /var/log/auth- 查看系統(tǒng)信息,已經(jīng)導(dǎo)致性能問題的錯誤信息。比如看看是不是很多關(guān)于連接數(shù)過多導(dǎo)致
- 看看是否有硬件錯誤或文件系統(tǒng)錯誤
- 分析是否能將這些錯誤事件和前面發(fā)現(xiàn)的疑點(diǎn)進(jìn)行時間上的比對
6、網(wǎng)絡(luò)連接和負(fù)載
[root@localhost ~]# ss [root@localhost ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' [root@localhost ~]# netstat -antlp|grep 'ESTAB' | wc -l [root@localhost ~]# netstat -antlp|grep 'ESTAB'|awk '{print $5}'|awk -F: '{print $1}'|sort |uniq -c|sort -rn -k 1 [root@localhost ~]# sar -n DEV 1 10 [root@localhost ~]# sar -n TCP,ETCP 1 10 [root@localhost ~]# netstat -nxlp [root@localhost ~]# netstat -nulp [root@localhost ~]# netstat -ntlp這些命令基本上夠了,ss響應(yīng)速度比netstat快很多
查看各個監(jiān)聽端口,以及服務(wù)
查看 TIME_WAIT、CLOSE_WAIT等是否過多從而導(dǎo)致服務(wù)器運(yùn)行緩慢,或者是不是服務(wù)器遭受到syn flood攻擊
sar -n DEV 1 10?可以用于檢查網(wǎng)絡(luò)流量的工作負(fù)載:rxkB/s和txkB/s,以及它是否達(dá)到限額
sar -n TCP,ETCP 1 10?顯示一些關(guān)鍵TCP指標(biāo)的匯總。其中包括:
- active/s:本地每秒創(chuàng)建的TCP連接數(shù)(比如concept()創(chuàng)建的)
- passive/s:遠(yuǎn)程每秒創(chuàng)建的TCP連接數(shù)(比如accept()創(chuàng)建的)
- retrans/s:每秒TCP重傳次數(shù)
- 主動連接數(shù)(active)和被動連接數(shù)(passive)通常可以用來粗略地描述系統(tǒng)負(fù)載。可以認(rèn)為主動連接是對外的,而被動連接是對內(nèi)的,雖然嚴(yán)格來說不完全是這個樣子。(比如,一個從localhost到localhost的連接)
7、查看內(nèi)存、CPU以及IO的使用情況
vmstat
$ 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虛擬內(nèi)存原理
在系統(tǒng)中運(yùn)行的每個進(jìn)程都需要使用到內(nèi)存,但不是每個進(jìn)程都需要每時每刻使用系統(tǒng)分配的內(nèi)存空間。當(dāng)系統(tǒng)運(yùn)行所需內(nèi)存超過實際的物理內(nèi)存,內(nèi)核會釋放某些進(jìn)程所占用但未使用的部分或所有物理內(nèi)存,將這部分資料存儲在磁盤上直到進(jìn)程下一次調(diào)用,并將釋放出的內(nèi)存提供給有需要的進(jìn)程使用。
在Linux內(nèi)存管理中,主要是通過“調(diào)頁P(yáng)aging”和“交換Swapping”來完成上述的內(nèi)存調(diào)度。調(diào)頁算法是將內(nèi)存中最近不常使用的頁面換到磁盤上,把活動頁面保留在內(nèi)存中供進(jìn)程使用。交換技術(shù)是將整個進(jìn)程,而不是部分頁面,全部交換到磁盤上。
分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到內(nèi)存的過程被稱作Page-In。當(dāng)內(nèi)核需要一個分頁時,但發(fā)現(xiàn)此分頁不在物理內(nèi)存中(因為已經(jīng)被Page-Out了),此時就發(fā)生了分頁錯誤(Page Fault)。
當(dāng)系統(tǒng)內(nèi)核發(fā)現(xiàn)可運(yùn)行內(nèi)存變少時,就會通過Page-Out來釋放一部分物理內(nèi)存。盡管Page-Out不是經(jīng)常發(fā)生,但是如果Page-out頻繁不斷的發(fā)生,直到當(dāng)內(nèi)核管理分頁的時間超過運(yùn)行程式的時間時,系統(tǒng)效能會急劇下降。這時的系統(tǒng)已經(jīng)運(yùn)行非常慢或進(jìn)入暫停狀態(tài),這種狀態(tài)亦被稱作thrashing(顛簸)
vmstat?的含義為虛擬內(nèi)存狀態(tài)(“Viryual Memor Statics”),但是它可以報告關(guān)于進(jìn)程、內(nèi)存、I/O等系統(tǒng)整體運(yùn)行狀態(tài)。
指定1作為vmstat的輸入?yún)?shù),它會輸出每一秒內(nèi)的統(tǒng)計結(jié)果
Procs(進(jìn)程) r: 運(yùn)行隊列中進(jìn)程數(shù)量,這個值也可以判斷是否需要增加CPU。(長期大于1) b: 等待IO的進(jìn)程數(shù)量。Memory(內(nèi)存) swpd: 使用虛擬內(nèi)存大小,如果swpd的值不為0,但是SI,SO的值長期為0,這種情況不會影響系統(tǒng)性能。 free: 空閑物理內(nèi)存大小。 buff: 用作緩沖的內(nèi)存大小。 cache: 用作緩存的內(nèi)存大小,如果cache的值大的時候,說明cache處的文件數(shù)多,如果頻繁訪問到的文件都能被cache處,那么磁盤的讀IO bi會非常小。Swap si: 每秒從交換區(qū)寫到內(nèi)存的大小,由磁盤調(diào)入內(nèi)存。 so: 每秒寫入交換區(qū)的內(nèi)存大小,由內(nèi)存調(diào)入磁盤。 注意:內(nèi)存夠用的時候,這2個值都是0,如果這2個值長期大于0時,系統(tǒng)性能會受到影響,磁盤IO和CPU資源都會被消耗。有些朋友看到空閑內(nèi)存(free)很少的或接近于0時,就認(rèn)為內(nèi)存不夠用了,不能光看這一點(diǎn),還要結(jié)合si和so,如果free很少,但是si和so也很少(大多時候是0),那么不用擔(dān)心,系統(tǒng)性能這時不會受到影響的。IO(現(xiàn)在的Linux版本塊的大小為1kb) bi: 每秒讀取的塊數(shù) bo: 每秒寫入的塊數(shù) 注意:隨機(jī)磁盤讀寫的時候,這2個值越大(如超出1024k),能看到CPU在IO等待的值也會越大。system(系統(tǒng)) in: 每秒中斷數(shù),包括時鐘中斷。 cs: 每秒上下文切換數(shù)。 注意:上面2個值越大,會看到由內(nèi)核消耗的CPU時間會越大。CPU(以百分比表示) us: 用戶進(jìn)程執(zhí)行時間百分比(user time),us的值比較高時,說明用戶進(jìn)程消耗的CPU時間多,但是如果長期超50%的使用,那么我們就該考慮優(yōu)化程序算法或者進(jìn)行加速。 sy: 內(nèi)核系統(tǒng)進(jìn)程執(zhí)行時間百分比(system time) sy的值高時,說明系統(tǒng)內(nèi)核消耗的CPU資源多,這并不是良性表現(xiàn),我們應(yīng)該檢查原因。 wa: IO等待時間百分比,wa的值高時,說明IO等待比較嚴(yán)重,這可能由于磁盤大量作隨機(jī)訪問造成,也有可能磁盤出現(xiàn)瓶頸(塊操作)。 id: 空閑時間百分比 st:被其它租戶,或者是租戶自己的Xen隔離設(shè)備驅(qū)動域(isolated driver domain),所占用的時間通過相加us和sy的百分比,你可以確定CPU是否處于忙碌狀態(tài)。一個持續(xù)不變的wait I/O意味著瓶頸在硬盤上,這種情況往往伴隨著CPU的空閑,因為任務(wù)都卡在磁盤I/O上了。你可以把wait I/O當(dāng)作CPU空閑的另一種形式,它額外給出了CPU空閑的線索。
I/O處理同樣會消耗系統(tǒng)時間。一個高于20%的平均系統(tǒng)時間,往往值得進(jìn)一步發(fā)掘:也許系統(tǒng)花在I/O的時太長了。
在上面的例子中,CPU基本把時間花在用戶態(tài)里面,意味著跑在上面的應(yīng)用占用了大部分時間。檢查下“r”列,看看是否飽和了
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 [...]- %user 在internal時間段里,用戶態(tài)的CPU時間(%),不包含nice值為負(fù)進(jìn)程 (usr/total)*100
- %nice 在internal時間段里,nice值為負(fù)進(jìn)程的CPU時間(%) (nice/total)*100
- %sys 在internal時間段里,內(nèi)核時間(%) (system/total)*100
- %iowait 在internal時間段里,硬盤IO等待時間(%) (iowait/total)*100
- %irq 在internal時間段里,硬中斷時間(%) (irq/total)*100
- %soft 在internal時間段里,軟中斷時間(%) (softirq/total)*100
- %idle 在internal時間段里,CPU除去等待磁盤IO操作外的因為任何原因而空閑的時間閑置時間(%) (idle/total)*100
mpstat是Multiprocessor Statistics的縮寫,是實時系統(tǒng)監(jiān)控工具。其報告與CPU的一些統(tǒng)計信息,這些信息存放在/proc/stat文件中。在多CPUs系統(tǒng)里,其不但能查看所有CPU的平均狀況信息,而且能夠查看特定CPU的信息。
mpstat最大的特點(diǎn)是:可以查看多核心cpu中每個計算核心的統(tǒng)計數(shù)據(jù);而類似工具vmstat只能查看系統(tǒng)整體cpu情況,還可以顯示每個CPU的時間使用百分比,你可以用它來檢查CPU是否存在負(fù)載不均衡。單個過于忙碌的CPU可能意味著整個應(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 pidstat07: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 pidstatpidstat主要用于監(jiān)控全部或指定進(jìn)程占用系統(tǒng)資源的情況,如CPU,內(nèi)存、設(shè)備IO、任務(wù)切換、線程等。pidstat首次運(yùn)行時顯示自系統(tǒng)啟動開始的各項統(tǒng)計信息,之后運(yùn)行pidstat將顯示自上次運(yùn)行該命令以后的統(tǒng)計信息。用戶可以通過指定統(tǒng)計的次數(shù)和時間來獲得所需的統(tǒng)計信息
上面的例子表明,CPU主要消耗在兩個java進(jìn)程上。%CPU列是在各個CPU上的使用量的總和;1591%意味著java進(jìn)程消耗了將近16個CPU
比如常用的pidstat命令
pidstat -u 1 //cpu pidstat -r 1 //mem pidstat -d 1 //io以上命令以1秒為信息采集周期,分別獲取cpu、內(nèi)存和磁盤IO的統(tǒng)計信息
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 %idle73.96 0.00 3.73 0.03 0.06 22.21Device: 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 [...]這個命令可以弄清塊設(shè)備(磁盤)的狀況,包括工作負(fù)載和處理性能。注意以下各項:
- r/s,w/s,rkB/s,wkB/s:分別表示每秒設(shè)備讀次數(shù),寫次數(shù),讀的KB數(shù),寫的KB數(shù)。它們描述了磁盤的工作負(fù)載。也許性能問題就是由過高的負(fù)載所造成的。
- await:I/O平均時間,以毫秒作單位。它是應(yīng)用中I/O處理所實際消耗的時間,因為其中既包括排隊用時也包括處理用時。如果它比預(yù)期的大,就意味著設(shè)備飽和了,或者設(shè)備出了問題。
- avgqu-sz:分配給設(shè)備的平均請求數(shù)。大于1表示設(shè)備已經(jīng)飽和了。(不過有些設(shè)備可以并行處理請求,比如由多個磁盤組成的虛擬設(shè)備)
- %util:設(shè)備使用率。這個值顯示了設(shè)備每秒內(nèi)工作時間的百分比,一般都處于高位。低于60%通常是低性能的表現(xiàn)(也可以從await中看出),不過這個得看設(shè)備的類型。接近100%通常意味著飽和。
如果某個存儲設(shè)備是由多個物理磁盤組成的邏輯磁盤設(shè)備,100%的使用率可能只是意味著I/O占用
請牢記于心,disk I/O性能低不一定是個問題。應(yīng)用的I/O往往是異步的(比如預(yù)讀(read-ahead)和寫緩沖(buffering for writes)),所以不一定會被阻塞并遭受延遲。
free -m
$ free -mtotal used free shared buffers cached Mem: 245998 24545 221453 83 59 541 -/+ buffers/cache: 23944 222053 Swap: 0 0 0- buffers:用于塊設(shè)備I/O的緩沖區(qū)緩存
- cached:用于文件系統(tǒng)的頁緩存
它們的值接近于0時,往往導(dǎo)致較高的磁盤I/O(可以通過iostat確認(rèn))和糟糕的性能。上面的例子里沒有這個問題,每一列都有好幾M呢。
比起第一行,-/+ buffers/cache提供的內(nèi)存使用量會更加準(zhǔn)確些。Linux會把暫時用不上的內(nèi)存用作緩存,一旦應(yīng)用需要的時候立刻重新分配給它。所以部分被用作緩存的內(nèi)存其實也算是空閑內(nèi)存,第二行以此修訂了實際的內(nèi)存使用量
如果你在Linux上安裝了ZFS,正如我們在一些服務(wù)上所做的,這一點(diǎn)會變得更加迷惑,因為ZFS它自己的文件系統(tǒng)緩存不算入free -m。有時系統(tǒng)看上去已經(jīng)沒有多少空閑內(nèi)存可用了,其實內(nèi)存都待在ZFS的緩存里呢。
lsof -a -u root -d txt
lsof 是 linux 下的一個非常實用的系統(tǒng)級的監(jiān)控、診斷工具。它的意思是 List Open Files,很容易你就記住了它是 “l(fā)s + of”的組合~它可以用來列出被各種進(jìn)程打開的文件信息,記住:linux 下 “一切皆文件”,包括但不限于 pipes, sockets, directories, devices, 等等。因此,使用 lsof,你可以獲取任何被打開文件的各種信息。只需輸入 lsof 就可以生成大量的信息,因為 lsof 需要訪問核心內(nèi)存和各種文件,所以必須以 root 用戶的身份運(yùn)行它才能夠充分地發(fā)揮其功能
[root@localhost ~]# lsof -u www -c nginx COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 7407 root cwd DIR 202,1 4096 128 / nginx 7407 root rtd DIR 202,1 4096 128 / nginx 7407 root txt REG 202,1 6694801 100963532 /usr/sbin/nginx nginx 7407 root DEL REG 0,4 1142022948 /dev/zero nginx 7407 root DEL REG 0,4 1142022946 /dev/zero nginx 7407 root DEL REG 0,4 1142022945 /dev/zero nginx 7407 root DEL REG 0,4 1142022944 /dev/zero nginx 7407 root mem REG 202,1 65928 67516073 /lib64/libnss_files-2.12.so nginx 7407 root mem REG 202,1 10856 67240493 /usr/lib64/libXau.so.6.0.0 nginx 7407 root mem REG 202,1 122040 67516740 /lib64/libselinux.so.1 nginx 7407 root mem REG 202,1 165264 67516922 /lib64/libexpat.so.1.5.2 nginx 7407 root mem REG 202,1 122520 67251486 /usr/lib64/libxcb.so.1.1.0 nginx 7407 root mem REG 202,1 110960 67516085 /lib64/libresolv-2.12.so nginx 7407 root mem REG 202,1 10192 67295653 /lib64/libkeyutils.so.1.3 nginx 7407 root mem REG 202,1 43728 67516910 /lib64/libkrb5support.so.0.1 nginx 7407 root mem REG 202,1 90880 67151447 /lib64/libgcc_s-4.4.7-20120601.so.1 nginx 7407 root mem REG 202,1 987096 67239461 /usr/lib64/libstdc++.so.6.0.13 nginx 7407 root mem REG 202,1 375687 559315 /usr/local/lib/libunwind.so.8.0.1 nginx 7407 root mem REG 202,1 596272 67516143 /lib64/libm-2.12.so nginx 7407 root mem REG 202,1 155456 67240447 /usr/lib64/libpng12.so.0.49.0 nginx 7407 root mem REG 202,1 642600 67231558 /usr/lib64/libfreetype.so.6.3.22 nginx 7407 root mem REG 202,1 220584 67236392 /usr/lib64/libfontconfig.so.1.4.4 nginx 7407 root mem REG 202,1 262896 67239380 /usr/lib64/libjpeg.so.62.0.0 nginx 7407 root mem REG 202,1 1297928 67150496 /usr/lib64/libX11.so.6.3.0 nginx 7407 root mem REG 202,1 70320 67150499 /usr/lib64/libXpm.so.4.11.0 nginx 7407 root mem REG 202,1 174840 67295675 /lib64/libk5crypto.so.3.1 nginx 7407 root mem REG 202,1 14664 67226162 /lib64/libcom_err.so.2.1 nginx 7407 root mem REG 202,1 941920 67516681 /lib64/libkrb5.so.3.3 nginx 7407 root mem REG 202,1 277704 67516675 /lib64/libgssapi_krb5.so.2.2 nginx 7407 root mem REG 202,1 469528 67226123 /lib64/libfreebl3.so nginx 7407 root mem REG 202,1 1920936 67516136 /lib64/libc-2.12.so nginx 7407 root mem REG 202,1 289777 459327 /usr/local/lib/libprofiler.so.0.3.0 nginx 7407 root mem REG 202,1 898748 1724697 /usr/local/lib/libGeoIP.so.1.4.6 nginx 7407 root mem REG 202,1 272552 67150501 /usr/lib64/libgd.so.2.0.0 nginx 7407 root mem REG 202,1 88600 67226134 /lib64/libz.so.1.2.3 nginx 7407 root mem REG 202,1 1950976 67244040 /usr/lib64/libcrypto.so.1.0.1e nginx 7407 root mem REG 202,1 441112 67244042 /usr/lib64/libssl.so.1.0.1e nginx 7407 root mem REG 202,1 181432 67516701 /lib64/libpcre.so.0.0.1 nginx 7407 root mem REG 202,1 40400 67516139 /lib64/libcrypt-2.12.so nginx 7407 root mem REG 202,1 19536 67516141 /lib64/libdl-2.12.so nginx 7407 root mem REG 202,1 142640 67516083 /lib64/libpthread-2.12.so nginx 7407 root mem REG 202,1 154664 67516128 /lib64/ld-2.12.so nginx 7407 root 0u CHR 1,3 0t0 3866 /dev/null nginx 7407 root 1u CHR 1,3 0t0 3866 /dev/null nginx 7407 root 2w REG 202,1 748837066 33826169 /usr/local/nginx/logs/error.log查看設(shè)備打開的文件
[root@localhost ~]# lsof /dev/xvdb1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php-fpm 7222 root 2w REG 202,17 161403107 262180 /data/logs/error/php-fpm-error.log php-fpm 7222 root 3w REG 202,17 161403107 262180 /data/logs/error/php-fpm-error.log nginx 7407 root 6w REG 202,17 0 262256 /data/logs/error/app.test.com_error.log nginx 8011 www 49r REG 202,17 3762 3166039 /data/www/www.test.com/Common/js/new_header.js nginx 8011 www 50r REG 202,17 33915 2763270 /data/www/bbs.test.com/static/js/home.js nginx 8011 www 51r REG 202,17 8345 3147082 /data/www/www.test.com/Common/js/raty/jquery.raty.min.js nginx 8011 www 53u REG 202,17 4119 2383851 /data/www/bbs.test.com/404.html nginx 8011 www 54r REG 202,17 12030 3146240 /data/www/www.test.com/Common/js/iframeTools.source.js nginx 8011 www 56u REG 202,17 603 2763375 /data/www/bbs.test.com/static/js/logging.js nginx 8011 www 67r REG 202,17 139 2490917 /data/www/www.test.com/index.php nginx 8012 www 4w REG 202,17 350277 262242 /data/logs/access/app.test.com_access.log nginx 8012 www 6w REG 202,17 0 262256 /data/logs/error/app.test.com_error.log nginx 8012 www 7w REG 202,17 5067450 267977 /data/logs/access/bbs.test.com_access.log nginx 8012 www 8w REG 202,17 55522 262497 /data/logs/error/bbs.test.com_error.log nginx 8012 www 10w REG 202,17 0 267978 /data/logs/access/edu.test.com_access.log nginx 8012 www 11w REG 202,17 2480 262277 /data/logs/error/edu.test.com_error.log nginx 8012 www 12w REG 202,17 4634491 267979 /data/logs/access/www.test.com_access.log nginx 8012 www 13w REG 202,17 63323232 262257 /data/logs/error/www.test.com_error.log nginx 8012 www 15w REG 202,17 718 267980 /data/logs/access/tyb.test.com_access.log nginx 8012 www 17w REG 202,17 0 262258 /data/logs/error/tyb.test.com_error.log nginx 8012 www 25w REG 202,17 0 2386258 /data/www/tmp/tcmalloc.8012 php-fpm 18179 www cwd DIR 202,17 4096 2400257 /data/www/bbs.test.com bash 18367 root 255r REG 202,17 1303 2097160 /data/scripts/backup.sh php-fpm 18406 www cwd DIR 202,17 4096 2400257 /data/www/bbs.test.com gzip 18445 root 1w REG 202,17 0 10485795 /data/backup/db/rbc/rbc2014_test_2015_12_12_00.sql.gz8、定時任務(wù)
[root@localhost ~]# ls /etc/cron* [root@localhost ~]# for user in $(cat /etc/passwd | cut -f1 -d:); do crontab -l -u $user; done- 是否有某個定時任務(wù)運(yùn)行過于頻繁?
- 是否有些用戶提交了隱藏的定時任務(wù)?
- 在出現(xiàn)故障的時候,是否正好有某個備份任務(wù)在執(zhí)行?
9、內(nèi)核、中斷
[root@localhost ~]# sysctl -a | grep [root@localhost ~]# cat /proc/interrupts [root@localhost ~]# cat /proc/net/ip_conntrack- 你的中斷請求是否是均衡地分配給CPU處理,還是會有某個CPU的核因為大量的網(wǎng)絡(luò)中斷請求或者RAID請求而過載了?
- SWAP交換的設(shè)置是什么?對于工作站來說swappinness 設(shè)為 60 就很好, 不過對于服務(wù)器就太糟了:你最好永遠(yuǎn)不要讓服務(wù)器做SWAP交換,不然對磁盤的讀寫會鎖死SWAP進(jìn)程。
- conntrack_max 是否設(shè)的足夠大,能應(yīng)付你服務(wù)器的流量?
- 在不同狀態(tài)下(TIME_WAIT, …)TCP連接時間的設(shè)置是怎樣的?
- 如果要顯示所有存在的連接,netstat 會比較慢, 你可以先用 ss 看一下總體情況。
10、系統(tǒng)掛載
[root@localhost ~]# mount [root@localhost ~]# cat /etc/fstab [root@localhost ~]# df -h [root@localhost ~]# lsof +D /data/test- 一共掛載了多少文件系統(tǒng)?
- 有沒有某個服務(wù)專用的文件系統(tǒng)? (比如MySQL?)
- 文件系統(tǒng)的掛載選項是什么: noatime? default? 有沒有文件系統(tǒng)被重新掛載為只讀模式了?
- 磁盤空間是否還有剩余?
- 是否有大文件被刪除但沒有清空?
- 如果磁盤空間有問題,你是否還有空間來擴(kuò)展一個分區(qū)?
11、應(yīng)用系統(tǒng)日志
這里邊可分析的東西就多了, 不過恐怕你作為運(yùn)維人員是沒功夫去仔細(xì)研究它的。關(guān)注那些明顯的問題,比如在一個典型的LAMP(Linux+Apache+Mysql+Perl)應(yīng)用環(huán)境里:
- Apache & Nginx; 查找訪問和錯誤日志, 直接找 5xx 錯誤, 再看看是否有 limit_zone 錯誤。
- MySQL; 在mysql.log找錯誤消息,看看有沒有結(jié)構(gòu)損壞的表, 是否有innodb修復(fù)進(jìn)程在運(yùn)行,是否有disk/index/query 問題.
- PHP-FPM; 如果設(shè)定了 php-slow 日志, 直接找錯誤信息 (php, mysql, memcache, …),如果沒設(shè)定,趕緊設(shè)定。
- Varnish; 在varnishlog 和 varnishstat 里, 檢查 hit/miss比. 看看配置信息里是否遺漏了什么規(guī)則,使最終用戶可以直接攻擊你的后端?
- HA-Proxy; 后端的狀況如何?健康狀況檢查是否成功?是前端還是后端的隊列大小達(dá)到最大值了?
?
分享一張來自網(wǎng)絡(luò)上的圖片
?
參考文章
https://github.com/spacewander/blogWithMarkdown/issues/36
http://www.cnetsec.com/article/12858.html
https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/
http://techblog.netflix.com/2015/11/linux-performance-analysis-in-60s.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/chenpingzhao/p/5038598.html
總結(jié)
以上是生活随笔為你收集整理的【linux】关于分析系统问题的前几分钟的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql常用命令详解
- 下一篇: 搜索打表大找规律 (hdu2045)