自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何有效的在 60 秒內(nèi)進行 Linux 服務(wù)器性能故障分析

系統(tǒng) Linux
在 60 秒內(nèi),您可以通過運行以下十個命令,對系統(tǒng)資源使用情況和正在運行的進程有一個高層次的了解。尋找錯誤和飽和度指標(biāo),因為它們都很容易解釋,然后是資源利用率。

[[418268]]

掌握一些性能優(yōu)化工具和方法,這就需要在工作中不斷地積累;計算機基礎(chǔ)知識很重要,比如說網(wǎng)絡(luò)知識、操作系統(tǒng)知識等等,掌握了基礎(chǔ)知識才能讓你在優(yōu)化過程中抓住性能問題的關(guān)鍵,也能在性能優(yōu)化過程中游刃有余。

雖然監(jiān)控工具可以幫助我們解決大多數(shù)問題,但我們有時需要登錄實例并運行一些標(biāo)準(zhǔn)的 Linux 性能工具。

來看 Netflix 性能工程團隊的這篇博文:https://netflixtechblog.com/linux-performance-analysis-in-60-000-milliseconds-accc10403c55

看他們通過十條命令在一分鐘內(nèi)對機器性能問題進行診斷。在 60 秒內(nèi),您可以通過運行以下十個命令,對系統(tǒng)資源使用情況和正在運行的進程有一個高層次的了解。尋找錯誤和飽和度指標(biāo),因為它們都很容易解釋,然后是資源利用率。飽和是指資源的負載超出其處理能力的情況,可以作為請求隊列的長度或等待時間來公開。

當(dāng)我們把 Linux 操作系統(tǒng)所有的關(guān)鍵一級計數(shù)器找完之后,就會得到這樣一張圖:

這些命令的輸出,有助于快速定位性能瓶頸。主要檢查出圖中標(biāo)紅的計數(shù)器,所有資源(CPU、內(nèi)存、磁盤 IO 等)的利用率(utilization)、飽和度(saturation)和錯誤(error)度量,也就是 Brendan Gregg 提出的 USE 方法。

The USE Method: https://www.brendangregg.com/usemethod.html

  

  1. uptime  
  2. dmesg | tail  
  3. vmstat 1  
  4. mpstat -P ALL 1  
  5. pidstat 1  
  6. iostat -xz 1  
  7. free -m  
  8. sar -n DEV 1  
  9. sar -n TCP,ETCP 1  
  10. top 

下面我們來逐一介紹下這些命令,有關(guān)這些命令更多的參數(shù)和說明,請參照命令的手冊。

1.uptime

這個命令可以快速查看機器的負載情況: 

  1. $ uptime  
  2. 23:51:26 up 21:31,  1 user,  load average: 30.02, 26.43, 19.02 
  •  在 Linux 系統(tǒng)中,平均負載是指單位時間內(nèi),系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù),也就是平均活躍進程數(shù)??蛇\行狀態(tài)的進程,是指正在使用 CPU 或者正在等待 CPU 的進程,也就是我們常用 ps 命令看到的,處于 R 狀態(tài)(Running 或 Runnable)的進程。不可中斷狀態(tài)的進程則是正處于內(nèi)核態(tài)關(guān)鍵流程中的進程,并且這些流程是不可打斷的。這些數(shù)據(jù)可以讓我們對系統(tǒng)資源使用有一個宏觀的了解。
  •  命令的輸出分別表示 1 分鐘、5 分鐘、15 分鐘的平均負載情況。通過這三個數(shù)據(jù),可以了解服務(wù)器負載是在趨于緊張還是區(qū)域緩解。如果 1 分鐘平均負載很高,而 15 分鐘平均負載很低,說明服務(wù)器正在命令高負載情況,需要進一步排查 CPU 資源都消耗在了哪里。反之,如果 15 分鐘平均負載很高,1 分鐘平均負載較低,則有可能是 CPU 資源緊張時刻已經(jīng)過去。
  •  上面例子中的輸出,可以看見最近 1 分鐘的平均負載非常高,且遠高于最近 15 分鐘負載,因此我們需要繼續(xù)排查當(dāng)前系統(tǒng)中有什么進程消耗了大量的資源??梢酝ㄟ^下文將會介紹的 vmstat、mpstat 等命令進一步排查。

