標籤:linux java linux實操 java進階
Java的生產系統,最常用的是Linux,所以當解決生產系統問題時,理解Linux系統,熟練掌握常用命令,對於解決問題,甚至對從更高層次理解Java,都是很有協助的。
那麼,應該怎麼學Linux呢?上周五聽了一次高手講座,對於學習的串聯、銜接、進階,都是很有協助的,所以分享到這裡來。
本次講座,先走馬觀花串一遍Linux命令,讓其可以輔助我們的工作。但是不僅僅是講幾個命令而已,而是希望能看清楚一些作業系統層面上的事,達到理解和境界思想上的提升。
理解是靈魂,串講是骨架,然後可以自行豐滿血肉,這是目的。
本次講座,特別適合“有一定理解,但是不深刻,或者恰恰處於進階邊緣”這種情況的人,一講,一串,醍醐灌頂,理解會立刻深了一層。
1、strace
strace常用來跟蹤進程執行時的系統調用和所接收的訊號。
strace -T -t -f java Test >out 2>&1
strace -T -t -f p pid
通過這個工具,我們可以看到當Java程式,或者任何一種程式在Linux系統上運行時,實際上都是被分解成Linux API的。
講這個命令的目的,是提示我們,可以用一種方式,用一種工具,比如strace,去理解我們的程式的運行。
語言,不論在哪種平台運行,最後都是要分解成作業系統API,分解成CPU指令。這是思維的進階,或者日常應用系統開發多了,忘記了曾經的本質。
2、進程
pstree 是Linux的進程體系。
ps 是系統某個時刻的進程切面,代表某個時刻有多少個進程在運行。
因為在Linux下,包括進程、Socket等,都是以檔案的形式存在的,記憶體中的。我們可以通過ps找出進程id,然後通過“運行時檔案系統”,查看進程的任何資訊。
從作業系統層面評鑑進程的資訊(路徑、jar、串連等),是完全準確的,比從設定檔裡面查詢準確,也不需要問別人。
ps -ef | grep catalina
cd /proc/60282/fd
可以進一步查看更多內容,比如:
a、寫多少日誌:ll | grep log
b、啟動要那些jar:ll | grep jar
c、看到那些一閃一閃的了嗎?那些是socket,代表誰連我了:ll | grep socket
d、對於這些socket控制代碼,我們可以進一步查看是什麼進程:lsof | grep 387084
3、記憶體+CPU
top,這是應該極熟的Linux命令,是Linux下常用的效能分析工具,能夠即時顯示系統中各個進程的資源佔用狀況,其顯示的內容,和Windows的工作管理員是一樣的。
free ,查看記憶體使用量情況。
我們也可以在Windows下使用jvisualvm,以圖形化的方式,查看Java應用的記憶體,線程,也可以把線程dump下來,比如,Test應用運行方式如下:
java -Dcom.sun.management.jmxremote.port=9998 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.80.128 Test
則可以在本地通過jvisualvm監控進程情況,在命令列輸入jvisualvm,遠程,串連ip地址,之後右鍵這個遠端連線,建立JMX串連,輸入連接埠,則可以監控這個遠程java進程了,如下:
4、網路
netstat -anop | grep LIST 可以查看,都啟動了那些連接埠,比如:
第六列“2489/mongod”,進程號2489,是mongod進程,在27017連接埠監聽mongo接入。
netstat -anop | grep EST 可以查看,連接埠都被誰連著呢,比如:
第4列,代表自己的IP和連接埠;第5列,對標對方的IP和連接埠;第6列,代表進程號和啟動進程的應用。
其他常用的:
strace -T -t -e network,poll curl www.baidu.com 我們可以看到從我們的機器,到百度的伺服器,經過的路由路徑
cat /etc/resolv.conf 可以看到網域名稱解析伺服器的順序
cat /etc/hosts The static table lookup for host name(主機名稱查詢靜態表)
5、線程
top -p 59851 shift+H,查看59851進程,有多少個線程。
第一列PID,線程ID,換算成16進位,就是線程棧中的NID。
我們可以使用 jstack -l 59851查看,整個進程的資訊,也可以使用jstack -l 59851 | grep NID,只看一個線程棧的資訊。
很多時候,查看問題的時候,都需要找出佔用資源最多的線程,然後查看這個線程的線程棧資訊。
這幾個步驟,操作起來很容易,其實最最關鍵的是,線程棧dump下來了,要看得懂。
6、GC
Linux下一個進程裡面的線程,都是共用記憶體的,所以當分析記憶體時 ,要看進程。
jstat -gccause 59851 1000 jstat,即JVM Statistics Monitoring Tool,用於收集HotSpot虛擬機器各方面的運行資料
我們不怕YGC,YGC很頻繁,很快,系統耗時極短,微妙級,對於使用者來說是沒有感覺的;
但是FGC要注意,FGC進行的時候,JVM是假死的,只進行FullGC,不處理其他請求,可能會持續幾秒,FGC太多,說明YGC回收不了,太多的對象進入老年代,很快佔滿,系統肯定有問題的。
java -XX:+PrintFlagsInitial ,可以查看JVM的參數配置情況,比如,預設情況下,我們可以看到,Survior:Eden = 1:8,New:Old = 2:1。
jmap -histo 59851 | more Memory Map for Java,產生虛擬機器的記憶體轉儲快照(heapdump檔案)
通過jmap,可以找出系統中可能有安全隱患(比如太多而不能回收)的對象。
通過這些手段,不用分析代碼,不用停機,就可以找出問題,解決問題。
jps、jstat、jstack、jmap,這些不是Linux命令,而是JDK寫好的放在rt.jar裡面的用於輔助診斷的Java APP。
GC是Java程式員的基本功,應該理解的很清晰。
7、dstat和iftop
情境1:示範通過sftp上傳檔案
可以在top中看到sshd和sftp耗費CPU資源很大,因為sftp是基於sshd的;可以在dstat中看到,receive流量很大。
情境2:示範http請求百度首頁,通過ss5代理壓測,在ss5機器中,dstat顯示的send和recv幾乎一樣。
和我們通常理解的,應該會有很少的發出資料,和很多的接收資料不一致。原因是:
這種理解不對的,作為ss5代理的機器,既從遠端接收到大量資料,同時把接收到的大量資料,轉寄給它所代理的機器,所以有這個網路現象。
這個時候,我們通過iftop,則可以清楚的看到IP到IP的發出發入資料包。
所以,知道,藉助於工具,基於Linux的知識,基於Java的知識,定位問題,找出問題,是很關鍵的。
iftop 是第三方的,是一個即時資料流量監控工具:
主要用來顯示本機網路流量情況及各機器相互連信的流量集合,如單獨同那台機器間的流量大小,非常適合於Proxy 伺服器和iptables伺服器使用。
官方網站:http://www.ex-parrot.com/~pdw/iftop/。
安裝步驟:
yum -y install flex byacc libpcap ncurses ncurses-devel libpcap-devel
wget http://soft.kwx.gd/tools/iftop-0.17.tar.gz #獲得軟體包
tar zxvf iftop-0.17.tar.gz #解壓
cd iftop-0.17 #進入目錄
./configure #使用預設配置
make && make install #編譯並安裝
如果libpcap封裝不上的話,需要到http://pkgs.org/自行下載rpm進行安裝。
dstat是Linux內建的,可以yum安裝。
dstat:
iftop:
8、“|” 管道。串連、過濾,這是管道的作用,就像串連千家萬戶的自來水管
管道操作符,按行給資料,一行一給,把上個命令的輸出,變成下個命令的輸入。
經常使用的參數-c ,類似於 SQL中的group by。
在linux中,要把記錄檔,當成資料庫表,記錄檔也是有行有列的。日誌要標準,要有規律,就會很方便的分割尋找。
我們可以藉助less、more、cat、sort、uniq、grep、awk等命令,很方便的分析日誌。
另外,awk是一個強大的文本分析工具,awk在對資料分析並產生報告時,很強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符號將每行切片,切開的部分再進行各種分析處理。
9、其他常用命令
df -h 顯示磁碟分割使用方式
du -sh /root/temp 顯示某個檔案夾的大小
find /root/temp -type f -name "*.txt" | xargs grep "main" 在/root/temp目錄下,在普通檔案中,在副檔名為txt的檔案中,尋找含有main字串的行
lsof -l 顯示所有的socket控制代碼
sed 檔案內容尋找和替換
vim 文字編輯器,常用就會熟悉。開始的時候記錄最常用的,比如,翻屏:CTRL+U(D),2gg,3dd,3dw,yy,/尋找,?尋找。
10、學會分析錯誤的思路
學會錯誤的類比重現,會類比重現就能解決。類比重現的手段:可以開發一些品質差的代碼,把錯誤做出來。
工具只是協助我們定位問題的,幫我們記錄發生問題時的作業系統切面,要理解這個切面所代表的意義、所隱含的異常,還需要對相關基礎知識的深刻瞭解。比如:
- 用jstat看GC,需要對Java的記憶體管理、垃圾收集技術深入瞭解;
- 用netstat看網路,需要對網路知識,特別是TCP,有深入瞭解;
- 用jstack轉儲線程棧,需要對Java線程的知識,有深入瞭解。
Linux&java實操串聯-進階指南