真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

內(nèi)存泄漏linux命令,Linux內(nèi)存泄漏

linux內(nèi)核內(nèi)存泄露檢測

經(jīng)常碰到系統(tǒng)跑著跑著一段時間內(nèi)存滿了,出現(xiàn)內(nèi)存泄漏的問題,系統(tǒng)軟件太龐大,這類問題又不好直接從源碼中分析,所以需要借助工具來分析了,kmemleak就是這樣的一個工具。

成都創(chuàng)新互聯(lián)公司成都網(wǎng)站建設(shè)定制開發(fā),是成都營銷推廣公司,為成都石涼亭提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計、前端HTML5制作、后臺程序開發(fā)等。成都網(wǎng)站建設(shè)熱線:028-86922220

在Kernel?hacking中打開CONFIG_DEBUG_KMEMLEAK =y即使能了kmemleak,其實就是開了一個內(nèi)核線程,該內(nèi)核線程每10分鐘(默認值)掃描內(nèi)存,并打印發(fā)現(xiàn)新的未引用的對象的數(shù)量。kmemleak的原理其實就是通過kmalloc、vmalloc、kmem_cache_alloc等內(nèi)存的分配,跟蹤其指針,連同其他的分配大小和堆棧跟蹤信息,存儲在PRIO搜索樹。如果存在相應(yīng)的釋放函數(shù)調(diào)用跟蹤和指針,就會從kmemleak數(shù)據(jù)結(jié)構(gòu)中移除。下面我們看看具體的用法。

查看內(nèi)核打印信息詳細過程如下:

1、掛載debugfs文件系統(tǒng)

mount?-t?debugfs?nodev?/sys/kernel/debug/

2、開啟內(nèi)核自動檢測線程

echo?scan??/sys/kernel/debug/kmemleak

3、查看打印信息

cat?/sys/kernel/debug/kmemleak

4、清除內(nèi)核檢測報告,新的內(nèi)存泄露報告將重新寫入/sys/kernel/debug/kmemleak

echo?clear??/sys/kernel/debug/kmemleak

內(nèi)存掃描參數(shù)可以進行修改通過向/sys/kernel/debug/kmemleak?文件寫入。?參數(shù)使用如下:

off 禁用kmemleak(不可逆)

stack=on 啟用任務(wù)堆棧掃描(default)

stack=off 禁用任務(wù)堆棧掃描

scan=on 啟動自動記憶掃描線程(default)

scan=off 停止自動記憶掃描線程

scan=secs 設(shè)置n秒內(nèi)自動記憶掃描,默認600s

scan 開啟內(nèi)核掃描

clear 清除內(nèi)存泄露報告

dump=addr 轉(zhuǎn)存信息對象在addr

通過“kmemleak?=?off”,也可以在啟動時禁用Kmemleak在內(nèi)核命令行。在初始化kmemleak之前,內(nèi)存的分配或釋放這些動作被存儲在一個前期日志緩沖區(qū)。這個緩沖區(qū)的大小通過配CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE設(shè)置。

Linux Kernel模塊內(nèi)存泄露分析

假如通過“Free”查看內(nèi)存幾乎耗盡,但通過 top/ps 命令卻看不出來用戶態(tài)應(yīng)用程序占用太多的內(nèi)存空間, 那么內(nèi)核模塊可能發(fā)生了內(nèi)存泄露

SLAB 是Linux內(nèi)核中按照對象大小進行分配的內(nèi)存分配器。

通過SLAB的信息來查看內(nèi)核模塊占用的內(nèi)存空間:

方法1. 查看meminfo文件

方法2. 查看slabinfo文件

一般查看slabinfo文件就足以,如果發(fā)現(xiàn)slabinfo中占用內(nèi)存過大,那基本可以斷定,內(nèi)核模塊出現(xiàn)了內(nèi)存泄露了

還有個命令 slabinfo 也是可以看,其實也是去讀 /proc/slabinfo 后可視化出來

Linux內(nèi)核的Kmemleak實現(xiàn)內(nèi)存泄露檢測

看看下面這個函數(shù)是哪里導(dǎo)致的內(nèi)存泄漏呢?

一眼可能不容易看出上面的有什么問題,有kmalloc,有kfree 成對出現(xiàn)的。

問題正好出在 pr_debug 這個函數(shù)中的參數(shù)傳遞, 熟悉函數(shù)調(diào)用傳參的人應(yīng)該會知道編譯器一般對參數(shù)的處理采用堆棧的方式,是一個先進后出的過程,這樣參數(shù)的執(zhí)行一般是逆序的(由于編譯器實現(xiàn)的不同,這個過程不是確定的),這樣kfree會在kmalloc之前運行,導(dǎo)致每次運行都會泄漏一點內(nèi)存。