2.dmesg | tail 

  1. $ dmesg | tail  
  2. [1880957.563150] perl invoked oom-killer: gfp_mask=0x280daorder=0oom_score_adj=0  
  3. [...]  
  4. [1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child  
  5. [1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB  
  6. [2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request.  Check SNMP counters. 

這將查看最近 10 條系統(tǒng)消息(如果有)。查找可能導(dǎo)致性能問題的錯誤。上面的示例包括 oom-killer 和 TCP 丟棄請求。不要錯過這一步!dmesg 總是值得檢查。這些日志可以幫助排查性能問題。

3.vmstat 

  1. $ vmstat 1  
  2. procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----  
  3. r  b swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st  
  4. 34  0    0 200889792  73708 591828    0    0     0     5    6   10 96  1  3  0  0  
  5. 32  0    0 200889920  73708 591860    0    0     0   592 13284 4282 98  1  1  0  0  
  6. 32  0    0 200890112  73708 591860    0    0     0     0 9501 2154 99  1  0  0  0  
  7. 32  0    0 200889568  73712 591856    0    0     0    48 11900 2459 99  0  0  0  0  
  8. 32  0    0 200890208  73712 591860    0    0     0     0 15898 4840 98  1  1  0  0  
  9. ^C 

每行會輸出一些系統(tǒng)核心指標(biāo),這些指標(biāo)可以讓我們更詳細的了解系統(tǒng)狀態(tài)。后面跟的參數(shù) 1,表示每秒輸出一次統(tǒng)計信息,表頭提示了每一列的含義,這里介紹一些和性能調(diào)優(yōu)相關(guān)的列:

  •  r:等待在 CPU 資源的進程數(shù)量。這個數(shù)據(jù)比平均負載更加能夠體現(xiàn) CPU 負載情況,數(shù)據(jù)中不包含等待 IO 的進程。如果這個數(shù)值大于機器 CPU 核數(shù),那么機器的 CPU 資源已經(jīng)飽和。
  •  free:系統(tǒng)可用內(nèi)存數(shù)(以千字節(jié)為單位),如果剩余內(nèi)存不足,也會導(dǎo)致系統(tǒng)性能問題。下文介紹到的 free 命令,可以更詳細的了解系統(tǒng)內(nèi)存的使用情況。
  •  si, so:交換區(qū)寫入和讀取的數(shù)量。如果這個數(shù)據(jù)不為 0,說明系統(tǒng)已經(jīng)在使用交換區(qū)(swap),機器物理內(nèi)存已經(jīng)不足。
  •  us, sy, id, wa, st:這些都代表了 CPU 時間的消耗,它們分別表示用戶時間(user)、系統(tǒng)(內(nèi)核)時間(sys)、空閑時間(idle)、IO 等待時間(wait)和被偷走的時間(stolen,一般被其他虛擬機消耗)。

上述這些 CPU 時間,可以讓我們很快了解 CPU 是否處于繁忙狀態(tài)。一般情況下,如果用戶時間和系統(tǒng)時間相加非常大,CPU 處于忙于執(zhí)行指令。如果 IO 等待時間很長,那么系統(tǒng)的瓶頸可能在磁盤 IO。示例命令的輸出可以看見,大量 CPU 時間消耗在用戶態(tài),也就是用戶應(yīng)用程序消耗了 CPU 時間。這不一定是性能問題,需要結(jié)合 r 隊列,一起分析。

4.mpstat -P ALL 1 

  1. $ mpstat -P ALL 1  
  2. Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU)  
  3. 07:38:49 PM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice  %idle  
  4. 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  
  5. 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  
  6. 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  
  7. 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  
  8. 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  
  9. [...] 

該命令可以顯示每個 CPU 的占用情況,如果有一個 CPU 占用率特別高,那么有可能是一個單線程應(yīng)用程序引起的。

5.pidstat 1 

  1. $ pidstat 1  
  2. Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)  
  3. 07:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command  
  4. 07:41:03 PM     0         9    0.00    0.94    0.00    0.94     1  rcuos/0  
  5. 07:41:03 PM     0      4214    5.66    5.66    0.00   11.32    15  mesos-slave  
  6. 07:41:03 PM     0      4354    0.94    0.94    0.00    1.89     8  java  
  7. 07:41:03 PM     0      6521 1596.23    1.89    0.00 1598.11    27  java  
  8. 07:41:03 PM     0      6564 1571.70    7.55    0.00 1579.25    28  java  
  9. 07:41:03 PM 60004     60154    0.94    4.72    0.00    5.66     9  pidstat  
  10. 07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command  
  11. 07:41:04 PM     0      4214    6.00    2.00    0.00    8.00    15  mesos-slave  
  12. 07:41:04 PM     0      6521 1590.00    1.00    0.00 1591.00    27  java  
  13. 07:41:04 PM     0      6564 1573.00   10.00    0.00 1583.00    28  java  
  14. 07:41:04 PM   108      6718    1.00    0.00    0.00    1.00     0  snmp-pass  
  15. 07:41:04 PM 60004     60154    1.00    4.00    0.00    5.00     9  pidstat 
  16.  ^C 

pidstat 命令輸出進程的 CPU 占用率,該命令會持續(xù)輸出,并且不會覆蓋之前的數(shù)據(jù),可以方便觀察系統(tǒng)動態(tài)。如上的輸出,可以看見兩個 JAVA 進程占用了將近 1600% 的 CPU 時間,既消耗了大約 16 個 CPU 核心的運算資源。

6.iostat -xz 1 

  1. $ iostat -xz 1  
  2. avg-cpu:  %user   %nice %system %iowait  %steal   %idle  
  3.            0.13    0.00    0.10    0.01    0.00   99.76  
  4. Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util  
  5. vda               0.00     0.62    0.03    0.89     0.57     7.97    18.52     0.00    0.68    1.96    0.64   0.60   0.06  
  6. vdb               0.00     0.02    0.00    0.38     0.05     2.64    14.12     0.00    0.84    0.46    0.84   0.54   0.02  
  7. dm-0              0.00     0.00    0.00    0.40     0.01     2.75    13.62     0.00    0.98    0.37    0.98   0.35   0.01  
  8. avg-cpu:  %user   %nice %system %iowait  %steal   %idle  
  9.            0.25    0.00    0.00    0.00    0.00   99.75  
  10. Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util  
  11. vda               0.00     0.00    0.00    1.00     0.00     4.00     8.00     0.00    0.00    0.00    0.00   1.00   0.10  
  12. avg-cpu:  %user   %nice %system %iowait  %steal   %idle  
  13.            0.00    0.00    0.00    0.00    0.00  100.00 

iostat 命令主要用于查看機器磁盤 IO 情況。該命令輸出的列,主要含義是:

  •  r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數(shù)和每秒讀寫數(shù)據(jù)量(千字節(jié))。讀寫量過大,可能會引起性能問題。
  •  await:IO 操作的平均等待時間,單位是毫秒。這是應(yīng)用程序在和磁盤交互時,需要消耗的時間,包括 IO 等待和實際操作的耗時。如果這個數(shù)值過大,可能是硬件設(shè)備遇到了瓶頸或者出現(xiàn)故障。
  •  avgqu-sz:向設(shè)備發(fā)出的請求平均數(shù)量。如果這個數(shù)值大于 1,可能是硬件設(shè)備已經(jīng)飽和(部分前端硬件設(shè)備支持并行寫入)。
  •  %util:設(shè)備利用率。這個數(shù)值表示設(shè)備的繁忙程度,經(jīng)驗值是如果超過 60,可能會影響 IO 性能(可以參照 IO 操作平均等待時間)。如果到達 100%,說明硬件設(shè)備已經(jīng)飽和。

如果顯示的是邏輯設(shè)備的數(shù)據(jù),那么設(shè)備利用率不代表后端實際的硬件設(shè)備已經(jīng)飽和。值得注意的是,即使 IO 性能不理想,也不一定意味應(yīng)用程序會出現(xiàn)性能問題,可以利用諸如預(yù)讀取、寫緩存等策略提升應(yīng)用性能。

7.free –m 

  1. $ free -m  
  2.             total       used       free     shared    buffers     cached  
  3. Mem:        245998      24545     221453         83         59        541  
  4. -/+ buffers/cache:      23944     222053  
  5. Swap:            0          0          0 

free 命令可以查看系統(tǒng)內(nèi)存的使用情況,-m 參數(shù)表示按照兆字節(jié)展示。最后兩列分別表示用于 IO 緩存的內(nèi)存數(shù),和用于文件系統(tǒng)頁緩存的內(nèi)存數(shù)。需要注意的是,第二行 -/+ buffers/cache,看上去緩存占用了大量內(nèi)存空間。這是 Linux 系統(tǒng)的內(nèi)存使用策略,盡可能的利用內(nèi)存,如果應(yīng)用程序需要內(nèi)存,這部分內(nèi)存會立即被回收并分配給應(yīng)用程序。因此,這部分內(nèi)存一般也被當(dāng)成是可用內(nèi)存。如果可用內(nèi)存非常少,系統(tǒng)可能會動用交換區(qū)(如果配置了的話),這樣會增加 IO 開銷(可以在 iostat 命令中體現(xiàn)),降低系統(tǒng)性能。

8.sar -n DEV 1 

  1. $ sar -n DEV 1  
  2. Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015     _x86_64_    (32 CPU)  
  3. 12:16:48 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil  
  4. 12:16:49 AM      eth0  18763.00   5032.00  20686.42    478.30      0.00      0.00      0.00      0.00  
  5. 12:16:49 AM        lo     14.00     14.00      1.36      1.36      0.00      0.00      0.00      0.00  
  6. 12:16:49 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00  
  7. 12:16:49 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil  
  8. 12:16:50 AM      eth0  19763.00   5101.00  21999.10    482.56      0.00      0.00      0.00      0.00  
  9. 12:16:50 AM        lo     20.00     20.00      3.25      3.25      0.00      0.00      0.00      0.00  
  10. 12:16:50 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00  
  11. ^C 

sar 命令在這里可以查看網(wǎng)絡(luò)設(shè)備的吞吐率。在排查性能問題時,可以通過網(wǎng)絡(luò)設(shè)備的吞吐量,判斷網(wǎng)絡(luò)設(shè)備是否已經(jīng)飽和。如示例輸出中,eth0 網(wǎng)卡設(shè)備,吞吐率大概在 22 Mbytes/s,既 176 Mbits/sec,沒有達到 1Gbit/sec 的硬件上限。

9.sar -n TCP,ETCP 1 

  1. $ sar -n TCP,ETCP 1  
  2. Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)  
  3. 12:17:19 AM  active/s passive/s    iseg/s    oseg/s  
  4. 12:17:20 AM      1.00      0.00  10233.00  18846.00  
  5. 12:17:19 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s  
  6. 12:17:20 AM      0.00      0.00      0.00      0.00      0.00  
  7. 12:17:20 AM  active/s passive/s    iseg/s    oseg/s  
  8. 12:17:21 AM      1.00      0.00   8359.00   6039.00  
  9. 12:17:20 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s  
  10. 12:17:21 AM      0.00      0.00      0.00      0.00      0.00  
  11. ^C 

