Linux的基礎(chǔ)命令
一些簡(jiǎn)單的常見的我就不跟大家一一列舉出來了,這個(gè)直接百度一下就全部都有了
文件相關(guān)命令
ls :顯示當(dāng)前目錄下所有的文件
ls -a :列出所有文件蛋哭,包括以 "." 開頭的隱含文件。
ll :顯示當(dāng)前文件或目錄的詳細(xì)信息轿塔,含有時(shí)間席噩、讀寫權(quán)限、大小法梯、時(shí)間等信息,等于是 ls -l 命令
du :用于顯示目錄或文件的大小犀概。一般用來查看文件的大小立哑,比如說看一些dump的日志的文件的大小
du -sh * :查詢當(dāng)前目錄下所有的文件的大小以K,M姻灶,G為單位铛绰,提高信息的可讀性。
場(chǎng)景:查看服務(wù)器中一個(gè)文件(比如日志)大小产喉,在刪除磁盤文件的時(shí)候能有一個(gè)對(duì)比捂掰,那個(gè)文件占用磁盤最大
cat :輸出當(dāng)前文件內(nèi)容。
場(chǎng)景:一般就是用來查看當(dāng)前文件的內(nèi)容曾沈,比如說要看下服務(wù)器的啟動(dòng)service.sh腳本文件中的內(nèi)容(cat service.sh)
擴(kuò)展:cat -n fileName 輸出文件內(nèi)容并且在前面加上行號(hào)这嚣。
擴(kuò)展:cat -b fileName 輸出文件內(nèi)容并且在前面加上行號(hào),與上面的不同是會(huì)過濾空白行塞俱。
擴(kuò)展:cat -n textfile1 > textfile2 把 textfile1 的文檔內(nèi)容加上行號(hào)后輸入 textfile2 這個(gè)文檔里姐帚。
more :跟cat差不多,但是有一個(gè)優(yōu)點(diǎn)就是展示出來的是按照頁的形式出來障涯,可以接著按space空格鍵向下翻頁
擴(kuò)展:more -num 一次顯示行數(shù)罐旗。
擴(kuò)展:more +num 從第num行開始顯示。
chmod :修改當(dāng)前用戶對(duì)文件的權(quán)限
r=4,w=2,x=1唯蝶,所以想要rxw 讀寫和可執(zhí)行權(quán)限九秀,那就是4+2+1=7,而一個(gè)位數(shù)表示一個(gè)角色粘我,chmod a=rwx txt1.txt就可以理解為就是 chmod 777 txt1.txt
u 表示該文件的擁有者鼓蜒,g 表示與該文件的擁有者屬于同一個(gè)群體(group)者,o 表示其他以外的人涂滴,a 表示這三者皆是
- 表示增加權(quán)限、- 表示取消權(quán)限晴音、= 表示唯一設(shè)定權(quán)限
r 表示可讀取柔纵,w 表示可寫入,x 表示可執(zhí)行
場(chǎng)景:chmod這個(gè)命令實(shí)用比較廣泛锤躁,但是說白了就是一點(diǎn)更改文件權(quán)限搁料,但是權(quán)限這個(gè)東西怎么加,是加所有用戶還是其他?是加讀寫還是去除讀寫郭计?這個(gè)就需要理解 u霸琴、g、o昭伸、a梧乘、+、-庐杨、=选调、r、w灵份、x等含義
擴(kuò)展:chmod ugo+r txt1.txt 或者 chmod a+r txt1.txt 設(shè)置txt1.txt 對(duì)所有的用戶角色可讀
擴(kuò)展:chmod 777 file 仁堪,chmod也可以用數(shù)字來代表權(quán)限問題,
diff :用于比較文件的差異填渠。
擴(kuò)展:diff log1.log log2.log -y -W 50并排輸出兩個(gè)文件的不同弦聂。
grep :用于查找文件里符合條件的字符串,這個(gè)是最常見的也是日常查詢文件最常用的。
grep 2021-10-27T21 gc.log | grep 25:33
2021-10-27T21:25:33.413+0800: 797616.955: [GC (Allocation Failure) 2021-10-27T21:25:33.414+0800: 797616.955: [ParNew: 848318K->18793K(943744K), 0.0263809 secs] 1283786K->454263K(1992320K), 0.0270603 secs] [Times: user=0.09 sys=0.00, real=0.03 secs]
擴(kuò)展:grep "aaa" log.log -A 10 ,除了顯示符合搜索條件的那一列之外氛什,并顯示該行之后的10行內(nèi)容莺葫。wc
擴(kuò)展:grep "aaa" log.log -B 10 ,除了顯示符合搜索條件的那一列之外,并顯示該行之前的10行內(nèi)容屉更。
擴(kuò)展:grep "aaa" log.log | grep "bb" -A 10,同時(shí)搜索滿足條件以上兩個(gè)條件的結(jié)果徙融,并向下在打印剩下的10行。
擴(kuò)展:grep "aaa" log.log | wc -l瑰谜,統(tǒng)計(jì)滿足條件的的次數(shù)
scp : 命令用于 Linux 之間復(fù)制文件和目錄欺冀。可以用來作為下載文件到本地的一種方式萨脑。scp 是 secure copy 的縮寫, scp 是 linux 系統(tǒng)下基于 ssh 登陸進(jìn)行安全的遠(yuǎn)程文件拷貝命令隐轩。
打開本地系統(tǒng)服務(wù) 文件 遠(yuǎn)程登入 允許訪問 所有用戶
輸入:scp heap.hprof aobing@172.19.36.87:/Users/aobing/Downloads
輸入本機(jī)電腦登入密碼即可,就能顯示當(dāng)前在下載的進(jìn)度了
擴(kuò)展:舉一個(gè)用法的例子渤早,假設(shè)用我自己當(dāng)前電腦作為演示职车,怎么去把我們跳板機(jī)中的dump文件下載到我們本地,以便于我們自己來分析堆棧呢鹊杖?
這個(gè)是比較常用的方法悴灵,可以有其他的用法,就因個(gè)人而已吧
mkdir :用于創(chuàng)建目錄骂蓖。這個(gè)是最簡(jiǎn)單的了积瞒。
擴(kuò)展:mkdir aaaa 創(chuàng)建一個(gè)aaaa文件
kill :刪除執(zhí)行中的程序或工作,這個(gè)需要慎重使用登下,我們可以一般在我們的電腦卡死茫孔,或者我們本地啟動(dòng)tomcat端口被占用了叮喳,但是我們又沒有找到,可以ps查一下進(jìn)程ID缰贝,然后kill一下
擴(kuò)展:kill 14269馍悟,殺死14269這個(gè)進(jìn)程
擴(kuò)展:kill -KILL 14269,強(qiáng)制殺死14269這個(gè)進(jìn)程
擴(kuò)展:kill -9 14269剩晴,徹底殺死14269這個(gè)進(jìn)程
rm :用于刪除一個(gè)文件或者目錄锣咒。在使用這個(gè)命令之前需要注意,不要隨便執(zhí)行這個(gè)命令李破,文件一旦通過rm命令刪除宠哄,則無法恢復(fù)所以可能有時(shí)候不小心刪除某些文件,第二天新聞就出來“杭州某公司丙某因?yàn)閳?zhí)行時(shí)rm -rf命令嗤攻,導(dǎo)致服務(wù)器或者數(shù)據(jù)庫 數(shù)據(jù)丟失 造成嚴(yán)重?fù)p失”
$rm gc.log.20210506151038
rm: remove regular file ‘gc.log.20210506151038’? y
擴(kuò)展:rm gc.log.20210506151038 毛嫉,刪除 gc.log.20210506151038 文件?會(huì)跳出一個(gè)確定提示妇菱,輸入 y承粤,則是刪除
擴(kuò)展:rm -f gc.log.20210506151038,不會(huì)產(chǎn)生確認(rèn)刪除提示闯团,直接刪除文件
擴(kuò)展:rm -rf gc.log.20210506151038辛臊,不會(huì)產(chǎn)生確認(rèn)刪除提示,直接刪除文件,并且會(huì)把當(dāng)前目錄下的所有文件一并刪除房交,非常的暴力彻舰。
gzip :用于壓縮文件。文件經(jīng)它壓縮過后候味,其名稱后面會(huì)多出".gz"的擴(kuò)展名刃唤。當(dāng)服務(wù)器某個(gè)文件過大時(shí),你下載非常的慢白群,所以考慮一下壓縮之后再下載尚胞。
擴(kuò)展:gzip gc.log.20210506151038 ,壓縮一下文件gc.log.20210506151038帜慢,壓縮之后會(huì)生成一個(gè)文件gc.log.20210506151038.gz笼裳,這個(gè)比較簡(jiǎn)單,壓縮完可以使用上面的 ll 或者 du 等相關(guān)命令再查看下文件的大小粱玲。
擴(kuò)展:gzip -<壓縮效率> gc.log.20210506151038 躬柬, 壓縮效率是一個(gè)介于1-9的數(shù)值,預(yù)設(shè)值為"6"抽减,指定愈大的數(shù)值允青,壓縮效率就會(huì)愈高,控制壓縮比例胯甩。
ps :(全拼:process status)用于顯示當(dāng)前進(jìn)程的狀態(tài)昧廷,主要是用來查詢當(dāng)前進(jìn)程的狀態(tài),比如說需要查詢一下當(dāng)前tomcat的相關(guān)信息偎箫,或者說服務(wù)器配置的tomcat的一些啟動(dòng)參數(shù)木柬,都是可以看到。
$ps -ef | grep tomcat
www 383 304 0 00:02 pts/0 00:00:00 grep --color=auto tomcat
www 5579 1 8 Oct22 ? 10:36:09 /opt/vdian/java/bin/java -Djava.util.logging.config.file=/home/www/item-sell/.server/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -server -Xms5g -Xmx5g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xmn2g -XX:MaxDirectMemorySize=512m -XX:SurvivorRatio=8
擴(kuò)展:ps -ef | grep 進(jìn)程關(guān)鍵字淹办,查詢某個(gè)關(guān)鍵字的進(jìn)程眉枕,如下所示,能顯示很多信息怜森。我這里沒有復(fù)制全速挑,自己可以進(jìn)公司的服務(wù)試一下,不會(huì)有問題的副硅。
擴(kuò)展:ps -A姥宝,列出所有的進(jìn)程
擴(kuò)展:ps -aux,顯示所有包含其他使用者的行程
等等還有很多很多恐疲,我就舉出常用的腊满,一一列舉大家不常用也就沒有什么意思。
pwd :用于顯示工作目錄培己,這個(gè)命令就很簡(jiǎn)單了碳蛋, 沒有什么特殊的參數(shù)啥的,就是顯示當(dāng)前目錄地址省咨。
$pwd
/home/www
擴(kuò)展:pwd肃弟,跟簡(jiǎn)單,后面不需再加什么參數(shù)零蓉,顯示一下目錄笤受,方便下我們復(fù)制文件的目錄地址。
source :這個(gè)命令一般就是和點(diǎn)(.)是一樣的效果壁公,就是修改了某個(gè)文件不用重啟感论,而可以立馬生效
擴(kuò)展:source fileName等于. fileName是一個(gè)效果。使改動(dòng)的文件立即生效
tail :用于查看文件的內(nèi)容紊册。通常比如說我們需要查看正在變動(dòng)的日志文件比肄,那就可以用這個(gè)命令了。
擴(kuò)展:tail -f filename囊陡,會(huì)把 filename 文件里的最尾部的內(nèi)容顯示出來芳绩,并且不斷刷新,只要 filename 更新就可以看到最新的文件內(nèi)容撞反。
擴(kuò)展:tail -20f filename妥色,會(huì)把 filename 文件里的最后的20行內(nèi)容顯示出來,并且不斷刷新遏片。
擴(kuò)展:tail -c 20 filename嘹害,顯示文件 filename 的最后 20 個(gè)字符撮竿。
擴(kuò)展:tail -n +20 filename,顯示文件 filename 的內(nèi)容笔呀,從第 20 行至文件末尾幢踏。
以上就是在Linux中我們工作中比較常用的一些命令,以及它們的一些擴(kuò)展许师,當(dāng)然房蝉,這個(gè)并不是全部的,我也只是列出了冰山一角微渠。如果還是沒有滿足你們的日常工作可能就需要你們自己的再去查查資料搭幻,看看書了。
Java中的常見排查問題命令
在工作中都會(huì)多少都會(huì)接觸到一些服務(wù)器調(diào)優(yōu)逞盆,或者說一些線上問題排查檀蹋,這是在面試過程中,面試官比較喜歡問的一個(gè)問題云芦,也是為了考察面試者的思考能力以及動(dòng)手能力和基礎(chǔ)是否扎實(shí)续扔。都說是面試造飛機(jī),進(jìn)去擰螺絲焕数。很多時(shí)候問題都輪不到你來處理纱昧,但是你還是得會(huì)。
之前也有很多學(xué)弟學(xué)妹來給我留言怎么去排查一些線上服務(wù)器問題堡赔,比如說某個(gè)時(shí)間 dubbo線程池滿识脆,內(nèi)存告警,以及OOM等善已。
所以這里主要也就跟學(xué)弟學(xué)妹從三個(gè)方面負(fù)載灼捂、cpu、內(nèi)存 這三個(gè)方面去聊聊换团,怎么通過一些命令去看這些東西悉稠。
負(fù)載
負(fù)載是對(duì)當(dāng)前CPU的工作量的一個(gè)度量,通常負(fù)載越低艘包,說明機(jī)器工作輕松的猛,反之則越累,高負(fù)載的情況下就可能會(huì)出現(xiàn)機(jī)器無法處理其他的業(yè)務(wù)請(qǐng)求了想虎。
查看負(fù)載的命令有很多卦尊,top、uptime 等都可以查看
$uptime
01:13:53 up 319 days, 14:05, 1 user, load average: 0.39, 0.34, 0.39
從這個(gè)信息看舌厨,我們要關(guān)注的 是后面的 load average 顯示的信息
load average:0.39, 0.34, 0.39 這三個(gè)數(shù)字的意思分別是1分鐘岂却、5分鐘、15分鐘內(nèi)系統(tǒng)的平均負(fù)荷
user:1 user,當(dāng)前一個(gè)用戶登入
前面顯示的信息就是服務(wù)器啟動(dòng)到現(xiàn)在已經(jīng)有多長(zhǎng)時(shí)間了躏哩。
top 命令是比較常見的署浩,也是最常用的,因?yàn)樗@示的信息也是最全的扫尺。
$top
top - 01:19:56 up 319 days, 14:11, 1 user, load average: 0.13, 0.25, 0.35
Tasks: 145 total, 1 running, 144 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.8 us, 0.9 sy, 0.3 ni, 95.6 id, 0.1 wa, 0.0 hi, 0.2 si, 0.2 st
KiB Mem : 8173324 total, 142188 free, 5861548 used, 2169588 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1634952 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7704 www 20 0 9714024 4.824g 5932 S 27.6 61.9 3717:34 java
2150 root 30 10 785008 58672 35804 S 1.7 0.7 3254:22 polaris-agent
16043 www 20 0 3800732 402604 3788 S 0.3 4.9 603:29.85 java
1 root 20 0 43536 3396 1948 S 0.0 0.0 56:12.32 systemd
這里可以看到除了顯示平均負(fù)載的情況下還能顯示 CPU相關(guān)信息瑰抵。還有每個(gè)進(jìn)程占用的資源情況。
針對(duì)負(fù)載的問題器联,我們?cè)趺茨艽_定負(fù)載當(dāng)前是高還是低?
一般來說只要負(fù)載超過0.7可能就表示當(dāng)前負(fù)載有點(diǎn)高了婿崭,需要排查一下拨拓,這個(gè)是針對(duì)單核CPU來說的,如果是多核CPU來說氓栈,我們就是CPU核數(shù)乘以0.7來計(jì)算的渣磷。
在top顯示的進(jìn)程信息的時(shí)候,我們可能看到當(dāng)前進(jìn)程中 7704這個(gè)進(jìn)程 占用CPU最高授瘦,而且是我們的Java進(jìn)程
假設(shè)現(xiàn)在是CPU被這個(gè)進(jìn)程占用百分之90醋界,那我們就可以重點(diǎn)排查一下這個(gè)進(jìn)程到底在做什么導(dǎo)致CPU占用這么高
$top -Hp 7704
top - 01:33:05 up 319 days, 14:24, 1 user, load average: 0.12, 0.23, 0.31
Threads: 651 total, 5 running, 646 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.1 us, 0.8 sy, 0.3 ni, 96.4 id, 0.1 wa, 0.0 hi, 0.3 si, 0.1 st
KiB Mem : 8173324 total, 143612 free, 5862648 used, 2167064 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1633376 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9046 www 20 0 9714024 4.824g 5932 S 4.6 61.9 13:12.99 java
8415 www 20 0 9714024 4.824g 5932 R 2.6 61.9 442:19.10 java
8418 www 20 0 9714024 4.824g 5932 R 2.6 61.9 424:18.67 java
top -Hp 是查看當(dāng)前進(jìn)程中的所有的線程情況,同樣的可以看到 9046 這個(gè)線程占用比較高提完,那么我們?cè)俳又治鲞@個(gè)線程在處理什么邏輯就可以了形纺。
$printf %s 9046
2356
使用printf命令查看這個(gè)線程的16進(jìn)制
最后使用jstack命令查看當(dāng)前線程正在執(zhí)行的什么方法
$jstack 7704 | grep -A 10 2356
"DubboServerHandler-10.33.130.247:2201-thread-154" #867 daemon prio=5 os_prio=0 tid=0x00007f4ef005a800 nid=0x2356 waiting on condition [0x00007f4ec1acf000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000708513d48> (a java.util.concurrent.SynchronousQueueTransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueueWorker.run(ThreadPoolExecutor.java:617)
從這里就能大致做一個(gè)分析了,但是這個(gè)不一定都能確定出來問題徒欣,但是能給我展示出一些有用的信息逐样。具體的還需要我們?cè)偃タ聪逻@里執(zhí)行了什么方法。
再或者我們直接使用 jmap 來dump內(nèi)存打肝。
CPU
在看CPU信息的時(shí)候主要關(guān)注的點(diǎn)就是CPU的使用率脂新。
在上面使用top能查看CPU的使用情況之后,還有一個(gè)vmstat命令粗梭,這個(gè)命令有一個(gè)好處可以看到內(nèi)存使用争便,虛擬內(nèi)存還有IO等信息。
$vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 172572 0 2133780 0 0 1 51 0 0 4 1 95 0 0
us:用戶進(jìn)程執(zhí)行時(shí)間百分比(如果當(dāng)前值比較高断医,說明用戶進(jìn)程消耗高)
sy:內(nèi)核系統(tǒng)進(jìn)程執(zhí)行時(shí)間百分比(如果系統(tǒng)比較高滞乙,那么你可以找運(yùn)維了)
id:空閑時(shí)間百分比
wa:IO等待時(shí)間百分比(如果IO時(shí)間長(zhǎng),那說明機(jī)器在大量的處理磁盤的讀寫操作鉴嗤,這個(gè)也是關(guān)注的重點(diǎn)酷宵,可能寫日志啊等都有可能)
st:虛擬 CPU 等待實(shí)際 CPU 的時(shí)間的百分比
所以觸發(fā)CPU高的場(chǎng)景也有很多,這個(gè)CPU高可能只是一個(gè) “果的關(guān)系”躬窜,具體的“因”是啥還需要在進(jìn)步排查浇垦,比如說再用top,按上面的思路再看下荣挨。
內(nèi)存
內(nèi)存是保證我們程序能正常運(yùn)行的關(guān)鍵男韧,這個(gè)也是需要我們查看的一個(gè)關(guān)鍵指標(biāo)數(shù)據(jù)朴摊。
查看內(nèi)存的命令除了上面的top之外還有一個(gè)free來查看內(nèi)存數(shù)據(jù)。細(xì)心的人應(yīng)該發(fā)現(xiàn)了top命令真的展示信息最全了此虑。當(dāng)然我們還是主要分析一下這個(gè)命令展示的數(shù)據(jù)甚纲,以及怎么分析這些數(shù)據(jù)痰腮。
$free
total used free shared buff/cache available
Mem: 8173324 5870868 126448 401812 2176008 1625028
Swap: 0 0 0
Mem行凿宾,顧名思義也就是展示內(nèi)存的使用情況
total:表示物理內(nèi)存總大小
used:已經(jīng)被使用的物理內(nèi)存和交換空間
free:表示未被分配的內(nèi)存
shared:共享使用的物理內(nèi)存大小
buff/cache buffer 和 cache 使用的物理內(nèi)存大小
available:當(dāng)前剩余實(shí)際可用內(nèi)存(還可以被應(yīng)用程序使用的物理內(nèi)存大谐痴啊)
Swap:這個(gè)被稱之為交換區(qū)铸题,當(dāng)系統(tǒng)內(nèi)存不夠使用時(shí)秘案,釋放磁盤內(nèi)存货裹,來保證當(dāng)前運(yùn)行的程序能正常使用(Linux會(huì)將一些不常訪問的數(shù)據(jù)保存在交換區(qū)腰吟,但是目前一般不會(huì)配置)趟大。
Total:Swap內(nèi)存總大小
Used:已分配的Swap大小
Free:未被分配的內(nèi)存
所以在查看內(nèi)存的時(shí)候我們還是不能不能確定這個(gè)因果關(guān)系恩伺,在出現(xiàn)問題的時(shí)候赴背,如果我們沒有一個(gè)很好的思路,就先看看這三個(gè)指標(biāo)晶渠,可以通過一些排除法來給我們一些思考凰荚。
但是現(xiàn)在我們最常用的基本都是看top 一下看看各個(gè)指標(biāo),如果確定是Java進(jìn)程的問題褒脯,很多時(shí)候都會(huì)去dump一下內(nèi)存便瑟,來分析一下對(duì)象信息。如果有很多大對(duì)象番川,一直被引用那就具體看代碼了胳徽。一般的問題大部分都是因?yàn)槲覀兊拇a引起的。
Arthas
說到dump內(nèi)存爽彤,常見的可能就是使用jmap 命令來處理养盗,但是這里跟大家分享一個(gè)新的阿里開源的工具Arthas。
Arthas 是Alibaba開源的Java診斷工具适篙,深受開發(fā)者喜愛往核。在線排查問題,無需重啟嚷节;動(dòng)態(tài)跟蹤Java代碼聂儒;實(shí)時(shí)監(jiān)控JVM狀態(tài)。
我個(gè)人覺得也確實(shí)是蠻好用的硫痰。官方文檔:https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn
首先就是先安裝一下
$curl -O https://arthas.aliyun.com/arthas-boot.jar
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 138k 100 138k 0 0 420k 0 --:--:-- --:--:-- --:--:-- 421k
啟動(dòng)
$java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.5.4
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
- [1]: 20851 /home/www/xxxxx/xxxx.14_75b3f783befda28c22c6ce8b48d7f41b_prod.jar
[2]: 6152 com.xxxx.xxxx.xxxx.main.Main
這里看到會(huì)有兩個(gè)應(yīng)用但是我們需要進(jìn)入Java應(yīng)用衩婚,所以直接按2,進(jìn)入效斑。
因此如果需要dump堆棧內(nèi)存只要一個(gè)命令就可以了
dump到指定文件
heapdump /tmp/dump.hprof
只dump live對(duì)象
heapdump --live /tmp/dump.hprof
在dump堆棧的時(shí)候是會(huì)觸發(fā)fullGC的這個(gè)需要注意一下非春,一般針對(duì)這有問題的機(jī)器,可以先把這個(gè)機(jī)器offline掉,這樣流量進(jìn)不來奇昙,保證平臺(tái)先“止血“护侮。
在獲取到堆棧信息之后那就是分析堆棧了,可以MAT储耐、Jprofiler等羊初,但是還有一個(gè)簡(jiǎn)單的輕小的gceasy也可以去分析一個(gè)堆棧信息。
還有一個(gè)我們比較常用的功能就是分析我們方法的耗時(shí)問題什湘。
假設(shè)現(xiàn)在我們有個(gè)方法长赞,里面有很多子方法,包含很多rpc掉用闽撤,以及很多很多的業(yè)務(wù)邏輯在里面得哆,那我們?cè)趺慈カ@取每個(gè)子方法的耗時(shí)呢?
針對(duì)相信上面的問題腹尖,很多人都會(huì)想到先用System.currentTimeMillis()來獲取當(dāng)前時(shí)間,然后每執(zhí)行一個(gè)方法在減去開始的時(shí)間以此來得到一個(gè)時(shí)間差伐脖,再用日志打印出來热幔。這樣雖然是可行的,但是非常的麻煩讼庇。Arthas里面有一個(gè)trace命令就能幫我處理這個(gè)問題绎巨。
[arthas@6152]AppClassLoader@18b4aac2
`---[3.939696ms] com.xxx.xx.xx.service.ItemSnapshotService:saveFullSnapshot()
+---[0.047704ms] com.xxx.xx.xx.service.ItemSnapshotService:$jacocoInit()
+---[0.014779ms] com.xx.xx.xx.xx.snapshot.ItemSnapShot:getItemId() #304
+---[0.008545ms] com.xxx.xxx.xx.x.snapshot.ItemSnapShot:getOperateTime() #305
+---[0.306668ms] com.xx.xxx.xx.service.ItemSnapshotService:buildRowKey() #306
+---[0.006373ms] com.xxx.xx.xxx.domain.snapshot.ItemSnapShot:getAfter() #307
+---[0.004874ms] com.xx.xx.xx.domain.snapshot.ItemSnapShot:getBefore() #307
+---[0.058562ms]
展示結(jié)果如上所示,還有能做過濾啊蠕啄,統(tǒng)計(jì)次數(shù)啊等等一些功能场勤。