Resolving Memory Leaks In Linux Kernel

Slab Allocator

Proc Info

Using Crash Debugger

LINUX系統(tǒng)的內(nèi)存管理知識詳解

內(nèi)存是Linux內(nèi)核所管理的最重要的資源之一。內(nèi)存管理系統(tǒng)是操作系統(tǒng)中最為重要的部分,因為系統(tǒng)的物理內(nèi)存總是少于系統(tǒng)所需要的內(nèi)存數(shù)量。虛擬內(nèi)存就是為了克服這個矛盾而采用的策略。系統(tǒng)的虛擬內(nèi)存通過在各個進程之間共享內(nèi)存而使系統(tǒng)看起來有多于實際內(nèi)存的內(nèi)存容量。Linux支持虛擬內(nèi)存, 就是使用磁盤作為RAM的擴展,使可用內(nèi)存相應(yīng)地有效擴大。核心把當(dāng)前不用的內(nèi)存塊存到硬盤,騰出內(nèi)存給其他目的。當(dāng)原來的內(nèi)容又要使用時,再讀回內(nèi)存。以下就是我為大家整理到的詳細LINUX系統(tǒng)內(nèi)存管理的知識,歡迎大家閱讀!!!

LINUX系統(tǒng)教程:內(nèi)存管理的知識詳解

一、內(nèi)存使用情況監(jiān)測

(1)實時監(jiān)控內(nèi)存使用情況

在命令行使用“Free”命令可以監(jiān)控內(nèi)存使用情況

代碼如下:

#free

total used free shared buffers cached

Mem: 256024 192284 63740 0 10676 101004

-/+ buffers/cache: 80604 175420

Swap: 522072 0 522072

上面給出了一個256兆的RAM和512兆交換空間的系統(tǒng)情況。第三行輸出(Mem:)顯示物理內(nèi)存。total列不顯示核心使用的物理內(nèi)存(通常大約1MB)。used列顯示被使用的內(nèi)存總額(第二行不計緩沖)。 free列顯示全部沒使用的內(nèi)存。Shared列顯示多個進程共享的內(nèi)存總額。Buffers列顯示磁盤緩存的當(dāng)前大小。第五行(Swap:)對對換空間,顯示的信息類似上面。如果這行為全0,那么沒使用對換空間。在缺省的狀態(tài)下,free命令以千字節(jié)(也就是1024字節(jié)為單位)來顯示內(nèi)存使用情況??梢允褂谩猦參數(shù)以字節(jié)為單位顯示內(nèi)存使用情況,或者可以使用—m參數(shù)以兆字節(jié)為單位顯示內(nèi)存使用情況。還可以通過—s參數(shù)使用命令來不間斷地監(jiān)視內(nèi)存使用情況:

#free –b –s2

這個命令將會在終端窗口中連續(xù)不斷地報告內(nèi)存的使用情況,每2秒鐘更新一次。

(2)組合watch與 free命令用來實時監(jiān)控內(nèi)存使用情況:

代碼如下:

#watch -n 2 -d free

Every 2.0s: free Fri Jul 6 06:06:12 2007

total used free shared buffers cached

Mem: 233356 218616 14740 0 5560 64784

-/+ buffers/cache: 148272 85084

Swap: 622584 6656 615928

watch命令會每兩秒執(zhí)行 free一次,執(zhí)行前會清除屏幕,在同樣位置顯示數(shù)據(jù)。因為 watch命令不會卷動屏幕,所以適合出長時間的監(jiān)測內(nèi)存使用率。可以使用 -n選項,控制執(zhí)行的頻率;也可以利用 -d選項,讓命令將每次不同的地方顯示出來。Watch命令會一直執(zhí)行,直到您按下 [Ctrl]-[C] 為止。

二、虛擬內(nèi)存的概念

(1)Linux虛擬內(nèi)存實現(xiàn)機制

Linux虛擬內(nèi)存的實現(xiàn)需要六種機制的支持:地址映射機制、內(nèi)存分配回收機制、緩存和刷新機制、請求頁機制、交換機制、內(nèi)存共享機制。

首先內(nèi)存管理程序通過映射機制把用戶程序的邏輯地址映射到物理地址,在用戶程序運行時如果發(fā)現(xiàn)程序中要用的虛地址沒有對應(yīng)的物理內(nèi)存時,就發(fā)出了請求頁要求;如果有空閑的內(nèi)存可供分配,就請求分配內(nèi)存(于是用到了內(nèi)存的分配和回收),并把正在使用的物理頁記錄在緩存中(使用了緩存機制)。 如果沒有足夠的內(nèi)存可供分配,那么就調(diào)用交換機制,騰出一部分內(nèi)存。另外在地址映射中要通過TLB(翻譯后援存儲器)來尋找物理頁;交換機制中也要用到交換緩存,并且把物理頁內(nèi)容交換到交換文件中后也要修改頁表來映射文件地址。