sar 命令在這里用于查看 TCP 連接狀態(tài),其中包括:

  •  active/s:每秒本地發(fā)起的 TCP 連接數(shù),既通過 connect 調(diào)用創(chuàng)建的 TCP 連接;
  •  passive/s:每秒遠程發(fā)起的 TCP 連接數(shù),即通過 accept 調(diào)用創(chuàng)建的 TCP 連接;
  •  retrans/s:每秒 TCP 重傳數(shù)量;

TCP 連接數(shù)可以用來判斷性能問題是否由于建立了過多的連接,進一步可以判斷是主動發(fā)起的連接,還是被動接受的連接。TCP 重傳可能是因為網(wǎng)絡(luò)環(huán)境惡劣,或者服務(wù)器壓力過大導(dǎo)致丟包。重傳會嚴重影響tcp的效率,可以使用Brendan Gregg開發(fā)的一個輕量級tcp重傳抓取工具: tcpretrans。

10.top 

  1. $ top  
  2. top - 00:15:40 up 21:56,  1 user,  load average: 31.09, 29.87, 29.92  
  3. Tasks: 871 total,   1 running, 868 sleeping,   0 stopped,   2 zombie  
  4. %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  
  5. KiB Mem:  25190241+total, 24921688 used, 22698073+free,    60448 buffers 
  6. KiB Swap:        0 total,        0 used,        0 free.   554208 cached Mem  
  7.   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND  
  8. 20248 root      20   0  0.227t 0.012t  18748 S  3090  5.2  29812:58 java  
  9.  4213 root      20   0 2722544  64640  44232 S  23.5  0.0 233:35.37 mesos-slave  
  10. 66128 titancl+  20   0   24344   2332   1172 R   1.0  0.0   0:00.07 top  
  11.  5235 root      20   0 38.227g 547004  49996 S   0.7  0.2   2:02.74 java  
  12.  4299 root      20   0 20.015g 2.682g  16836 S   0.3  1.1  33:14.42 java  
  13.     1 root      20   0   33620   2920   1496 S   0.0  0.0   0:03.82 init  
  14.     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd  
  15.     3 root      20   0       0      0      0 S   0.0  0.0   0:05.35 ksoftirqd/0  
  16.     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H  
  17.     6 root      20   0       0      0      0 S   0.0  0.0   0:06.94 kworker/u256:0  
  18.     8 root      20   0       0      0      0 S   0.0  0.0   2:38.05 rcu_sched 

