日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线上服务器内存分析及问题排查

發(fā)布時(shí)間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线上服务器内存分析及问题排查 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自??線上服務(wù)器內(nèi)存分析及問題排查

平常的工作中,在衡量服務(wù)器的性能時(shí),經(jīng)常會(huì)涉及到幾個(gè)指標(biāo),load、cpu、mem、qps、rt等。每個(gè)指標(biāo)都有其獨(dú)特的意義,很多時(shí)候在線上出現(xiàn)問題時(shí),往往會(huì)伴隨著某些指標(biāo)的異常。大部分情況下,在問題發(fā)生之前,某些指標(biāo)就會(huì)提前有異常顯示。

在第一篇文章中,我們介紹了一個(gè)重要的指標(biāo)就是負(fù)載(Load),其中我們提到Linux的負(fù)載高,主要是由于CPU使用、內(nèi)存使用、IO消耗三部分構(gòu)成。任意一項(xiàng)使用過多,都將導(dǎo)致服務(wù)器負(fù)載的急劇攀升。本文是該系列的第三篇,來分析一下影響機(jī)器負(fù)載的幾個(gè)原因中的第二項(xiàng),內(nèi)存使用。

?

什么是內(nèi)存

內(nèi)存是計(jì)算機(jī)中重要的部件之一,它是與CPU進(jìn)行溝通的橋梁。計(jì)算機(jī)中所有程序的運(yùn)行都是在內(nèi)存中進(jìn)行的,因此內(nèi)存的性能對計(jì)算機(jī)的影響非常大。

內(nèi)存(Memory)也被稱為內(nèi)存儲(chǔ)器,其作用是用于暫時(shí)存放CPU中的運(yùn)算數(shù)據(jù),以及與硬盤等外部存儲(chǔ)器交換的數(shù)據(jù)。

物理內(nèi)存

物理內(nèi)存指通過物理內(nèi)存條而獲得的內(nèi)存空間。即隨機(jī)存取存儲(chǔ)器(random access memory,RAM),是與CPU直接交換數(shù)據(jù)的內(nèi)部存儲(chǔ)器,也叫主存(內(nèi)存)。

虛擬內(nèi)存

虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)可用的內(nèi)存(一個(gè)連續(xù)完整的地址空間),而實(shí)際上,它通常是被分隔成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲(chǔ)在外部磁盤存儲(chǔ)器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換(也就是說,當(dāng)物理內(nèi)存不足時(shí),可能會(huì)借用硬盤空間來充當(dāng)內(nèi)存使用)。與沒有使用虛擬內(nèi)存技術(shù)的系統(tǒng)相比,使用這種技術(shù)的系統(tǒng)使得大型程序的編寫變得更容易,對真正的物理內(nèi)存(例如RAM)的使用也更有效率。

Swap分區(qū)

Swap分區(qū)(即交換區(qū))在系統(tǒng)的物理內(nèi)存不夠用的時(shí)候,把硬盤空間中的一部分空間釋放出來,以供當(dāng)前運(yùn)行的程序使用。那些被釋放的空間可能來自一些很長時(shí)間沒有什么操作的程序,這些被釋放的空間被臨時(shí)保存到Swap分區(qū)中,等到那些程序要運(yùn)行時(shí),再從Swap分區(qū)中恢復(fù)保存的數(shù)據(jù)到內(nèi)存中。

程序運(yùn)行時(shí)的數(shù)據(jù)加載,線程并發(fā),I/O緩沖等等,都依賴于內(nèi)存,可用內(nèi)存的大小,決定了程序是否能正常運(yùn)行以及運(yùn)行的性能。

查看內(nèi)存使用情況

在Linux機(jī)器上,有多個(gè)命令都可以查看機(jī)器的內(nèi)存信息。其中包括free、top等。

free命令

free命令可以顯示Linux系統(tǒng)中空閑的、已用的物理內(nèi)存swap分區(qū)以及被內(nèi)核緩沖區(qū)內(nèi)存。在Linux系統(tǒng)監(jiān)控的工具中,free命令是最經(jīng)常使用的命令之一。

$freetotal???????used???????free?????shared????buffers?????cached Mem:???????8388608????2926968????5461640??????????0??????????0????1654392 -/+?buffers/cache:????1272576????7116032 Swap:?????16777208??????????0???16777208

上圖中,一共有3行6列數(shù)據(jù),行數(shù)據(jù)的意義如下:?Mem 行是內(nèi)存的使用情況。?-/+ buffers/cache 行是物理內(nèi)存的緩存統(tǒng)計(jì)情況。?Swap 行是交換空間的使用情況。

