<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          臨時(shí)抱佛腳,線(xiàn)上問(wèn)題如何排查?

          共 28588字,需瀏覽 58分鐘

           ·

          2021-06-27 11:48


          低并發(fā)編程
          戰(zhàn)略上藐視技術(shù),戰(zhàn)術(shù)上重視技術(shù)

          重要的事情說(shuō)一遍!最近我在面試~
          面試時(shí)被高頻問(wèn)到,有沒(méi)有遇到過(guò)線(xiàn)上問(wèn)題,如何解決。
          一般我都是大眼瞪小眼,說(shuō)個(gè)看看日志中有沒(méi)有 NPE 問(wèn)題,去機(jī)器上 top 一下,就沒(méi)了。
          被面試官鄙視了好多次,今天簡(jiǎn)單梳理一下,目的是為了不大眼瞪小眼即可,等我應(yīng)付完面試,再給大家好好準(zhǔn)備準(zhǔn)備這塊的思路。
          到時(shí)候面試被問(wèn)到了沒(méi)思路,還能手機(jī)上偷偷看看自己寫(xiě)的文章回憶回憶,也不錯(cuò)嘿嘿。


          磁盤(pán)空間不足問(wèn)題





          先用 df -h 從總體查看磁盤(pán)狀態(tài)
          文件系統(tǒng)        容量  已用  可用 已用% 掛載點(diǎn)
          devtmpfs        1.9G  4.0K  1.9G    1% /dev
          tmpfs           1.9G   24K  1.9G    1% /dev/shm
          tmpfs           1.9G  740K  1.9G    1% /run
          tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
          /dev/vda1        50G   12G   36G   25% /
          tmpfs           379M     0  379M    0% /run/user/0
          tmpfs           379M     0  379M    0% /run/user/1001
          /dev/loop4     1003K   17K  935K    2% /mnt
          很多都是無(wú)用信息,比如 tmpfs 類(lèi)型的是 linux 的內(nèi)存型文件系統(tǒng),里面的數(shù)據(jù)是放在內(nèi)存中的,你可 cd 到后面那些目錄下玩玩,和操作正常的文件是一樣的。
          一般就是看掛載點(diǎn)為根目錄的 / 的容量咯,這里我只用了 25%,顯然還沒(méi)有達(dá)到瓶頸,但如果這里太大了,還要進(jìn)一步看看是哪個(gè)目錄大了。
          此時(shí)用 du -sh * 命令,查看 / 路徑下的各個(gè)文件和目錄的大小。
          0  bin
          166M  boot
          134M  data
          4.0K  dev
          40M  etc
          4.0K  home
          0  lib
          0  lib64
          16K  lost+found
          4.0K  media
          du: 無(wú)法訪問(wèn)"mnt/hello": 輸入/輸出錯(cuò)誤
          13K  mnt
          20K  opt
          du: 無(wú)法訪問(wèn)"proc/12896/task/12896/fd/4": 沒(méi)有那個(gè)文件或目錄
          du: 無(wú)法訪問(wèn)"proc/12896/task/12896/fdinfo/4": 沒(méi)有那個(gè)文件或目錄
          du: 無(wú)法訪問(wèn)"proc/12896/fd/4": 沒(méi)有那個(gè)文件或目錄
          du: 無(wú)法訪問(wèn)"proc/12896/fdinfo/4": 沒(méi)有那個(gè)文件或目錄
          0  proc
          953M  root
          740K  run
          0  sbin
          4.0K  srv
          2.1G  swapfile
          0  sys
          68K  tmp
          5.3G  usr
          2.9G  var
          找到最大的那個(gè)目錄,進(jìn)去,再次執(zhí)行這個(gè)命令,直到找到最終占地面積特別大的文件或目錄為止。
          當(dāng)然,如果你知道里面全都是普通文件,比如你發(fā)現(xiàn)你的 log 目錄很大,想看看里面哪個(gè)具體日志文件過(guò)大,也可以用 ls -lh 命令,它的輸出會(huì)更豐滿(mǎn)一些,但我們主要看占地大小,也就無(wú)所謂了。
          drwxr-x--- 2 www   www   4.0K 2 月   3 14:56 hsperfdata_www
          srwxrwxrwx 1 mysql mysql    0 2 月   3 14:56 mysql.sock
          -rw-r--r-- 1 root  root     0 6 月  19 15:33 stargate.lock
          drwx------ 3 root  root  4.0K 2 月   3 14:55 systemd-private
          另外提一嘴,你如果用 du -h * 去執(zhí)行的話(huà),整個(gè)屏幕會(huì)很刺激喲,你可以試試,哈哈~


          CPU 與內(nèi)存使用率過(guò)高問(wèn)題





          到了我臨場(chǎng)發(fā)揮時(shí),唯一能記得住的命令了,那就是 top

          top - 20:16:56 up 141 days,  5:21,  1 user,  load average: 0.00, 0.01, 0.05
          Tasks: 110 total,   1 running, 109 sleeping,   0 stopped,   0 zombie
          %Cpu(s):  0.2 us,  0.5 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
          KiB Mem :  3880160 total,   135320 free,   852980 used,  2891860 buff/cache
          KiB Swap:  2097148 total,  2087676 free,     9472 used.  2737524 avail Mem 


            PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
           11866 root      20   0  611652  14280   2396 S   0.7  0.4 239:17.79 barad_agent
           16850 root      20   0 1026344  22364  11644 S   0.7  0.6   5:04.40 YDService
           1550 root      20   0  140996   2428   1472 S   0.3  0.1  58:38.76 redis-server
           1575 www       20   0 3610540 358456  14912 S   0.3  9.2 153:55.63 java
           16868 root      20   0  773168  12576  11056 S   0.3  0.3   1:15.83 YDEdr
           
          下面的列表表示不同進(jìn)程(PID)所占用的資源情況,沒(méi)錯(cuò),不僅僅是 CPU 情況。
          VIRT 表示使用的虛擬內(nèi)存數(shù)量,RES 表示使用的物理內(nèi)存數(shù)量,SHR 表示使用的共享內(nèi)存數(shù)量,這三者可以從內(nèi)存角度看該進(jìn)程的資源占用情況。
          S 表示進(jìn)程的狀態(tài),下面的值 S 表示睡眠,D 表示不可中斷睡眠,R 表示運(yùn)行,基本知道這三個(gè)就夠了。
          后面兩個(gè)值是百分比,%CPU 自然就是 CPU 使用率,%MEM 自然就是內(nèi)存使用率,看這倆值可以一目了然看誰(shuí)占用的資源過(guò)高了。
          TIME 表示累計(jì) cpu 使用時(shí)長(zhǎng),感覺(jué)沒(méi)什么用。
          COMMAND 表示啟動(dòng)進(jìn)程使用的命令行,Java 程序的話(huà),可以看看 JVM 啟動(dòng)參數(shù),看是否配置的合理。
          如果專(zhuān)門(mén)看 Java 進(jìn)程的情況,可以先 jps 命令找到它的 PID。
          19063 jar
          1575 Bootstrap
          21263 Jps
          然后再 top -p 19063 專(zhuān)門(mén)看這個(gè) Java 進(jìn)程的情況。
          top - 20:51:07 up 141 days,  5:55,  3 users,  load average: 0.09, 0.
          Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
          %Cpu(s):  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 
          KiB Mem :  3880160 total,   139956 free,   952180 used,  2788024 buf
          KiB Swap:  2097148 total,  2087420 free,     9728 used.  2638260 ava


            PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ 
          19063 root      20   0 3533736 101916  13012 S   0.3  2.6   0:04.31
          如果再細(xì)化到線(xiàn)程,可以加個(gè) -H 參數(shù),top -p 19063 -H
          top - 20:52:16 up 141 days,  5:56,  3 users,  load average: 0.03, 0.
          Threads:  22 total,   0 running,  22 sleeping,   0 stopped,   0 zomb
          %Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 
          KiB Mem :  3880160 total,   140136 free,   951924 used,  2788100 buf
          KiB Swap:  2097148 total,  2087420 free,     9728 used.  2638512 ava


            PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ 
          19063 root      20   0 3533736 101920  13012 S  0.0  2.6   0:00.00 
          19064 root      20   0 3533736 101920  13012 S  0.0  2.6   0:01.16 
          19065 root      20   0 3533736 101920  13012 S  0.0  2.6   0:00.01 
          19066 root      20   0 3533736 101920  13012 S  0.0  2.6   0:00.01 
          19067 root      20   0 3533736 101920  13012 S  0.0  2.6   0:00.02 
          19068 root      20   0 3533736 101920  13012 S  0.0  2.6   0:00.00 
          19069 root      20   0 3533736 101920  13012 S  0.0  2.6   0:00.00
          當(dāng)然,top 命令已經(jīng)可以分析內(nèi)存了,如果想單獨(dú)分析下內(nèi)存,可以用小而美的命令,free -h
                        total        used        free      shared  buff/cache   available
          Mem:           3.7G        934M        155M        500K        2.6G        2.5G
          Swap:          2.0G        9.5M        2.0G
          這些參數(shù)的含義是:

          total:內(nèi)存總數(shù)

          used:已經(jīng)使用內(nèi)存數(shù)

          free:完全空閑內(nèi)存

          shared:多個(gè)進(jìn)程共享的內(nèi)存

          buffers:用于塊設(shè)備數(shù)據(jù)緩沖,記錄文件系統(tǒng) metadata(目錄,權(quán)限,屬性等)

          cached:用于文件內(nèi)容的緩沖

          available:真正剩余的可被程序應(yīng)用的內(nèi)存數(shù)

          一共有兩行,mem 和 swap,mem 就是內(nèi)存大小,swap 是交換區(qū),是在物理磁盤(pán)上的一塊區(qū)域,當(dāng)內(nèi)存不夠用時(shí),可以用這部分區(qū)域當(dāng)內(nèi)存。
          可以用 swapon 命令來(lái)看下交換區(qū)的使用情況。
          NAME      TYPE SIZE USED PRIO
          /swapfile file   2G 9.5M   -2


          網(wǎng)絡(luò)延遲





          netstat -a 查看所有連接中的 socket。
          Active Internet connections (servers and established)
          Proto Recv-Q Send-Q Local Address           Foreign Address         State      
          tcp        0      0 0.0.0.0:mysql           0.0.0.0:*               LISTEN     
          tcp        0      0 VM-0-12-centos:6379     0.0.0.0:*               LISTEN     
          tcp        0      0 VM-0-12-centos:memcache 0.0.0.0:*               LISTEN     
          tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN     
          tcp        0      0 0.0.0.0:ftp             0.0.0.0:*               LISTEN     
          tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
          tcp        0      0 VM-0-12-centos:smtp     0.0.0.0:*               LISTEN     
          tcp        0      0 0.0.0.0:irdmi           0.0.0.0:*               LISTEN     
          tcp        0      0 VM-0-12-centos:12419    169.254.0.4:http        TIME_WAIT  
          tcp        0      0 VM-0-12-centos:ssh      114.247.175.201:8829    ESTABLISHED
          tcp        0      0 VM-0-12-centos:64390    169.254.0.55:lsi-bobcat ESTABLISHED
          tcp        0      0 VM-0-12-centos:ssh      114.247.175.201:14227   ESTABLISHED
          tcp        0      0 VM-0-12-centos:ssh      114.247.175.201:22704   ESTABLISHED
          tcp        0     36 VM-0-12-centos:ssh      114.247.175.201:15126   ESTABLISHED
          tcp6       0      0 [::]:webcache           [::]:*                  LISTEN     
          tcp6       0      0 [::]:ftp                [::]:*                  LISTEN     
          tcp6       0      0 VM-0-12-centos:smtp     [::]:*                  LISTEN     
          tcp6       0      0 [::]:irdmi              [::]:*                  LISTEN     
          tcp6       0      0 VM-0-12-centos:8006     [::]:*                  LISTEN     
          udp        0      0 0.0.0.0:bootpc          0.0.0.0:*                          
          udp        0      0 VM-0-12-centos:ntp      0.0.0.0:*                          
          udp        0      0 VM-0-12-centos:ntp      0.0.0.0:*                          
          udp6       0      0 VM-0-12-centos:ntp      [::]:*                             
          udp6       0      0 VM-0-12-centos:ntp      [::]:*
          netstat -tnpa 命令可以查看所有 tcp 連接的信息,包括進(jìn)程號(hào)。
          Active Internet connections (servers and established)
          Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
          tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      2903/mysqld         
          tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      32647/redis-server  
          tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      1240/memcached      
          tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1030/nginx: master  
          tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      1016/pure-ftpd      
          tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1201/sshd           
          tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1502/master         
          tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      1550/./redis-server 
          tcp        0      0 172.21.0.12:22          114.247.175.201:8829    ESTABLISHED 18961/sshd: root@no 
          tcp        0      0 172.21.0.12:64390       169.254.0.55:5574       ESTABLISHED 16850/YDService     
          tcp        0      0 172.21.0.12:22          114.247.175.201:14227   ESTABLISHED 9490/sshd: root@not 
          tcp        0      0 172.21.0.12:22          114.247.175.201:22704   ESTABLISHED 20259/sshd: root@no 
          tcp        0     36 172.21.0.12:22          114.247.175.201:15126   ESTABLISHED 9478/sshd: root@pts 
          tcp6       0      0 :::8080                 :::*                    LISTEN      1575/java           
          tcp6       0      0 :::21                   :::*                    LISTEN      1016/pure-ftpd      
          tcp6       0      0 ::1:25                  :::*                    LISTEN      1502/master         
          tcp6       0      0 :::8000                 :::*                    LISTEN      1550/./redis-server 
          tcp6       0      0 127.0.0.1:8006          :::*                    LISTEN      1575/java

          得到進(jìn)程號(hào)后就好說(shuō)了配合 top 命令,ps -ef 命令,查看相關(guān)進(jìn)程信息。
          不過(guò)這些自帶的網(wǎng)絡(luò)命令,都不太靈活,一般我們有直觀查看實(shí)時(shí)流量,然后進(jìn)行一波統(tǒng)計(jì)分析的需求,這里介紹一個(gè)酷酷的命令。
          輸入 iftop -P 會(huì)得到這樣的一個(gè)實(shí)時(shí)數(shù)據(jù)。
          中間的 <= => 這兩個(gè)左右箭頭,表示的是流量的方向。

          TX:發(fā)送流量

          RX:接收流量

          TOTAL:總流量

          Cumm:運(yùn)行 iftop 到目前時(shí)間的總流量

          peak:流量峰值

          rates:分別表示過(guò)去 2s 10s 40s 的平均流量

          當(dāng)然這些是從機(jī)器上的,如果是一個(gè)接口響應(yīng)耗時(shí)過(guò)長(zhǎng),一方面可能是由于機(jī)器本身所在的網(wǎng)絡(luò)有問(wèn)題。
          一般這種問(wèn)題也就是運(yùn)維同學(xué)去解決,或者我們單節(jié)點(diǎn)重啟一下,換臺(tái)機(jī)器,就搞定了。
          還有可能是服務(wù)提供方業(yè)務(wù)耗時(shí)嚴(yán)重,這個(gè)就需要去排查服務(wù)提供方的日志,機(jī)器負(fù)載,連接池占用情況等,分析問(wèn)題,這也是我們平時(shí)開(kāi)發(fā)碰到的主要問(wèn)題。
           

          Java 程序的問(wèn)題分析





          這個(gè)也算是個(gè)八股文吧,平時(shí)生產(chǎn)環(huán)境中很少會(huì)用到,不過(guò)我倒是碰到過(guò)一些,但都很簡(jiǎn)單,主要借著故事來(lái)方便記憶一下具體命令吧。
          有次我們的一個(gè)服務(wù),內(nèi)存是這樣的,直到觸發(fā)了報(bào)警。
           
          jmap -dump 分析堆內(nèi)存中的快照,未發(fā)現(xiàn)有大對(duì)象問(wèn)題。
          jmap -heap 查看堆內(nèi)存設(shè)置與當(dāng)前使用情況,堆內(nèi)存設(shè)置的是 6G。
          Attaching to process ID 127, please wait...
          Debugger attached successfully.
          Server compiler detected.
          JVM version is 25.202-b08
           
          using thread-local object allocation.
          Parallel GC with 4 thread(s)
           
          Heap Configuration:
             MinHeapFreeRatio         = 0
             MaxHeapFreeRatio         = 100
             MaxHeapSize              = 6442450944 (6144.0MB)
             NewSize                  = 2147483648 (2048.0MB)
             MaxNewSize               = 2147483648 (2048.0MB)
             OldSize                  = 4294967296 (4096.0MB)
             NewRatio                 = 2
             SurvivorRatio            = 8
             MetaspaceSize            = 21807104 (20.796875MB)
             CompressedClassSpaceSize = 1073741824 (1024.0MB)
             MaxMetaspaceSize         = 17592186044415 MB
             G1HeapRegionSize         = 0 (0.0MB)
           
          Heap Usage:
          PS Young Generation
          Eden Space:
             capacity = 2117074944 (2019.0MB)
             used     = 1150960080 (1097.6410675048828MB)
             free     = 966114864 (921.3589324951172MB)
             54.36558036180698% used
          From Space:
             capacity = 15204352 (14.5MB)
             used     = 13860864 (13.21875MB)
             free     = 1343488 (1.28125MB)
             91.16379310344827% used
          To Space:
             capacity = 15204352 (14.5MB)
             used     = 0 (0.0MB)
             free     = 15204352 (14.5MB)
             0.0% used
          PS Old Generation
             capacity = 4294967296 (4096.0MB)
             used     = 188289400 (179.56676483154297MB)
             free     = 4106677896 (3916.433235168457MB)
             4.383954219520092% used
           
          23604 interned Strings occupying 2341024 bytes.
          jstack 查看 jvm 線(xiàn)程運(yùn)行信息,上傳到 fastthread.io 這個(gè)網(wǎng)站,直觀地看一下,一看線(xiàn)程有點(diǎn)多。
          一個(gè)線(xiàn)程需要占用大約 1M 的空間吧,而且不是占用 jvm 的內(nèi)存空間,而是會(huì)占用操作系統(tǒng)空閑的內(nèi)存空間。
          我們的機(jī)器內(nèi)存是 8G,堆內(nèi)存占了 6G,線(xiàn)程數(shù)這么多快超過(guò) 2G 了,再加上操作系統(tǒng)里其他程序占用的內(nèi)存,內(nèi)存告警很正常,甚至可能 OOM。
          所以,一方面我們可以減少線(xiàn)程數(shù),另一方面可以把堆內(nèi)存配置得小一點(diǎn),使得堆內(nèi)存加上線(xiàn)程占用的操作系統(tǒng)內(nèi)存,不要超過(guò) 8G。
           

          一些無(wú)法本地 debug 的調(diào)試技巧





          有的時(shí)候線(xiàn)上忘記在關(guān)鍵節(jié)點(diǎn)打日志了,會(huì)導(dǎo)致一些問(wèn)題,比如不知道方法入?yún)⒌闹担恢滥撤椒ㄖ芯唧w某一步的耗時(shí)。
          我一般用阿里的一款賊牛逼的工具 arthas 來(lái)排查。
          先申請(qǐng)個(gè)線(xiàn)上機(jī)器的接近 root 的權(quán)限,然后把 arthas 工具下載到機(jī)器上,可以直接機(jī)器上下載:
          wget https://alibaba.github.io/arthas/arthas-boot.jar
          使用 watch 命令可以實(shí)時(shí)觀察一個(gè)方法的入?yún)⒑统鰠ⅰ?/span>
          使用 trace 命令可以跟蹤某個(gè)方法的耗時(shí),而且可以深入這個(gè)方法所調(diào)用的方法的各個(gè)耗時(shí)。
          當(dāng)然我就只用這倆功能,用作忘記打日志時(shí)的臨時(shí)方案了,屬于高射炮打蚊子。
          實(shí)際上人家的功能超級(jí)強(qiáng)大,比如 dashboard 全局監(jiān)控,thread 查看所有線(xiàn)程信息,包括狀態(tài)和 CPU 使用率,thread -b 甚至可以直接定位到死鎖信息,jad 命令進(jìn)行反編譯,ognl 命令查看某一個(gè)對(duì)象的具體值,大家可以去網(wǎng)上學(xué)習(xí)下。
          今天先介紹這么多,唯一目的就是讓我面試再被問(wèn)到這個(gè)問(wèn)題時(shí),不至于大眼瞪小眼,至于深入嘛,以后再說(shuō)吧,祝我面試加油!等我忙完這段時(shí)間,給大家好好整幾篇文章!
          瀏覽 41
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美A一页 | 国产成年无码久久久久毛片 | 色婷婷香蕉在线一区二区 | 一区在线视频观看 | 成人网视频在线 |