線上問題排查命令

性能類

診斷

  • uptimejava

  • topios

  • vmstat 1編程

  • iostat 1網絡

  • dstatless

  • pidstat 1jsp

  • sar -n DEV 1maven

  • free -mtcp

網絡

  • netstat -nltp
  • netstat -anpt
  • netstat -ntp | grep ‘TIME_WAIT’ | awk ‘{print 5,6}’ | awk -F ‘:’ ‘{print 1,2}’ | awk ‘{print 1,3}’ | sort | uniq -c | sort -k 1 -n -r
  • netstat -nt | grep 11300 | awk ‘{print 5}' | awk -F ':' '{print1}’ | sort | uniq -c 查看某個端口號的鏈接的主機數量統計
  • lsof -i:8080
  • lsof -p pid

load

io

磁盤

  • df -h
  • du -h

gc

  • jps
  • jps -l
  • jps -lv工具

  • jinfo -flags pidoop

  • jstat -gcutil pid 1s

  • jstat -gccause pid 1s
  • 查看gc.log

  • jstack -l

  • 查看某個進行內佔用cpu最多的進程 
    top -Hp pid 
    找到後,轉換成16進行 printf ‘%x\n’ pid,如printf ‘%x\n’ 8241 獲得2031 
    再在jstack 結果中查找這個線程號對應的線程是什麼
  • jstack -l 中查看是否有死鎖 #TODO

  • jmap -histor pid

  • jmap -histo:live pid
  • jmap -histo:live pid | less
  • jmap -heap pid
  • dump 內存文件 jmap -dump:format=b,file=dump.bin,live 8176

tcp

  • ifconfig查看有哪些網卡和相應的參數,ip,mtu等
  • netstat 類 TODO
  • 有root權限時,能夠執行tcpdump 
    tcpdump -i eth0 tcp port 8888
  • 查看TCP參數 
    less /etc/sysctl.conf

查看多臺機器的工具

  • polysh

代碼類

拋異常

編寫代碼時要在關鍵的位置 
* 調用外部服務、遠程方式的參數、結果上打印log 
* 一些關鍵的步驟,打印參數等 
* 異常處理的地方,打印參數,異常棧 
這樣就能夠在程序拋出異常的時候,經過異常棧以及咱們打印的參數快速的判斷是哪裏出現了問題。

防護式編程

  • 不要對外來的參數作假設,不要假設外部參數不是null或者其中任意一個屬性不是null,都要進行判斷,能夠 
    經過Preconditions類或StringUtils.isNotEmptyCollectionUtils.isNotEmpty等進行 
    防護
  • 在循環處理的地方,若是但願其中一個循環出錯不影響其餘循環的執行時,要在循環內部catch
for (e in loop) {
    try {
        do loop
    } catch (Exception e) {
        log and exception handle
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 防護式拷貝 
    Defensive copy. 當一個方法返回一個對象時,咱們要考慮外部調用方可能會修改這個對象的值,致使其餘引用這個對象的地方 
    觀察到狀態改變。這種隱含的變化可能帶來bug。經過defensive copy,返回一個新的對象,避免了共享對象。可是要注意的是, 
    copy也有深度copy和淺copy。另外一種方式是返回一個不可修改的集合,如Collections.unmodifiableCollection等。

啓動類

java啓動報錯

常常出現的狀況是,在本地開發沒有問題、或是在staging測試也沒問題,部署到線上啓動就報錯了。 
這個時候仍是須要在編寫代碼時就提早注意,有哪些用到了依賴於環境的地方 
如 
* 服務依賴,各個環境的服務配置、服務是否存在 
* 端口,是否和已有的程序的端口衝突了 
* 權限,寫文件或者日誌目錄是否有權限

另外還有maven引用jar包衝突的,會出現NoSuchMethodError等錯誤 
這個時候,找到哪一個類的版本不一致,在代碼中找到對應的依賴的jar包 
經過mvn dependency:tree | grep 進行查看有哪些地方引入了jar包  maven 採用的是按照聲明順序靠前的使用。  當能夠進行必定的調試時,只在staging環境或者有一個jsp頁面能夠調用java代碼,  可使用Class.forName(「xxx」).getClassLoader XXX.class.getResource(「xxx.yy.ZZZ」)來查看用的是那個地方的class文件  也能夠解壓jar包,使用javap -v -p -c 查看class文件內容  另外還有一些工具,像BTrace、housemd、greys來幫助咱們線上調試

相關文章
相關標籤/搜索