前面分別介紹過了物理內(nèi)存和Swap分區(qū)。這里再介紹一下buffers和cache。

buffer與cache的區(qū)別

A buffer is something that has yet to be "written" to disk.

A cache is something that has been "read" from the disk and stored for later use.

簡單點(diǎn)說:

buffers 就是存放要輸出到disk(塊設(shè)備)的數(shù)據(jù),緩沖滿了一次寫,提高IO性能(內(nèi)存 -> 磁盤)

cached 就是存放從disk上讀出的數(shù)據(jù),常用的緩存起來,減少IO(磁盤 -> 內(nèi)存)

buffer 和 cache,兩者都是RAM中的數(shù)據(jù)。簡單來說,buffer是即將要被寫入磁盤的,cache是被從磁盤中讀出來的。

介紹完了buffer和cache的區(qū)別,接下來分析下free命令查詢到的數(shù)據(jù)。

Mem行

?????????????total???????used???????free?????shared????buffers?????cached Mem:???????8388608????2926968????5461640??????????0??????????0????1654392

這一行展示物理內(nèi)存的整體情況。

Total:8388608。表示物理內(nèi)存總大小。

Used :2926968。表示總計(jì)分配給緩存(包含buffers 與cache )使用的數(shù)量,但其中可能部分緩存并未實(shí)際使用。

Free :5461640。表示未被分配的內(nèi)存。

Shared:0。共享內(nèi)存,一般系統(tǒng)不會(huì)用到。

Buffers:0。系統(tǒng)分配但未被使用的buffers 數(shù)量。

Cached:1654392。系統(tǒng)分配但未被使用的cache 數(shù)量。

total(Mem) = used(Mem) + free(Mem)

-/+ buffers/cache 行

?????????????total???????used???????free?????shared????buffers?????cached -/+?buffers/cache:????1272576????7116032

Used:1272576。 表示實(shí)際使用的buffers 與cache 總量,也是實(shí)際使用的內(nèi)存總量。

Free:7116032。 未被使用的buffers 與cache 和未被分配的內(nèi)存之和,這就是系統(tǒng)當(dāng)前實(shí)際可用內(nèi)存。

used(-/+ buffers/cache) = used(Mem) - cached(Mem) - buffers(Mem)

free(-/+ buffers/cache) = free(Mem) + cached (Mem)+ buffers(Mem)

Swap 行

$freetotal???????used???????free?????shared????buffers?????cached Swap:?????16777208??????????0???16777208

Total:16777208。Swap內(nèi)存總大小。

Used:0。表示已分配的Swap大小。

Free:16777208。表示未被分配的內(nèi)存。

接下來,再來整體看一下數(shù)據(jù)

$freetotal???????used???????free?????shared????buffers?????cached Mem:???????8388608????2926968????5461640??????????0??????????0????1654392 -/+?buffers/cache:????1272576????7116032 Swap:?????16777208??????????0???16777208

機(jī)器上實(shí)際可用內(nèi)存大小:

???Free(-/+?buffers/cache)=?Free(Mem)+buffers(Mem)+Cached(Mem);7116032?=?5461640?+?0+?1654392

已經(jīng)分配的內(nèi)存大小:

???Used(Mem)?=?Used(-/+?buffers/cache)+?buffers(Mem)?+?Cached(Mem)2926968?=?1272576?+?0?+?1654392

物理內(nèi)存總大小

???total(Mem)?=?used(-/+?buffers/cache)?+?free(-/+?buffers/cache)8388608?=?1272576?+?7116032

總結(jié)一下,整個(gè)機(jī)器的總內(nèi)存大小8388608,其中已經(jīng)分配的內(nèi)存有2926968,還未分配的內(nèi)存有5461640。而分配的2926968中,有1654392還沒有使用,有1272576已經(jīng)用掉了。當(dāng)前機(jī)器中還有7116032內(nèi)存可以使用。

free命令參數(shù)

-m?以M為單位顯示內(nèi)存

$free?-mtotal???????used???????free?????shared????buffers?????cached Mem:??????????8192???????2802???????5389??????????0??????????0???????1559 -/+?buffers/cache:???????1243???????6948 Swap:????????16383??????????0??????16383

-g?以G為單位顯示內(nèi)存

$free?-gtotal???????used???????free?????shared????buffers?????cached Mem:??????????8??????????2??????????5?????????0?????????0???????????1 -/+?buffers/cache:???????1??????????6 Swap:????????16??????????0??????????16

-s 2持續(xù)的觀察內(nèi)存的狀況,每隔2秒打印一次

