1 日志分析常用命令
-
cat 適合日志文件比較少,不能分頁
- -n參數(shù)顯示行號
-
more 支持分頁
- Enter 下一行
- 空格 下一頁
- F 下一屏
- B 上一屏
-
less 支持分頁城瞎,內(nèi)容查找险绘,高亮
- -N 顯示行號
- Q 推出
- Shift + G 跳到最后
- /關(guān)鍵字 向下搜索
- ?關(guān)鍵字 向上搜索
- n 搜索后,前一個關(guān)鍵字
- N 搜索后,后一個關(guān)鍵字
- b 上一頁
- 空格 下一頁
- d 下半頁
- u 上半頁
-
tail 顯示文件尾
- -n 顯示最后幾行
- -f 持續(xù)顯示文件新增的行
-
head 顯示文件頭
- -n 顯示開頭幾行
-
wc 統(tǒng)計指定文件中的字符數(shù)、字數(shù)、行數(shù)偎肃,并輸出統(tǒng)計結(jié)果
- -l 統(tǒng)計行
- -c 統(tǒng)計字節(jié)
- -L 顯示最長的行長度
-
grep 字符串查找
- -c 計算符合樣式的列數(shù)
- grep 11 access.log 查找指定符合查找字符串的行
-
find 文件查找
- -name 指定名稱
- find /home -name "*.txt"
- 參考
1.1 日志分析腳本
- sed編輯器
- sed [options] 'command' file(s)
- command 為具體的文本編輯命令
- file為輸入的文件。
- -n 僅顯示 處理后的結(jié)果
- 動作說明
- p 打印浑此,亦即將某個選擇的數(shù)據(jù)印出累颂。通常 p 會與參數(shù) sed -n 一起運行
- sed -n '/開始時間日期/,/結(jié)束時間日期/p' spring.log
- sed -n '/2020-09-02 08/,/2020-09-02 09/p' share-provider-isc.log
- sed -n '/2020-09-02 08/,/2020-09-02 09/p' share-provider-isc.log | grep INFO
- sed [options] 'command' file(s)
2 監(jiān)控指標
2.1 load
- 定義 特定時間間隔內(nèi)運行隊列中的平均線程數(shù)
- 每個CPU的核都維護了一個運行隊列,系統(tǒng)的load主要由運行隊列來決定
- 假設(shè)一個CPU有8個核凛俱,運行的應(yīng)用程序啟動了16個線程紊馏,并且這16個線程都處于運行狀態(tài),那么在平均分配的情況下蒲犬,每個CPU的運行隊列中就有2個線程在運行朱监。假設(shè)這種情況維持了1分鐘,那么這一分鐘內(nèi)的系統(tǒng)load值就為2
- load的值越大原叮,也就意味著系統(tǒng)的CPU越繁忙赌朋,這樣線程運行完以后等待操作系統(tǒng)分配下一個時間片段的時間也就越長
- 一般來說,只要每個CPU當前的活動線程數(shù)不大于3篇裁,負載正常
- 如果每個CPU的線程數(shù)大于5,則表示當前系統(tǒng)的負載已經(jīng)非常高了
- load指的是所有核的平均值
- 單核cpu的load=1表示系統(tǒng)一直處在負載狀態(tài)赡若,但是4核cpu的load=1表示系統(tǒng)有75%的空閑
- uptime
- 13:05:49 系統(tǒng)當前時間
- up 44 days 表示系統(tǒng)最后一次啟動后總的運行時間
- 2 users 當前系統(tǒng)中有兩個登錄用戶
- load average: 5.84, 5.79, 5.72 系統(tǒng)的平均負載 达布,1分鐘,5分鐘逾冬,15分鐘的平均負載黍聂。
uptime
13:46:03 up 44 days, 19:22, 2 users, load average: 5.84, 5.79, 5.72
- top 指令 參考
2.2 cpu 利用率
- top | grep Cpu 命令查看
- 按1 查看每個核 cpu利用率
- top –p 2864 -p 選項可以指定查看的進程
- CPU后面跟的各個列便是各種狀態(tài)下CPU所消耗的時間占比
- us 用戶時間 表示CPU執(zhí)行用戶進程所占用的時間,通常情況下希望us的占比越高越好
- sy 系統(tǒng)時間 示CPU在內(nèi)核態(tài)所花費的時間身腻,sy的占比較高产还,通常意味著系統(tǒng)在某些方面設(shè)計的不合理,比如頻繁的系統(tǒng)調(diào)用導(dǎo)致的用戶態(tài)與內(nèi)核態(tài)的頻繁切換嘀趟。
- ni Nice時間 表示系統(tǒng)在調(diào)整進程優(yōu)先級的時候所花費的時間
- id 空閑時間 表示系統(tǒng)處于空閑期脐区,等待進程運行,這個過程所占用的時間她按。當然牛隅,我們希望id的占比越低越好。
- wa 等待時間 表示CPU在等待I/O操作所花費的時間酌泰,系統(tǒng)不應(yīng)花費大量的時間來進行等待媒佣,否則便表示可能有某個地方設(shè)計不合理
- is 硬件中斷處理時間 表示系統(tǒng)處理硬件中斷所占用的時間
- si 軟件中斷處理時間 示系統(tǒng)處理軟件中斷所占用的時間
- st 丟失時間 是在硬件虛擬化開始流行后操作系統(tǒng)新增的一列,表示被強制等待虛擬CPU的時間
top | grep Cpu
%Cpu(s): 19.4 us, 7.2 sy, 0.0 ni, 73.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu(s): 11.6 us, 3.3 sy, 0.0 ni, 84.7 id, 0.3 wa, 0.0 hi, 0.1 si, 0.0 st
2.3 磁盤剩余空間
- df -h
df -h
文件系統(tǒng) 容量 已用 可用 已用% 掛載點
/dev/mapper/cl_docker--temp-root 3.7T 1.5T 2.3T 39% /
devtmpfs 63G 0 63G 0% /dev
tmpfs 63G 0 63G 0% /dev/shm
tmpfs 63G 955M 62G 2% /run
tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/sda1 1014M 264M 751M 26% /boot
/dev/mapper/cl_docker--temp-home 5.0G 33M 5.0G 1% /home
- du -d 1 -h /home
- -d 遞歸深度 1 表示指定目錄下一級目錄
- -h 按文件大小單位的格式化輸出
# du -d 1 -h /home
12K /home/test
12K /home/test2
24K /home
2.4 網(wǎng)絡(luò)traffic 關(guān)注網(wǎng)絡(luò)的流量陵刹,清楚各個節(jié)點的閾值和水位
- sar -n DEV 1 1
- -n 匯報網(wǎng)絡(luò)狀況
- DEV 查看各個網(wǎng)卡的網(wǎng)絡(luò)流量
- 1 表示1s抽取一次默伍,第二個1總共抽取一次
sar -n DEV 1 1
Linux 3.10.0-957.10.1.el7.x86_64 (docker-temp) 2020年09月22日 _x86_64_ (16 CPU)
14時16分56秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
14時16分57秒 vethf141128 0.00 0.00 0.00 0.00 0.00 0.00 0.00
14時16分57秒 vethe06a4e8 0.00 0.00 0.00 0.00 0.00 0.00 0.00
14時16分57秒 veth093cd59 0.00 0.00 0.00 0.00 0.00 0.00 0.00
14時16分57秒 vethf018391 0.00 0.00 0.00 0.00 0.00 0.00 0.00
14時16分57秒 vethd6c0573 1.00 1.00 0.07 0.05 0.00 0.00 0.00
14時16分57秒 veth36e24fe 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- IFACE 網(wǎng)卡 lo是本地回環(huán)網(wǎng)絡(luò)
- rxpck/s 每秒接收的數(shù)據(jù)包數(shù)量
- txpck/s 每秒發(fā)出的數(shù)據(jù)包數(shù)量
- rxkB/s 每秒接收到的字節(jié)數(shù)(KB)
- txkB/s 表示的是每秒發(fā)送的字節(jié)數(shù)(KB)
- rxcmp/s 表示每秒收到的壓縮包的數(shù)量
- txcmp/s 每秒發(fā)送的壓縮包的數(shù)量
- rxmcst/s 每秒收到的廣播包的數(shù)量
2.5 磁盤I/O
- 對于I/O密集型的應(yīng)用來說,比如數(shù)據(jù)庫應(yīng)用和分布式文件系統(tǒng)等,I/O的繁忙程度也一定程度地反映了系統(tǒng)的負載情況也糊,容易成為應(yīng)用性能的瓶頸炼蹦。
- iostat -d -k
- -d選項表示查看磁盤使用情況
- -k選項表示以KB為單位顯示
iostat -d -k
Linux 3.10.0-957.10.1.el7.x86_64 (docker-temp) 2020年09月22日 _x86_64_ (16 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 136.27 708.67 1560.08 2745167173 6043292329
scd0 0.00 0.00 0.00 1028 0
dm-0 201.44 708.66 1560.08 2745125602 6043288082
dm-1 0.00 0.00 0.00 2456 0
dm-2 0.00 0.00 0.00 1513 2138
- Device 設(shè)備名稱
- tps 每秒處理的I/O請求數(shù)
- kB_read/s 每秒從設(shè)備讀取的數(shù)據(jù)量
- kB_wrtn/s 每秒向設(shè)備寫入的數(shù)據(jù)量
- kB_read 讀取的數(shù)據(jù)總量
- kB_wrtn 寫入的數(shù)據(jù)總量
2.6 內(nèi)存使用
- 程序運行時的數(shù)據(jù)加載、線程并發(fā)显设、I/O緩沖等框弛,都依賴于內(nèi)存,可用內(nèi)存的大小決定了程序是否能正常運行以及運行的性能捕捂。
- free -m 參考
- -m 以mb為單位顯示
free -h
total used free shared buff/cache available
Mem: 125G 110G 1.5G 684M 13G 13G
Swap: 257G 57G 200G
total 內(nèi)存總共的大小
used 已使用內(nèi)存的大小
free 可使用的內(nèi)存大小
shared 多個進程共享的內(nèi)存空間大小
buff/cache 列顯示被 buffer 和 cache 使用的物理內(nèi)存大小
available 還可以被應(yīng)用程序使用的物理內(nèi)存大小
Linux 其中有一個思想便是內(nèi)存利用率最大化瑟枫,內(nèi)核會將剩余的內(nèi)存申請為cached,而cached不屬于free范疇指攒。因此慷妙,當系統(tǒng)運行時間較長時,會發(fā)現(xiàn)cached這塊區(qū)域比較大允悦,對于有頻繁文件讀/寫操作的系統(tǒng)膝擂,這種現(xiàn)象更加明顯
free的內(nèi)存小,并不代表可用的內(nèi)存小隙弛,當程序需要申請更大的內(nèi)存時架馋,如果free內(nèi)存不夠,系統(tǒng)會將部分cached或buffers內(nèi)存回收全闷,回收的內(nèi)存再分配給應(yīng)用程序叉寂。因此,Linux可用于分配的內(nèi)存不僅僅只有free的內(nèi)存总珠∑流ⅲ可看free命令顯示的第三行,也就是-/+ buffers/cache對應(yīng)的行
-
對于應(yīng)用來說局服,更值得關(guān)注的應(yīng)該是虛擬內(nèi)存swap的消耗
- swap內(nèi)存使用過多钓瞭,表示物理內(nèi)存已經(jīng)不夠用了.
- 操作系統(tǒng)將本應(yīng)該物理內(nèi)存存儲的一部分內(nèi)存頁調(diào)度到磁盤上,以騰出足夠的空間給當前的進程使用淫奔。當其他進程需要運行時山涡,再從磁盤將內(nèi)存的頁調(diào)度到物理內(nèi)存當中,以恢復(fù)進程的運行唆迁。而這個調(diào)度的過程佳鳖,則會產(chǎn)生swap I/O,如果swap I/O較為頻繁媒惕,將嚴重地影響系統(tǒng)的性能系吩。
vmstat命令,可以查看到swap I/O的情況 參考
vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
7 0 60982964 959440 0 14354452 8 9 45 99 0 0 25 5 68 1 0
- r 運行隊列中進程數(shù)量妒蔚,這個值也可以判斷是否需要增加CPU
- b 等待IO的進程數(shù)量穿挨。
- swpd 虛擬內(nèi)存已使用的大小月弛,如果大于0,表示你的機器物理內(nèi)存不足了
- free 空閑物理內(nèi)存大小科盛。
- buff 用作緩沖的內(nèi)存大小帽衙。
- cache 用作緩存的內(nèi)存大小,如果cache的值大的時候贞绵,說明cache處的文件數(shù)多厉萝,如果頻繁訪問到的文件都能被cache處,那么磁盤的讀IO bi會非常小榨崩。
- si 每秒從交換區(qū)寫到內(nèi)存的大小谴垫,由磁盤調(diào)入內(nèi)存。
- so 每秒寫入交換區(qū)的內(nèi)存大小母蛛,由內(nèi)存調(diào)入磁盤翩剪。
- bi 每秒讀取的塊數(shù)
- bo 每秒寫入的塊數(shù)
- in 每秒中斷數(shù),包括時鐘中斷彩郊。
- cs 每秒上下文切換數(shù)前弯。
- us 用戶進程執(zhí)行時間百分比(user time)
- sy 內(nèi)核系統(tǒng)進程執(zhí)行時間百分比(system time)
- wa IO等待時間百分比
- id 空閑時間百分比
3 性能優(yōu)化
3.1 前端 YSlow 網(wǎng)頁性能分析的瀏覽器插件
外加firebug 定位到哪個請求很慢
-
前端優(yōu)化
- 頁面的HTTP請求數(shù)量。
- 減少HTTP請求的數(shù)量能夠加速頁面的加載秫逝,在不改變頁面外觀的情況下恕出,可以通過采取合并樣式和腳本文件等措施,來減少頁面加載所需要請求數(shù)
- 是否使用CDN網(wǎng)絡(luò)
- 是否使用壓縮违帆。
- 頁面的HTTP請求數(shù)量。
3.2 方法響應(yīng)時間
3.2.1 測試環(huán)境可以重現(xiàn) 用StopWatch 測試具體是哪個步驟耗時進行優(yōu)化
@Test
public void testStopWatch() throws InterruptedException {
StopWatch stopWatch = new StopWatch();
stopWatch.start("測試1");
Thread.sleep(1000);
stopWatch.stop();
stopWatch.start("測試2");
Thread.sleep(200);
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
}
// 輸出
StopWatch '': running time = 1199763500 ns
---------------------------------------------
ns % Task name
---------------------------------------------
1000120600 083% 測試1
199642900 017% 測試2
3.2.2 測試環(huán)境不能重新浙巫,btrace 進行調(diào)試
- 下載
- 配置環(huán)境變量
#1, BTRACE_HOME
BTRACE_HOME D:\softwareStudy\btrace2.0\btrace-bin
#2, path 加
%BTRACE_HOME%\bin
# 測試
C:\Users\weepal>btrace --version
BTrace v.2.0.0 (15dcb82b539b4c6fab72b01da8ead18a5b8f71a0)
BTrace的用法
-
btrace [-I <include-path> ] [-p <port> ] [-cp <classpath> ] <pid> <btrace-script> [<args> ]
- -I BTrace支持對#define、#include這樣的條件編譯指令進行簡單的處理前方,include-path用來指定這樣的頭文件目錄;
- -p port參數(shù)用來指定btrace agent端口廉油,默認是2020惠险;
- -cp classpath用來指定編譯所需類路徑,一般是指btrace-client.jar等類所在路徑抒线;
- pid—需要跟蹤的Java進程id班巩;
- btrace-script—自定義的 btrace腳本;
- args—傳遞給btrace腳本的參數(shù)嘶炭。
假如查看 /djgCertuser/loginCertsn 耗時
@BTrace
public class BtraceTimeTest {
@TLS private static long startTime = 0;
@OnMethod(
clazz="com.wp.ecs.controller.login.DjgLoginRelatedController",
method="codeLogin",location = @Location(Kind.ENTRY)
)
public static void start() {
startTime = timeMillis();
}
@OnMethod(
clazz = "com.wp.ecs.controller.login.DjgLoginRelatedController",
method = "codeLogin",
location = @Location(Kind.RETURN)
)
public static void end(@ProbeClassName String pcn,
@ProbeMethodName String pmn,
AnyType[] args
) {
long timecost = timeMillis() - startTime;
println(Strings.strcat("time taken : ",str(timecost)));
printArray(args);
}
}
# 輸出
time taken : 246
[com.wp.ecs.filter.AesKeyAllWrapper@3953e8d, 21312, 10816A7EDADAE81ADC6E21, 2, ]
3.2.3 Java程序優(yōu)化
- 找到執(zhí)行速度慢的Java方法后抱慌,就需要想辦法對原有的設(shè)計進行優(yōu)化 如
- 單例模式
- 對于I/O處理、數(shù)據(jù)庫連接眨猎、配置文件解析加載等一些非常耗費系統(tǒng)資源的操作抑进,我們必須對這些實例的創(chuàng)建進行限制,或者始終使用一個公用的實例睡陪,以節(jié)約系統(tǒng)開銷
- 減少系統(tǒng)開銷
- 將單線程變?yōu)槎嗑€程
- 提升資源利用率
- 采用選擇就緒模式
- 提高并發(fā)吞吐
- 對于不相互影響的流程寺渗,可以使用Future模式來提升任務(wù)效率
- 減少上下文切換匿情。
- 降低鎖競爭。
- 壓縮 如有必要時對cookie進行信殊,然后轉(zhuǎn)base64
- 單例模式
3.2.4 GC優(yōu)化
通過GC日志能夠看出一些端倪炬称,包括Minor GC的頻率、Full GC的頻率涡拘、GC導(dǎo)致的停頓時間及GC發(fā)生的原因等玲躯。可以通過這些信息來解決GC所導(dǎo)致的一些問題鳄乏,以及對應(yīng)用性能進行優(yōu)化
查看gc日志
#堆初始大小
-Xms10880M
#堆最大值
-Xmx10880M
#輸出GC相關(guān)信息
-verbose:gc
#指定GC日志
-Xloggc:F:\company\公司項目\ECS2\trunk\ECS2\logs\gc.log
#輸出GC詳情
-XX:+PrintGCDetails
#日志中會輸出GC的時間戳 會多打印gc發(fā)生時間
-XX:+PrintGCDateStamps
#發(fā)生內(nèi)存溢出時自動的生成堆內(nèi)存快照
-XX:+HeapDumpOnOutOfMemoryError
#生成堆內(nèi)存快照路徑
-XX:HeapDumpPath=F:\company\公司項目\ECS2\trunk\ECS2\logs
#使用Parallel Scavenge + Parallel Old跷车,追求吞吐量的的最佳配合
-XX:+UseParallelOldGC
正式服務(wù)器常用垃圾收集器組合
-
-XX:+UseParallelOldGC
- Parallel Scavenge + Parallel Old組合
- 一些系統(tǒng)任務(wù),追求吞吐量的的最佳配合
-
-XX:+UseConcMarkSweepGC
- ParNew+CMS+Serial Old 組合
- g1與cms都是追求最短停頓時間汞窗,cms犧牲吞吐量獲得最短停頓時間姓赤,相對g1 適合堆很大的,jdk7cms更加適合
-
-XX:+UseG1GC g1收集器
- jdk8 并且堆不是特點大 使用他仲吏。
-
初始調(diào)優(yōu)
- 調(diào)整堆的初始大小
- -xms10m -xmx100m,
- 一個經(jīng)驗法則是完成 Full GC 后不铆,應(yīng)該釋放出 70% 的空間(30% 的空間仍然占用)
- 調(diào)整青年代,老年代大小
- jvm參數(shù)
- -XX:NewRatio=N 老年代與新生代比例默認2 青年代 1/3
- -XX:NewSize=N 設(shè)置新生代空間的初始大小裹唆。
- -XX:MaxNewSize=N 設(shè)置新生代空間的最大大小誓斥。
- -XmnN 將 NewSize 和 MaxNewSize 設(shè)定為同一個值
- jvm參數(shù)
- 永久代和元空間的調(diào)整
- -XX:PermSize=N
- -XX:MaxPermSize=N
- -XX:MetaspaceSize=N
- -XX:MaxMetaspaceSize=N
- 控制并發(fā) 調(diào)整線程數(shù)量
- cms concurrent mode failure
- 并發(fā)標記 預(yù)留的內(nèi)存無法滿足程序需要 則會出現(xiàn)concurrent mode failure
- -XX:CMSInitiatingOccupancyFraction=68 默認68 可以適當降低這個值
- 表示當OldGen使用了68%的時候,CMS收集會被激活
- -XX:CMSInitiatingOccupancyFraction=68 默認68 可以適當降低這個值
- 并發(fā)標記 預(yù)留的內(nèi)存無法滿足程序需要 則會出現(xiàn)concurrent mode failure
- 調(diào)整堆的初始大小