效能優化思路與具體問題分析過程
分散式主要解決兩個問題:路由+備份;MySQL資料庫叢集:採用主從架構,master上面的binlog會同步到slave節點上面apply;redis叢集的主備與之類似;
計算機技術歸根結底都是在解決一個key value對應關係;分而治之思想無處不在,MR思想等,其實生活中分治思想無處不在。
GC和鎖是Java兩大死穴,GC可以採用對外記憶體方式解決;鎖,可以採用資料多版本思想,例如Oracle資料庫中的資料多版本。
問題分析過程:
多次執行jstack看看最後部分,鎖著的程式碼
jstat -gcutil 28232 2000
這三列重點監控,一個是年老代的暫用百分百,還有Full GC的次數和耗時
在程序中加入引數,記錄gc歷史
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log
上圖中->之前表示回收之前大小,之後表示回收之後大小。
一份已經存在的程式碼,執行時佔用記憶體偏高,或者丟擲OutOfMemoryError(OOME)
用jmap得到程序的執行時記憶體映象 jmap -dump:live,format=b,file=jmap.dat ${PID},其中-dump:live表示堆中活動物件,這個限定要分析物件範圍。
用jhat進行記憶體分析 jhat -J-Xmx4g jmap.dat,會啟動後會建立一個http server,埠為7000,之後通過瀏覽器檢視統計資料並分析問題,一般是第一個連結進去就能查詢到比較多的物件。
上圖由下圖中的連結地址跳轉過來
當top命令看到系統的sys時間較高,想了解程式碼的實際執行內容:檢視用什麼引數打開了什麼檔案、讀取寫入的內容、socket引數等等
可以用strace分析工具跟蹤程序及其子程序的系統呼叫,即# strace -fF -p ${PID} -o strace.log,跟蹤新啟動程序# strace -fF -o strace.log 要執行的命令。
網絡卡監控netstat -ant著重參考下標註
其他常用命令:iostat nload tcpdump
tcpdump -nn -i eth0 -xX -s 0 tcp and port 2181
-nn 制定抓包時不需要反解各個IP的域名
• -i 指明要偵聽的網路介面,需要注意的是如果是本機連本機的話,即便是用的不是”127.0.0.1”,也是走的lo介面
• -xX 說明需要顯示包的內容,預設是不顯示的
• -s 0 指定每個包內取多少位元組,0表示無上限,預設是128位元組