$free?-s?2total???????used???????free?????shared????buffers?????cached Mem:???????8388608????2873128????5515480??????????0??????????0????1600588 -/+?buffers/cache:????1272540????7116068 Swap:?????16777208??????????0???16777208total???????used???????free?????shared????buffers?????cached Mem:???????8388608????2873168????5515440??????????0??????????0????1600628 -/+?buffers/cache:????1272540????7116068 Swap:?????16777208??????????0???16777208

除了free ,還可以在Linux下可以使用/proc/meminfo文件查看操作系統(tǒng)內(nèi)存的使用狀態(tài),其實(shí),free命令的內(nèi)容也是來自于/proc/meminfo文件。

top命令

top命令是Linux下常用的性能分析工具,能夠?qū)崟r(shí)顯示系統(tǒng)中各個(gè)進(jìn)程的資源占用狀況,類似于Windows的任務(wù)管理器。

在前面兩篇文章中介紹過使用top命令查看Load Avg和CPU利用率。top還會(huì)打印的一部分信息就是內(nèi)存情況。

top?-?17:49:32?up?2?days,??6:25,??1?user,??load?average:?0.01,?0.09,?0.12 Tasks:??30?total,???1?running,??29?sleeping,???0?stopped,???0?zombie Cpu(s):??0.1%us,??0.0%sy,??0.0%ni,?88.0%id,??3.8%wa,??0.0%hi,??0.0%si,??8.1%st Mem:???8388608k?total,??2884716k?used,??5503892k?free,????????0k?buffers Swap:?16777208k?total,????????0k?used,?16777208k?free,??1612080k?cachedPID?USER??????PR??NI??VIRT??RES??SHR?S?%CPU?%MEM????TIME+??COMMAND85690?admin?????20???0?5138m?1.1g??47m?S??2.3?13.9??93:28.92?java

上面的Mem行和Swap行展示的就是內(nèi)存的使用情況。并且也會(huì)按照進(jìn)行展示不同進(jìn)程的內(nèi)存占用情況。十分好用。

?

Java Web應(yīng)用內(nèi)存占用飆高排查思路

JVM以一個(gè)進(jìn)程(Process)的身份運(yùn)行在Linux系統(tǒng)上,對于Linux來說,JVM不過是一個(gè)具有自助管理內(nèi)存的乖孩子而已。

一般在應(yīng)用啟動(dòng)時(shí)都可以通過JVM參數(shù)來設(shè)置JVM內(nèi)存的大小。如果超過這個(gè)限制就會(huì)拋出異常。所以,我們比較常見的內(nèi)存占用過高問題,最顯著的現(xiàn)象就是拋出各種OutOfMemoryError。

有一種可能導(dǎo)致直接內(nèi)存,也就是Linux的物理內(nèi)存過高的情況,就是NIO的使用。NIO引入了一種基于通道與緩沖區(qū)的IO方式,他可以使用Native函數(shù)庫直接分配堆外內(nèi)存,然后通過一個(gè)存儲(chǔ)在Java堆中的DirectByteBuffer對象作為這塊內(nèi)存的引用進(jìn)行操作。

所以,在使用NIO的時(shí)候,要特別小心,避免導(dǎo)致機(jī)器內(nèi)存被擠滿。

導(dǎo)致JVM中內(nèi)存占用飆高的原因可能有很多。最常見的就是內(nèi)存泄露。

內(nèi)存泄露排查思路

1、使用top命令,查看占用內(nèi)存較高的進(jìn)程ID。

???~?topPID?USER??????PR??NI??VIRT??RES??SHR?S?%CPU?%MEM????TIME+??COMMAND 3331?admin?????20???0?7127m?2.6g??38m?S?10.7?90.6??10:20.26?java

發(fā)現(xiàn)PID為3331的進(jìn)程占用內(nèi)存 90.6%。而且是一個(gè)Java進(jìn)程,基本斷定是程序問題。

2、使用jmap查看內(nèi)存情況,并分析是否存在內(nèi)存泄露。

jmap?-heap?3331:查看java?堆(heap)使用情況jmap?-histo?3331:查看堆內(nèi)存(histogram)中的對象數(shù)量及大小jmap?-histo:live?3331:JVM會(huì)先觸發(fā)gc,然后再統(tǒng)計(jì)信息jmap?-dump:format=b,file=heapDump?3331:將內(nèi)存使用的詳細(xì)情況輸出到文件

得到堆dump文件后,可以進(jìn)行對象分析。如果有大量對象在持續(xù)被引用,并沒有被釋放掉,那就產(chǎn)生了內(nèi)存泄露,就要結(jié)合代碼,把不用的對象釋放掉。

總結(jié)

以上是生活随笔為你收集整理的线上服务器内存分析及问题排查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。