(2)虛擬內(nèi)存容量設(shè)定

也許有人告訴你,應(yīng)該分配2倍于物理內(nèi)存的虛擬內(nèi)存,但這是個不固定的規(guī)律。如果你的物理保存比較小,可以這樣設(shè)定。如果你有1G物理內(nèi)存或更多的話,可以縮小一下虛擬內(nèi)存。Linux會把大量的內(nèi)存用做Cache的,但在資源緊張時回收回.。你只要看到swap為0或者很小就可以放心了,因為內(nèi)存放著不用才是最大的浪費。

三、使甩vmstat命令監(jiān)視虛擬內(nèi)存使用情況

vmstat是Virtual Meomory Statistics(虛擬內(nèi)存統(tǒng)計)的縮寫,可對操作系統(tǒng)的虛擬內(nèi)存、進程、CPU活動進行監(jiān)視。它是對系統(tǒng)的整體情況進行統(tǒng)計,不足之處是無法對某個進程進行深入分析。通常使用vmstat 5 5(表示在5秒時間內(nèi)進行5次采樣)命令測試。將得到一個數(shù)據(jù)匯總它可以反映真正的系統(tǒng)情況。

代碼如下:

#vmstat 5 5

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

r b swpd free buff cache si so bi bo in cs us sy id wa

1 0 62792 3460 9116 88092 6 30 189 89 1061 569 17 28 54 2

0 0 62792 3400 9124 88092 0 0 0 14 884 434 4 14 81 0

0 0 62792 3400 9132 88092 0 0 0 14 877 424 4 15 81 0

1 0 62792 3400 9140 88092 0 0 0 14 868 418 6 20 74 0

1 0 62792 3400 9148 88092 0 0 0 15 847 400 9 25 67 0

vmstat命令輸出分成六個部分:

(1)進程procs:

r:在運行隊列中等待的進程數(shù) 。

b:在等待io的進程數(shù) 。

(2)內(nèi)存memoy:

swpd:現(xiàn)時可用的交換內(nèi)存(單位KB)。

free:空閑的內(nèi)存(單位KB)。

buff: 緩沖去中的內(nèi)存數(shù)(單位:KB)。

cache:被用來做為高速緩存的內(nèi)存數(shù)(單位:KB)。

(3) swap交換頁面

si: 從磁盤交換到內(nèi)存的交換頁數(shù)量,單位:KB/秒。

so: 從內(nèi)存交換到磁盤的交換頁數(shù)量,單位:KB/秒。

(4) io塊設(shè)備:

bi: 發(fā)送到塊設(shè)備的塊數(shù),單位:塊/秒。

bo: 從塊設(shè)備接收到的塊數(shù),單位:塊/秒。

(5)system系統(tǒng):

in: 每秒的中斷數(shù),包括時鐘中斷。

cs: 每秒的環(huán)境(上下文)切換次數(shù)。

(6)cpu中央處理器:

cs:用戶進程使用的時間 。以百分比表示。

sy:系統(tǒng)進程使用的時間。 以百分比表示。

id:中央處理器的空閑時間 。以百分比表示。

如果 r經(jīng)常大于 4 ,且id經(jīng)常小于40,表示中央處理器的負荷很重。 如果bi,bo 長期不等于0,表示物理內(nèi)存容量太小。

四、Linux 服務(wù)器的內(nèi)存泄露和回收內(nèi)存的方法

1、內(nèi)存泄漏的定義:

一般我們常說的內(nèi)存泄漏是指堆內(nèi)存的泄漏。堆內(nèi)存是指程序從堆中分配的,大小任意的(內(nèi)存塊的大小可以在程序運行期決定),使用完后必須顯示釋放的內(nèi)存。應(yīng)用程序一般使用malloc,realloc,new等函數(shù)從堆中分配到一塊內(nèi)存,使用完后,程序必須負責(zé)相應(yīng)的調(diào)用free或釋放該內(nèi)存塊,否則,這塊內(nèi)存就不能被再次使用,我們就說這塊內(nèi)存泄漏了。

2、內(nèi)存泄露的危害

