<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    如何有效的在 60 秒內進行 Linux 服務器性能故障分析

    VSole2021-10-02 22:05:52

    掌握一些性能優化工具和方法,這就需要在工作中不斷地積累;計算機基礎知識很重要,比如說網絡知識、操作系統知識等等,掌握了基礎知識才能讓你在優化過程中抓住性能問題的關鍵,也能在性能優化過程中游刃有余。

    雖然監控工具可以幫助我們解決大多數問題,但我們有時需要登錄實例并運行一些標準的 Linux 性能工具。

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

    當我們把 Linux 操作系統所有的關鍵一級計數器找完之后,就會得到這樣一張圖:

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

    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
    

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

    uptime

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

    $ uptime
    23:51:26 up 21:31,  1 user,  load average: 30.02, 26.43, 19.02
    

    在 Linux 系統中,平均負載是指單位時間內,系統處于可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數。可運行狀態的進程,是指正在使用 CPU 或者正在等待 CPU 的進程,也就是我們常用 ps 命令看到的,處于 R 狀態(Running 或 Runnable)的進程。不可中斷狀態的進程則是正處于內核態關鍵流程中的進程,并且這些流程是不可打斷的。這些數據可以讓我們對系統資源使用有一個宏觀的了解。

    命令的輸出分別表示 1 分鐘、5 分鐘、15 分鐘的平均負載情況。通過這三個數據,可以了解服務器負載是在趨于緊張還是區域緩解。如果 1 分鐘平均負載很高,而 15 分鐘平均負載很低,說明服務器正在命令高負載情況,需要進一步排查 CPU 資源都消耗在了哪里。反之,如果 15 分鐘平均負載很高,1 分鐘平均負載較低,則有可能是 CPU 資源緊張時刻已經過去。

    上面例子中的輸出,可以看見最近 1 分鐘的平均負載非常高,且遠高于最近 15 分鐘負載,因此我們需要繼續排查當前系統中有什么進程消耗了大量的資源。可以通過下文將會介紹的 vmstat、mpstat 等命令進一步排查。

    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.
    

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

    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
    

    每行會輸出一些系統核心指標,這些指標可以讓我們更詳細的了解系統狀態。后面跟的參數 1,表示每秒輸出一次統計信息,表頭提示了每一列的含義,這里介紹一些和性能調優相關的列:

    r:等待在 CPU 資源的進程數量。這個數據比平均負載更加能夠體現 CPU 負載情況,數據中不包含等待 IO 的進程。如果這個數值大于機器 CPU 核數,那么機器的 CPU 資源已經飽和。

    free:系統可用內存數(以千字節為單位),如果剩余內存不足,也會導致系統性能問題。下文介紹到的 free 命令,可以更詳細的了解系統內存的使用情況。

    si, so:交換區寫入和讀取的數量。如果這個數據不為 0,說明系統已經在使用交換區(swap),機器物理內存已經不足。

    us, sy, id, wa, st:這些都代表了 CPU 時間的消耗,它們分別表示用戶時間(user)、系統(內核)時間(sys)、空閑時間(idle)、IO 等待時間(wait)和被偷走的時間(stolen,一般被其他虛擬機消耗)。

    上述這些 CPU 時間,可以讓我們很快了解 CPU 是否處于繁忙狀態。一般情況下,如果用戶時間和系統時間相加非常大,CPU 處于忙于執行指令。如果 IO 等待時間很長,那么系統的瓶頸可能在磁盤 IO。示例命令的輸出可以看見,大量 CPU 時間消耗在用戶態,也就是用戶應用程序消耗了 CPU 時間。這不一定是性能問題,需要結合 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
    [...]
    

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

    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
    

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

    iostat -xz 1

    $ iostat -xz 1
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.13    0.00    0.10    0.01    0.00   99.76
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    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
    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
    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
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.25    0.00    0.00    0.00    0.00   99.75
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    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
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.00    0.00    0.00    0.00    0.00  100.00
    

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

    r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數和每秒讀寫數據量(千字節)。讀寫量過大,可能會引起性能問題。

    await:IO 操作的平均等待時間,單位是毫秒。這是應用程序在和磁盤交互時,需要消耗的時間,包括 IO 等待和實際操作的耗時。如果這個數值過大,可能是硬件設備遇到了瓶頸或者出現故障。

    avgqu-sz:向設備發出的請求平均數量。如果這個數值大于 1,可能是硬件設備已經飽和(部分前端硬件設備支持并行寫入)。

    %util:設備利用率。這個數值表示設備的繁忙程度,經驗值是如果超過 60,可能會影響 IO 性能(可以參照 IO 操作平均等待時間)。如果到達 100%,說明硬件設備已經飽和。

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

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

    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
    

    sar 命令在這里可以查看網絡設備的吞吐率。在排查性能問題時,可以通過網絡設備的吞吐量,判斷網絡設備是否已經飽和。如示例輸出中,eth0 網卡設備,吞吐率大概在 22 Mbytes/s,既 176 Mbits/sec,沒有達到 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
    

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

    active/s:每秒本地發起的 TCP 連接數,既通過 connect 調用創建的 TCP 連接;

    passive/s:每秒遠程發起的 TCP 連接數,即通過 accept 調用創建的 TCP 連接;

    retrans/s:每秒 TCP 重傳數量;

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

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

    總結

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

    linux系統cpu參數
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    雖然平時大部分工作都是和網絡相關, 但會接觸Linux系統, 尤其是使用了Mac之后, 每天都是工作在黑色背景的命令行環境中. 自己記憶力不好, 很多有用的Linux命令不能很好的記憶, 現在逐漸總結一下, 以便后續查看。基本操作Linux 關機,重啟#?查看當前用戶環境變量。查看有幾顆cpu,每顆分別是幾核。
    如果你的Linux服務器突然負載暴增,告警短信快發爆你的手機,如何在最短時間內找出Linux性能問題所在?來看Netflix性能工程團隊的這篇博文,看它們通過十條命令在一分鐘內對機器性能問題進行診斷。概述 通過執行以下命令,可以在1分鐘內對系統資源使用情況有個大致的了解。
    雖然平時大部分工作都是和Java相關的開發, 但是每天都會接觸Linux系統, 尤其是使用了Mac之后, 每天都是工作在黑色背景的命令行環境中. 自己記憶力不好, 很多有用的Linux命令不能很好的記憶, 現在逐漸總結一下, 以便后續查看。
    雖然監控工具可以幫助我們解決大多數問題,但我們有時需要登錄實例并運行一些標準的 Linux 性能工具。看他們通過十條命令在一分鐘內對機器性能問題進行診斷。飽和是指資源的負載超出其處理能力的情況,可以作為請求隊列的長度或等待時間來公開。當我們把 Linux 操作系統所有的關鍵一級計數器找完之后,就會得到這樣一張圖:這些命令的輸出,有助于快速定位性能瓶頸。
    在本文中,我們將了解如何解釋 CPU 指標并以人類可讀的格式顯示它們。CPU 負載定義為在單個時間點使用或等待使用一個內核的進程數。假設我們有一個單核系統,我們的 CPU 平均負載始終低于 0.6。如果 CPU 平均負載大于 1,則表示有進程需要使用 CPU,但由于 CPU 不可用,目前無法使用。
    不可中斷狀態實際上是系統對進程和硬件設備的一種保護機制。當負載存在明顯升高趨勢時,及時進行分析和調查。系統調用過程中并不會涉及虛擬內存等進程用戶態資源,也不會切換進程。因此系統調用通常稱為特權模式切換。進程是由內核管理和調度的,進程上下文切換只能發生在內核態。因此相比系統調用來說,在保存當前進程的內核狀態和CPU寄存器之前,需要先把該進程的虛擬內存,棧保存下來。
    Linux比較麻煩的就是很多東西都要用命令來控制,當然,這也是很多人喜歡它的原因,比較短小但卻功能強大。
    本文章盤點了 Linux 運維必備 150 個命令,請配合下面的網站使用。定位你需要使用的命令,然后去這個網站查詢詳細用法即可。 地址:wangchujiang.com/linux-command/
    主動模式監控項,顧名思義,就是Zabbix agent會主動上報監控數據給Zabbix server。而被動模式監控項就是指Zabbix server根據監控項的更新間隔向Zabbix agent拉取監控數據。
    動態防護技術
    2022-07-13 17:20:00
    動態防護技術是面向App運行過程的防護,一方面可以通過App動態加固技術來實現,比如程序數據加解密保護、進程防動態調試保護、運行日志輸出保護、用戶信息輸入保護等;另一方面需要開發者在App實現方案中采用保護技術,如客戶端和服務器端通信過程的保護等。此次僅介紹App動態防護技術的實現思路,不討論具體的實現方案細節。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类