top 命令包含了前面好幾個命令的檢查的內(nèi)容。比如系統(tǒng)負載情況(uptime)、系統(tǒng)內(nèi)存使用情況(free)、系統(tǒng) CPU 使用情況(vmstat)等。因此通過這個命令,可以相對全面的查看系統(tǒng)負載的來源。同時,top 命令支持排序,可以按照不同的列排序,方便查找出諸如內(nèi)存占用最多的進程、CPU 占用率最高的進程等。但是,top 命令相對于前面一些命令,輸出是一個瞬間值,如果不持續(xù)盯著,可能會錯過一些線索。這時可能需要暫停 top 命令刷新,來記錄和比對數(shù)據(jù)。

11.總結(jié)

排查 Linux 服務(wù)器性能問題還有很多工具,上面介紹的一些命令,可以幫助我們快速的定位問題。例如前面的示例輸出,多個證據(jù)證明有 JAVA 進程占用了大量 CPU 資源,之后的性能調(diào)優(yōu)就可以針對應(yīng)用程序進行。 

 

責(zé)任編輯:龐桂玉 來源: 奇妙的Linux世界
相關(guān)推薦

2020-06-05 14:18:57

Linux性能EC2

2020-07-20 14:12:31

Linux60秒命令

2018-01-26 10:10:45

Linux服務(wù)器性能

2014-04-23 16:43:05

Linux服務(wù)器性能分析

2022-07-14 09:39:51

Linux工具性能

2019-09-29 09:35:22

Linux軟件硬件

2009-12-04 09:47:47

LinuxNFS服務(wù)器

2009-12-11 09:43:43

靜態(tài)路由配置

2011-08-22 14:38:40

linux服務(wù)器分區(qū)

2022-05-05 09:27:31

Linux服務(wù)器優(yōu)化

2010-08-25 21:34:15

DHCP服務(wù)器

2010-05-19 10:31:07

IIS服務(wù)器

2022-09-26 09:19:38

服務(wù)器優(yōu)化

2022-03-03 08:31:25

CephFS服務(wù)器EOS

2019-03-05 15:53:40

Linux服務(wù)器CPU

2010-05-24 08:51:13

Linux下SVN服務(wù)

2019-08-26 10:42:15

Linux服務(wù)器運維

2010-06-02 18:51:35

搭建SVN服務(wù)器

2022-10-10 12:31:37

服務(wù)器性能

2020-08-13 10:57:26

服務(wù)器故障服務(wù)器預(yù)防性維護
點贊
收藏

51CTO技術(shù)棧公眾號