從用戶使用程序的角度來看,內(nèi)存泄漏本身不會產(chǎn)生什么危害,作為一般的用戶,根本感覺不到內(nèi)存泄漏的存在。真正有危害的`是內(nèi)存泄漏的堆積,這會最終消耗盡系統(tǒng)所有的內(nèi)存。從這個角度來說,一次性內(nèi)存泄漏并沒有什么危害,因為它不會堆積,而隱式內(nèi)存泄漏危害性則非常大,因為較之于常發(fā)性和偶發(fā)性內(nèi)存泄漏它更難被檢測到。存在內(nèi)存泄漏問題的程序除了會占用更多的內(nèi)存外,還會使程序的性能急劇下降。對于服務(wù)器而言,如果出現(xiàn)這種情況,即使系統(tǒng)不崩潰,也會嚴重影響使用。

3、內(nèi)存泄露的檢測和回收

對于內(nèi)存溢出之類的麻煩可能大家在編寫指針比較多的復(fù)雜的程序的時候就會遇到。在 Linux 或者 unix 下,C、C++語言是最使用工具。但是我們的 C++ 程序缺乏相應(yīng)的手段來檢測內(nèi)存信息,而只能使用 top 指令觀察進程的動態(tài)內(nèi)存總額。而且程序退出時,我們無法獲知任何內(nèi)存泄漏信息。

使用kill命令

使用Linux命令回收內(nèi)存,我們可以使用Ps、Kill兩個命令檢測內(nèi)存使用情況和進行回收。在使用超級用戶權(quán)限時使用命令“Ps”,它會列出所有正在運行的程序名稱,和對應(yīng)的進程號(PID)。Kill命令的工作原理是:向Linux操作系統(tǒng)的內(nèi)核送出一個系統(tǒng)操作信號和程序的進程號(PID)。

應(yīng)用例子:

為了高效率回收內(nèi)存可以使用命令ps 參數(shù)v:

代碼如下:

[root@www ~]# ps v

PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND

2542 tty1 Ss+ 0:00 0 8 1627 428 0.1 /sbin/mingetty tty1

2543 tty2 Ss+ 0:00 0 8 1631 428 0.1 /sbin/mingetty tty2

2547 tty3 Ss+ 0:00 0 8 1631 432 0.1 /sbin/mingetty tty3

2548 tty4 Ss+ 0:00 0 8 1627 428 0.1 /sbin/mingetty tty4

2574 tty5 Ss+ 0:00 0 8 1631 432 0.1 /sbin/mingetty tty5

2587 tty6 Ss+ 0:00 0 8 1627 424 0.1 /sbin/mingetty tty6

2657 tty7 Ss+ 1:18 12 1710 29981 7040 3.0 /usr/bin/Xorg :0 -br -a

2670 pts/2 Ss 0:01 2 682 6213 1496 0.6 -bash

3008 pts/4 Ss 0:00 2 682 6221 1472 0.6 /bin/bash

3029 pts/4 S+ 0:00 2 32 1783 548 0.2 ping 192.168.1.12

3030 pts/2 R+ 0:00 2 73 5134 768 0.3 ps v

然后如果想回收Ping命令的內(nèi)存的話,使用命令:

代碼如下:

# Kill -9 3029

使用工具軟件

Memprof是一個非常具有吸引力且非常易于使用的軟件,它由Red Hat的Owen Talyor創(chuàng)立。這個工具是用于GNOME前端的Boehm-Demers-Weiser垃圾回收器。這個工具直接就可以執(zhí)行,并且其工作起來無需對源代碼進行任何修改。在程序執(zhí)行時,這個工具會以圖形化的方式顯示內(nèi)存的使用情況。

相關(guān)介紹:Linux

嚴格來講,Linux這個詞本身只表示Linux內(nèi)核,但人們已經(jīng)習(xí)慣了用Linux來形容整個基于Linux內(nèi)核,并且使用GNU 工程各種工具和數(shù)據(jù)庫的操作系統(tǒng)。

Linux擁有以下特性:類似于Unix的基本思想,支持完全免費與自由傳播,完全兼容POSIX1.0標(biāo)準(zhǔn),支持多用戶、多任務(wù)、有著良好的界面、支持多種平臺。Linux 能運行主要的UNIX工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。Linux繼承了Unix以網(wǎng)絡(luò)為核心的設(shè)計思想,是一個性能穩(wěn)定的多用戶網(wǎng)絡(luò)操作系統(tǒng)。

Linux有著許多不同的版本,但它們都使用了Linux內(nèi)核。Linux可安裝在各種計算機硬件設(shè)備中,比如手機、平板電腦、路由器、視頻游戲控制臺、臺式計算機、大型機和超級計算機。


網(wǎng)頁標(biāo)題:內(nèi)存泄漏linux命令,Linux內(nèi)存泄漏
分享URL:http://weahome.cn/article/hcihco.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部