Linux&java實操串聯-進階指南

來源:互聯網
上載者:User

標籤: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實操串聯-進階指南

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.