ps -ef | grep tomcat
查看tomcat進(jìn)程號(hào),以及啟動(dòng)tomcat時(shí)所用的java版本
top查看服務(wù)器資源
load average:三個(gè)數(shù)字分別表示最近 1 分鐘清寇,5 分鐘和 15 分鐘的負(fù)責(zé)钢颂,數(shù)值越大負(fù)載越重蜻韭,一般要求不超過(guò)核數(shù)蔑担。
VIRT:virtual memory usage,進(jìn)程占用的虛擬內(nèi)存大小廉侧。
RES:resident memory usage页响,進(jìn)程常駐內(nèi)存大小,也就是實(shí)際內(nèi)存占用情況段誊,一般我們看進(jìn)程占用了多少內(nèi)存闰蚕,就是看的這個(gè)值。
SHR:shared memory连舍,共享內(nèi)存大小没陡,不常用。
- us 用戶空間占用 CPU 時(shí)間比例
- sy 系統(tǒng)占用 CPU 時(shí)間比例
- ni 用戶空間改變過(guò)優(yōu)先級(jí)的進(jìn)程占用 CPU 時(shí)間比例
- id CPU 空閑時(shí)間比
- wa IO等待時(shí)間比(IO等待高時(shí)索赏,可能是磁盤性能有問(wèn)題了)
- hi 硬件中斷
- si 軟件中斷
- st steal time
ps:在top沒(méi)命令模式下盼玄,按1查看每個(gè)cpu每個(gè)核心運(yùn)行情況,P:按CPU使用率從高到底排序輸出潜腻,M:按內(nèi)存占用從高到底排序輸出(或者按“F”埃儿,再選擇需要排序的字段,按下s確認(rèn)即可)
top -Hp pid
查看指定進(jìn)程下的線程信息
printf '%x\n' pid
將pid轉(zhuǎn)換為16進(jìn)制
jps
列出本機(jī)所有java進(jìn)程的PID
jstack -l pid > stack
保存java的堆棧信息到文件融涣。檢查非空閑狀態(tài)的線程童番,如果大量線程都停留在同一個(gè)位置精钮,那么很可能這個(gè)位置就是程序的瓶頸
jstat -gcutil -h3 pid 1000
每1000ms打印一次gc信息,每3行輸出一次表頭
jmap -heap pid
顯示堆內(nèi)存信息
jmap -histo pid
顯示對(duì)象內(nèi)存信息
jmap -dump:live,format=b,file=heapdump.phrof pid
將dump信息保存成文件剃斧,可以通過(guò)visualVM或者M(jìn)AT工具分析該文件杂拨,找出占用大量?jī)?nèi)存的對(duì)象。如果jvm內(nèi)存被迅速占滿并引起大量full gc悯衬,檢查是否有某個(gè)地方一次性加載了大量的對(duì)象到內(nèi)存中,比如一次性讀取數(shù)據(jù)庫(kù)表中所有的數(shù)據(jù)檀夹,又或者從網(wǎng)絡(luò)上接收數(shù)據(jù)包很大(幾百kb的數(shù)據(jù)包筋粗,并發(fā)時(shí)也可能達(dá)到上百兆)
查看網(wǎng)絡(luò)狀態(tài)
sar -n TCP 1(查看tcp統(tǒng)計(jì)信息,每秒打印一次)
active/s:新的 TCP 主動(dòng)連接(也就是 socket 中的 connect() 事件)炸渡,單位是:連接數(shù)/s娜亿。
passive/s:新的 TCP 被動(dòng)連接(也就是 socket 中的 listen() 事件)。
iseg/s:接收的段(傳輸層以段為傳輸單位)蚌堵,單位是:段/s
oseg/s:發(fā)送的段买决。
sar -n DEV 1(查看網(wǎng)絡(luò)接口統(tǒng)計(jì)信息,每秒打印一次)
rxpck/s / txpck/s:網(wǎng)卡接收/發(fā)送的數(shù)據(jù)包吼畏,單位是:數(shù)據(jù)包/s督赤。
rxkB/s / txkB/s:網(wǎng)卡接收/發(fā)送的千字節(jié),單位是:千字節(jié)/s泻蚊。
rxcmp/s / txcmp/s:網(wǎng)卡每秒接受/發(fā)送的壓縮數(shù)據(jù)包躲舌,單位是:數(shù)據(jù)包/s。
rxmcst/s:每秒接收的多播數(shù)據(jù)包性雄,單位是:數(shù)據(jù)包/s没卸。
netstat -tulnp(列出所有 tcp與udp 端口)
Proto:協(xié)議名(tcp協(xié)議還是udp協(xié)議)
recv-Q:網(wǎng)絡(luò)接收隊(duì)列
表示收到的數(shù)據(jù)已經(jīng)在本地接收緩沖,但是還有多少?zèng)]有被進(jìn)程取走秒旋,recv()
send-Q:網(wǎng)路發(fā)送隊(duì)列
對(duì)方?jīng)]有收到的數(shù)據(jù)或者說(shuō)沒(méi)有Ack的,還是本地緩沖區(qū).
這兩個(gè)值通常應(yīng)該為0约计,如果不為0可能是有問(wèn)題的。packets在兩個(gè)隊(duì)列里都不應(yīng)該有堆積狀態(tài)迁筛∶喊觯可接受短暫的非0情況。
Local Address:監(jiān)聽(tīng)的本地地址瑰煎,0.0.0.0表示監(jiān)聽(tīng)所有本地地址铺然。
Foreign Address:監(jiān)聽(tīng)的外部地址
抓包
tcpdump -i eth0 'dst host 192.168.2.111' -w luo.pcap
抓取所有經(jīng)過(guò)網(wǎng)卡eth0到目標(biāo)地址的包
tcpdump -i eth0 'src host 192.168.2.111' -w luo.pcap
抓取所有來(lái)自目標(biāo)主機(jī)的包
tcpdump -i eth0 'host 192.168.2.111' -w luo.pcap
抓取所有和目標(biāo)主機(jī)通信的包信息
查看連接狀態(tài)
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSED:表示初始狀態(tài)
LISTEN:表示服務(wù)器端的某個(gè)SOCKET處于監(jiān)聽(tīng)狀態(tài),可以接受連接了
SYN_RCVD: 這個(gè)狀態(tài)表示接受到了SYN報(bào)文
SYN_SENT:表示客戶端已發(fā)送SYN報(bào)文
ESTABLISHED:表示連接已經(jīng)建立了
FIN_WAIT_1:表示等待對(duì)方的FIN報(bào)文(當(dāng)SOCKET在ESTABLISHED狀態(tài)時(shí)酒甸,它想主動(dòng)關(guān)閉連接魄健,向?qū)Ψ桨l(fā)送了FIN報(bào)文,此時(shí)該SOCKET即進(jìn)入到FIN_WAIT_1狀態(tài))
FIN_WAIT_2:表示半連接插勤,也即有一方要求close連接沽瘦,但另外還告訴對(duì)方革骨,我暫時(shí)還有點(diǎn)數(shù)據(jù)需要傳送給你,稍后再關(guān)閉連接
TIME_WAIT: 表示收到了對(duì)方的FIN報(bào)文析恋,并發(fā)送出了ACK報(bào)文良哲,就等2MSL后即可回到CLOSED可用狀態(tài)了
CLOSING: 表示雙方都正在關(guān)閉SOCKET連接
CLOSE_WAIT: 表示在等待關(guān)閉
LAST_ACK:它是被動(dòng)關(guān)閉一方在發(fā)送FIN報(bào)文后,最后等待對(duì)方的ACK報(bào)文助隧。當(dāng)收到ACK報(bào)文后筑凫,也即可以進(jìn)入到CLOSED可用狀態(tài)了
time_wait狀態(tài)產(chǎn)生的原因,危害并村,如何避免
查看CPU信息
lscpu(查看cpu基本信息)
Architecture: #架構(gòu)
CPU(s): #邏輯cpu顆數(shù)
Thread(s) per core: #每個(gè)核心線程
Core(s) per socket: #每個(gè)cpu插槽核數(shù)/每顆物理cpu核數(shù)
socket(s): #cpu插槽數(shù)
Vendor ID: #cpu廠商ID
CPU family: #cpu系列
Model: #型號(hào)
Stepping: #步進(jìn)
CPU MHz: #cpu主頻
Virtualization: #cpu支持的虛擬化技術(shù)
L1d cache: #一級(jí)緩存(表示cpu的L1數(shù)據(jù)緩存)
L1i cache: #一級(jí)緩存(L1指令緩存)
L2 cache: #二級(jí)緩存
cat /proc/cpuinfo(查看cpu基本信息巍实,具體到每一個(gè)核)
mpstat 2 5(查看cpu當(dāng)前運(yùn)行的狀況,每?jī)擅敫乱淮瘟梗还哺?次)
%user 在internal時(shí)間段里棚潦,用戶態(tài)的CPU時(shí)間(%),不包含nice值為負(fù)進(jìn)程 (usr/total)100
%nice 在internal時(shí)間段里膝昆,nice值為負(fù)進(jìn)程的CPU時(shí)間(%) (nice/total)100
%sys 在internal時(shí)間段里丸边,內(nèi)核時(shí)間(%) (system/total)100
%iowait 在internal時(shí)間段里,硬盤IO等待時(shí)間(%) (iowait/total)100
%irq 在internal時(shí)間段里荚孵,硬中斷時(shí)間(%) (irq/total)100
%soft 在internal時(shí)間段里妹窖,軟中斷時(shí)間(%) (softirq/total)100
%idle 在internal時(shí)間段里,CPU除去等待磁盤IO操作外的因?yàn)槿魏卧蚨臻e的時(shí)間閑置時(shí)間(%) (idle/total)*100
vmstat 1 (查看cpu收叶,內(nèi)存嘱吗,io信息)
r 值:表示在 CPU 運(yùn)行隊(duì)列中等待的進(jìn)程數(shù),如果這個(gè)值很大滔驾,表示很多進(jìn)程在排隊(duì)等待執(zhí)行谒麦,CPU 壓力大。
in 和 cs 值:表示中斷次數(shù)和上下文切換次數(shù)哆致,這兩個(gè)值越大绕德,表示系統(tǒng)在進(jìn)行大量的進(jìn)程(或線程)切換。切換的開(kāi)銷是非常大的摊阀,這時(shí)候應(yīng)該減少系統(tǒng)進(jìn)程(或線程)數(shù)耻蛇。
us、sy胞此、id臣咖、wa 值:和top的指標(biāo)一致。
b 漱牵,bi 和 bo 值:b值表示因?yàn)?IO 阻塞排隊(duì)的任務(wù)數(shù)夺蛇。bi 和 bo 值表示每秒讀寫(xiě)磁盤的塊數(shù),bi(block in)是寫(xiě)磁盤酣胀,bo(block out)是讀磁盤刁赦。一般這幾個(gè)值偏大娶聘,都意味著系統(tǒng) IO 的消耗較大,對(duì)于讀請(qǐng)求較大的服務(wù)器甚脉,b丸升、bo、wa 的值偏大牺氨,而寫(xiě)請(qǐng)求較大的服務(wù)器狡耻,b、bi猴凹、wa 的值偏大酝豪。
wa 值:表示因?yàn)?IO 等待(wait)而消耗的 CPU 比例。
dstat (查看cpu精堕,磁盤io,網(wǎng)絡(luò)發(fā)包蒲障,換頁(yè)歹篓,系統(tǒng)統(tǒng)計(jì))
內(nèi)存分析
cat /proc/meminfo(查看內(nèi)存基本信息)
free -m (查看剩余內(nèi)存)
鎖競(jìng)爭(zhēng)
pidstat -w -p pid(查看上下文切換次數(shù))
cswch:是指進(jìn)程無(wú)法獲取所需資源,導(dǎo)致的上下文切換揉阎。比如說(shuō)庄撮, I/O、內(nèi)存等系統(tǒng)資源不足時(shí)毙籽,就會(huì)發(fā)生自愿上下文切換洞斯。
nvcswch:則是指進(jìn)程由于時(shí)間片已到等原因,被系統(tǒng)強(qiáng)制調(diào)度坑赡,進(jìn)而發(fā)生的上下文切換烙如。比如說(shuō),大量進(jìn)程都在爭(zhēng)搶 CPU時(shí)毅否,就容易發(fā)生非自愿上下文切換亚铁。
如果系統(tǒng)的上下文切換次數(shù)比較穩(wěn)定,那么從數(shù)百到一萬(wàn)以內(nèi)螟加,都應(yīng)該算是正常的徘溢。但當(dāng)上下文切換次數(shù)超過(guò)一萬(wàn)次,或者切換次數(shù)出現(xiàn)數(shù)量級(jí)的增長(zhǎng)時(shí)捆探,就很可能已經(jīng)出現(xiàn)了性能問(wèn)題然爆。
磁盤分析
fdisk (查看磁盤基本信息)
df -h(查看磁盤使用情況)
iostat -c(查看部分cpu使用情況)
%iowait:表示 CPU 等待 IO 完成時(shí)間的百分比
%idle:CPU 空閑時(shí)間百分比
如果 %iowait 較高,則表明磁盤存在 IO 瓶頸黍图,如果 %idle 較高曾雕,則 CPU 比較空閑,如果兩個(gè)值都比較高助被,則有可能 CPU 在等待分配內(nèi)存翻默,瓶頸在內(nèi)存缸沃,此時(shí)應(yīng)該加大內(nèi)存,如果 %idle 較低修械,則此時(shí)瓶頸在 CPU趾牧,應(yīng)該增加 CPU 資源。
iostat -d -k -x(查看磁盤使用情況肯污,主要顯示IOPS和吞吐量信息)
tps:設(shè)備每秒的傳輸次數(shù)(transfers per second)翘单,也就是讀寫(xiě)次數(shù)。
kB_read/s 和 kB_wrtn/s:每秒讀寫(xiě)磁盤的數(shù)據(jù)量蹦渣。
kB_read 和 kB_wrtn:讀取磁盤的數(shù)據(jù)總量哄芜。
iostat -x(查看磁盤詳細(xì)信息)
rrqm/s 和 wrqm/s:分別每秒進(jìn)行合并的讀操作數(shù)和寫(xiě)操作數(shù),這是什么意思呢柬唯,合并就是說(shuō)把多次 IO 請(qǐng)求合并成少量的幾次认臊,這樣可以減小 IO 開(kāi)銷,buffer 存在的意義就是為了解決這個(gè)問(wèn)題的锄奢。
r/s 和 w/s:每秒磁盤讀寫(xiě)的次數(shù)失晴。這兩個(gè)值相加就是 tps。
rkB/s 和 wkB/s:每秒磁盤讀寫(xiě)的數(shù)據(jù)量
avgrq-sz:平均每次讀寫(xiě)磁盤扇區(qū)的大小拘央。
avgqu-sze:平均 IO 隊(duì)列長(zhǎng)度涂屁。隊(duì)列長(zhǎng)度越短越好。
await:平均每次磁盤讀寫(xiě)的等待時(shí)間(ms)灰伟。
svctm:平均每次磁盤讀寫(xiě)的服務(wù)時(shí)間(ms)拆又。
%util:一秒鐘有百分之多少的時(shí)間用于磁盤讀寫(xiě)操作。
TIME_WAIT問(wèn)題解決
查看端口范圍
sysctl -a | grep net.ipv4.ip_local_port_range
修改端口范圍
vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 10000 65000
sysctl -p 讓修改生效
最小值必須大于等于1024栏账,最大值必須小于等于65535
允許TCP連接重復(fù)使用TIME_WAIT狀態(tài)的句柄/端口
查看:sysctl -a | grep net.ipv4.tcp_tw_reuse
修改:echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
注意帖族,客戶端服務(wù)端必須同時(shí)打開(kāi)tcp_timestamps(默認(rèn)打開(kāi))
sysctl -w net.ipv4.tcp_fin_timeout=3 (這個(gè)修改可能沒(méi)什么效果)
轉(zhuǎn)載自:
https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247484103&idx=1&sn=d437fd54bac8ac00522aa4538ca9c7a1&chksm=ea74367fdd03bf699d603f39836bb35c0e6190f6781e0eda104a3710705034293255e85bd6b4&scene=21#wechat_redirect
https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247484295&idx=1&sn=cd82eba9d73f816210b2a99f29b85040&chksm=ea74373fdd03be2942ebeffeebebf52f229f0cb7b724e406ff79d050d67db70584c6efbcde85&scene=21#wechat_redirect
https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247484192&idx=1&sn=ea9aa805a5c0ac1e0b55e5477c79d66d&chksm=ea743798dd03be8e4e07bd8e173fa7e447b13cbd0cdcc287ae917b6b99d616bce801450ac22b&scene=21#wechat_redirect
https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247484208&idx=1&sn=b1429f0f07d69a44248cc78d3942c5c9&chksm=ea743788dd03be9e88e41df3966eb0ac8250b1741b83b19ab97e5a0980444241d17de6bbba66&scene=21#wechat_redirect
https://cloud.tencent.com/developer/article/1432483