❶ linux如何查看哪個進程佔用的SWAP分區比較多
最近有人問,我的系統swap快被耗盡了,可是卻不知道哪些程序佔用了swap,到處發帖問什麼命令可以查看。其實linux系統目前並沒有這樣的命令(或許是有,但我孤陋寡聞不清楚),但是我們可以通過編寫腳本來自己找出佔用swap的程序。
那麼怎樣編寫這個腳本呢,首先、我們需要知道去哪查看進程佔用資源的情況。每個進程都會在/proc下面生成一個以進程號為名字的目錄,裡面的各個文件就是其在內存中的映像。
其中smaps這個文件,便記載了每個進程每個數據段佔用內存的情況。
如下是某佔用swap的進程的smaps文件截圖(部分):
Swap: 後面的數字,就是該數據段佔用的swap大小,我們只要把這個文件里所有出現的swap加起來,就是這個進程所佔用的swap大小了。
OK,下面開始寫代碼:
點擊(此處)折疊或打開
#!/bin/bash
###############################################################################
# 日期 : 2011-10-31
# 作者 : xiaoxi227
# Email : [email protected]
# QQ : 543928910
# 版本 : 1.0
# 腳本功能 : 列出正在佔用swap的進程。
# 調用關系 :
# 其他說明 :
###############################################################################
echo -e "PID\t\tSwap\t\tProc_Name"
# 拿出/proc目錄下所有以數字為名的目錄(進程名是數字才是進程,其他如sys,net等存放的是其他信息)
for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]`
do
# 讓進程釋放swap的方法只有一個:就是重啟該進程。或者等其自動釋放。
# 如果進程會自動釋放,那麼我們就不會寫腳本來找他了,找他都是因為他沒有自動釋放。
# 所以我們要列出佔用swap並需要重啟的進程,但是init這個進程是系統里所有進程的祖先進程
# 重啟init進程意味著重啟系統,這是萬萬不可以的,所以就不必檢測他了,以免對系統造成影響。
if [ $pid -eq 1 ];then continue;fi # Do not check init process
# 判斷改進程是否佔用了swap
grep -q "Swap" /proc/$pid/smaps 2>/dev/null
if [ $? -eq 0 ];then # 如果佔用了swap
swap=$(grep Swap /proc/$pid/smaps \ # 佔用swap的總大小(單位:KB)
| gawk '{ sum+=$2;} END{ print sum }')
proc_name=$(ps aux | grep -w "$pid" | grep -v grep \ # 進程名
| awk '{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}')
if [ $swap -gt 0 ];then # 如果佔用了swap則輸出其信息
echo -e "$pid\t${swap}\t$proc_name"
fi
fi
done | sort -k2 -n | gawk -F'\t' '{ # 按佔用swap的大小排序,再用awk實現單位轉換。
# 如:將1024KB轉換成1M。將1048576KB轉換成1G,以提高可讀性。
pid[NR]=$1;
size[NR]=$2;
name[NR]=$3;
}
END{
for(id=1;id<=length(pid);id++)
{
if(size[id]<1024)
printf("%-10s\t%15sKB\t%s\n",pid[id],size[id],name[id]);
else if(size[id]<1048576)
printf("%-10s\t%15.2fMB\t%s\n",pid[id],size[id]/1024,name[id]);
else
printf("%-10s\t%15.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]);
}
}'
本人在某台已佔用swap的伺服器執行的結果如下:
圖片有刪減(為方便閱讀)
腳本執行結果一目瞭然,如果某程序佔用了大量的swap,則重啟該進程即可。否則時間長了,很可能會因為swap耗盡而導致系統死機。
❷ linux中swap是什麼意思
交換分區
❸ Linux查看佔用swap的進程腳本
linux查看佔用swap的進程腳本01#!/bin/bash0203##############################################################################04#
腳本功能
:
列出正在佔用swap的進程。05###############################################################################0607echo
-e
PID/t/tSwap/t/tProc_Name0809#
拿出/proc目錄下所有以數字為名的目錄(進程名是數字才是進程,其他如sys,net等存放的是其他信息)10for
pid
in
`ls
-l
/proc
|
grep
^d
|
awk
'{
print
$9
}'|
grep
-v
[^0-9]`11do12
#
讓進程釋放swap的方法只有一個:就是重啟該進程。或者等其自動釋放。放13
#
如果進程會自動釋放,那麼我們就不會寫腳本來找他了,找他都是因為他沒有自動釋放。14
#
所以我們要列出佔用swap並需要重啟的進程,但是init這個進程是系統里所有進程的祖先進程15
#
重啟init進程意味著重啟系統,這是萬萬不可以的,所以就不必檢測他了,以免對系統造成影響。16
if
[
$pid
-eq
1
];then
continue;fi17
grep
-q
Swap
/proc/$pid/smaps
2>/dev/null18
if
[
$?
-eq
0
];then19
swap=$(grep
Swap
/proc/$pid/smaps
/20
|
gawk
'{
sum+=$2;}
END{
print
sum
}')21
proc_name=$(ps
aux
|
grep
-w
$pid
|
grep
-v
grep
/22
|
awk
'{
for(i=11;i<=NF;i++){
printf(%s
,$i);
}}')23
if
[
$swap
-gt
0
];then24
echo
-e
${pid}/t${swap}/t${proc_name}25
fi26
fi27done
|
sort
-k2
-n
|
awk
-F'/t'
'{28
pid[NR]=$1;29
size[NR]=$2;30
name[NR]=$3;31}32END{33
for(id=1;id<=length(pid);id++)34
{35
if(size[id]<1024)36
printf(%-10s/t%15sKB/t%s/n,pid[id],size[id],name[id]);37
else
if(size[id]<1048576)38
printf(%-10s/t%15.2fMB/t%s/n,pid[id],size[id]/1024,name[id]);39
else40
printf(%-10s/t%15.2fGB/t%s/n,pid[id],size[id]/1048576,name[id]);41
}42}'
❹ linux 清理交換區SWAP,對正在伺服器上運行的其它應用有什麼影響
SWAP其實就是突發內存,也被稱作虛擬內存
如圖是真實的內存條,SWAP是從硬碟劃分過來,當作突發內存用的。當應用程序技術量過大的時候,會把一些運算放到SWAP里進行
所以如果SWAP內存有正在運行的程序,清理SWAP就會造成錯誤,所以在運行程序的時候不要清理SWAP分區
❺ linux swap分區原理
swap介紹
Swap,即交換區,除了安裝Linux的時候,有多少人關心過它呢?其實,Swap的調整對Linux伺服器,特別是Web伺服器的性能至關重要。通過調整Swap,有時可以越過系統性能瓶頸,節省系統升級費用。
本文內容包括:
Swap基本原理
突破128M Swap限制
Swap配置對性能的影響
Swap性能監視
有關Swap操作的系統命令
Swap基本原理
Swap的原理是一個較復雜的問題,需要大量的篇幅來說明。在這里只作簡單的介紹,在以後的文章中將和大家詳細討論Swap實現的細節。
眾所周知,現代操作系統都實現了「虛擬內存」這一技術,不但在功能上突破了物理內存的限制,使程序可以操縱大於實際物理內存的空間,更重要的是,「虛擬內存」是隔離每個進程的安全保護網,使每個進程都不受其它程序的干擾。
Swap空間的作用可簡單描述為:當系統的物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,以供當前運行的程序使用。那些被釋放的空間可能來自一些很長時間沒有什麼操作的程序,這些被釋放的空間被臨時保存到Swap空間中,等到那些程序要運行時,再從Swap中恢復保存的數據到內存中。這樣,系統總是在物理內存不夠時,才進行Swap交換。
計算機用戶會經常遇這種現象。例如,在使用Windows系統時,可以同時運行多個程序,當你切換到一個很長時間沒有理會的程序時,會聽到硬碟「嘩嘩」直響。這是因為這個程序的內存被那些頻繁運行的程序給「偷走」了,放到了Swap區中。因此,一旦此程序被放置到前端,它就會從Swap區取回自己的數據,將其放進內存,然後接著運行。
需要說明一點,並不是所有從物理內存中交換出來的數據都會被放到Swap中(如果這樣的話,Swap就會不堪重負),有相當一部分數據被直接交換到文件系統。例如,有的程序會打開一些文件,對文件進行讀寫(其實每個程序都至少要打開一個文件,那就是運行程序本身),當需要將這些程序的內存空間交換出去時,就沒有必要將文件部分的數據放到Swap空間中了,而可以直接將其放到文件里去。如果是讀文件操作,那麼內存數據被直接釋放,不需要交換出來,因為下次需要時,可直接從文件系統恢復;如果是寫文件,只需要將變化的數據保存到文件中,以便恢復。但是那些用malloc和new函數生成的對象的數據則不同,它們需要Swap空間,因為它們在文件系統中沒有相應的「儲備」文件,因此被稱作「匿名」(Anonymous)內存數據。這類數據還包括堆棧中的一些狀態和變數數據等。所以說,Swap空間是「匿名」數據的交換空間。
突破128M Swap限制
經常看到有些Linux(國內漢化版)安裝手冊上有這樣的說明:Swap空間不能超過128M。為什麼會有這種說法?在說明「128M」這個數字的來歷之前,先給問題一個回答:現在根本不存在128M的限制!現在的限制是2G!
Swap空間是分頁的,每一頁的大小和內存頁的大小一樣,方便Swap空間和內存之間的數據交換。舊版本的Linux實現Swap空間時,用Swap空間的第一頁作為所有Swap空間頁的一個「位映射」(Bit map)。這就是說第一頁的每一位,都對應著一頁Swap空間。如果這一位是1,表示此頁Swap可用;如果是0,表示此頁是壞塊,不能使用。這么說來,第一個Swap映射位應該是0,因為,第一頁Swap是映射頁。另外,最後10個映射位也被佔用,用來表示Swap的版本(原來的版本是Swap_space ,現在的版本是swapspace2)。那麼,如果說一頁的大小為s,這種Swap的實現方法共能管理「8 * ( s - 10 ) - 1」個Swap頁。對於i386系統來說s=4096,則空間大小共為133890048,如果認為1 MB=2^20 Byte的話,大小正好為128M。
之所以這樣來實現Swap空間的管理,是要防止Swap空間中有壞塊。如果系統檢查到Swap中有壞塊,則在相應的位映射上標記上0,表示此頁不可用。這樣在使用Swap時,不至於用到壞塊,而使系統產生錯誤。
現在的系統設計者認為:
現在硬碟質量很好,壞塊很少。
就算有,也不多,只需要將壞塊羅列出來,而不需要為每一頁建立映射。
如果有很多壞塊,就不應該將此硬碟作為Swap空間使用。
於是,現在的Linux取消了位映射的方法,也就取消了128M的限制。直接用地址訪問,限制為2G。
Swap配置對性能的影響
分配太多的Swap空間會浪費磁碟空間,而Swap空間太少,則系統會發生錯誤。
如果系統的物理內存用光了,系統就會跑得很慢,但仍能運行;如果Swap空間用光了,那麼系統就會發生錯誤。例如,Web伺服器能根據不同的請求數量衍生出多個服務進程(或線程),如果Swap空間用完,則服務進程無法啟動,通常會出現「application is out of memory」的錯誤,嚴重時會造成服務進程的死鎖。因此Swap空間的分配是很重要的。
通常情況下,Swap空間應大於或等於物理內存的大小,最小不應小於64M,通常Swap空間的大小應是物理內存的2-2.5倍。但根據不同的應用,應有不同的配置:如果是小的桌面系統,則只需要較小的Swap空間,而大的伺服器系統則視情況不同需要不同大小的Swap空間。特別是資料庫伺服器和Web伺服器,隨著訪問量的增加,對Swap空間的要求也會增加,具體配置參見各伺服器產品的說明。
另外,Swap分區的數量對性能也有很大的影響。因為Swap交換的操作是磁碟IO的操作,如果有多個Swap交換區,Swap空間的分配會以輪流的方式操作於所有的Swap,這樣會大大均衡IO的負載,加快Swap交換的速度。如果只有一個交換區,所有的交換操作會使交換區變得很忙,使系統大多數時間處於等待狀態,效率很低。用性能監視工具就會發現,此時的CPU並不很忙,而系統卻慢。這說明,瓶頸在IO上,依靠提高CPU的速度是解決不了問題的。
系統性能監視
Swap空間的分配固然很重要,而系統運行時的性能監控卻更加有價值。通過性能監視工具,可以檢查系統的各項性能指標,找到系統性能的瓶頸。本文只介紹一下在Solaris下和Swap相關的一些命令和用途。
最常用的是Vmstat命令(在大多數Unix平台下都有這樣一些命令),此命令可以查看大多數性能指標。
例如:
命令說明:
vmstat 後面的參數指定了性能指標捕獲的時間間隔。3表示每三秒鍾捕獲一次。第一行數據不用看,沒有價值,它僅反映開機以來的平均性能。從第二行開始,反映每三秒鍾之內的系統性能指標。這些性能指標中和Swap有關的包括以下幾項:
procs下的w
它表示當前(三秒鍾之內)需要釋放內存、交換出去的進程數量。
memory下的swpd
它表示使用的Swap空間的大小。
Swap下的si,so
si表示當前(三秒鍾之內)每秒交換回內存(Swap in)的總量,單位為kbytes;so表示當前(三秒鍾之內)每秒交換出內存(Swap out)的總量,單位為kbytes。
以上的指標數量越大,表示系統越忙。這些指標所表現的系統繁忙程度,與系統具體的配置有關。系統管理員應該在平時系統正常運行時,記下這些指標的數值,在系統發生問題的時候,再進行比較,就會很快發現問題,並制定本系統正常運行的標准指標值,以供性能監控使用。
另外,使用Swapon-s也能簡單地查看當前Swap資源的使用情況。例如:
能夠方便地看出Swap空間的已用和未用資源的大小。
應該使Swap負載保持在30%以下,這樣才能保證系統的良好性能。
有關Swap操作的系統命令
增加Swap空間,分以下幾步:
1)成為超級用戶
$su - root
2)創建Swap文件
# dd if=/dev/zero of=swapfile bs=1024 count=65536
創建一個有連續空間的交換文件。
3)激活Swap文件
#/usr/sbin/swapon swapfile
swapfile指的是上一步創建的交換文件。 4)現在新加的Swap文件已經起作用了,但系統重新啟動以後,並不會記住前幾步的操作。因此要在/etc/fstab文件中記錄文件的名字,和Swap類型,如:
/path/swapfile none Swap sw,pri=3 0 0
5)檢驗Swap文件是否加上
/usr/sbin/swapon -s
刪除多餘的Swap空間。
1)成為超級用戶
2)使用Swapoff命令收回Swap空間。
#/usr/sbin/swapoff swapfile
3)編輯/etc/fstab文件,去掉此Swap文件的實體。
4)從文件系統中回收此文件。
#rm swapfile
5)當然,如果此Swap空間不是一個文件,而是一個分區,則需創建一個新的文件系統,再掛接到原來的文件系統上。
❻ linux什麼情況就會使用到交換區swap,比如剩下多少內存,還有其他哪些因素
交換區可是看作是內存的一部分,只是它是從硬碟中劃分出來的。 它像windows下的虛擬內存。
它的作用是緩存數據。 劃分它時,大小設成你的物理內存的大小的兩倍。
當系統的物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,以供當前運行的程序使用。那些被釋放的空間可能來自一些很長時間沒有什麼操作的程序,這些被釋放的空間被臨時保存到Swap空間中,等到那些程序要運行時,再從Swap中恢復保存的數據到內存中。這樣,系統總是在物理內存不夠時,才進行Swap交換。 其實,Swap的調整對Linux伺服器,特別是Web伺服器的性能至關重要。通過調整Swap,有時可以越過系統性能瓶頸,節省系統升級費用。
❼ Linux下如何釋放內存,swap分區滿了怎麼辦
swap的作用可簡單描述為:當內存不夠用時,將存儲器中的數據塊從DRAM移到swap的磁碟空間中,以釋放更多的空間給當前進程使用.
當再次需要那些數據時,就可以將swap磁碟中的數據重新移到內存,而將那些不用的數據塊從內存移到swap中.
2)數據從內存移動交換區的行為被稱為頁面調用,發生在後台的頁面調用沒有來自應用程序的干涉.
3)swap空間是分頁的,每一頁的大小和內存頁的大小一樣.
4)並不是一定要給每個系統劃分SWAP,比如大多數的嵌入式就沒有swap.
##在執行以上操作以後,查看你的swap分區還是滿了,你首先查看一下你實際的內存剩多少空間,然後在查看自己的swap空間用了多少,首先提前保證實際剩餘的內存比你的swap的內存的空間要大,然後執行一下操作,否則會宕機的!
首先我們停掉swap分區,查看swap分區
swapon -s 會查看到你的swap分區是掛在哪裡!
然後比如說我的是掛到/dev/sda2
swapoff /dev/sda2
停止是需要一段時間的,因為他會把內存釋放到實際內存當中,
然後在啟動我們的swap分區
swapon -a
我們的swap分區內存已經成功釋放到了實際內存當中!
❽ 如何解決Linux系統Swap耗盡問題
除非老機子,新機子,一般都不需要SWAP交換分區了.如果是老機子,參考如下解決方法:
1、啟動應用時報內存不足,直接Linux命令行top查看下。swap used100%,0free。
2、reboot伺服器能有效的釋放swap,可是很多情況下是不能重啟伺服器的。這時就要弄明白是什麼占著內存。查看下/proc目錄下內容,發現很多數字命名的目錄,這些就是Linux的進程了。
3、要讓進程釋放swap的方法只有kill掉該進程了。寫個腳本來查看具體是哪些進程占著內存啦。
一、對/proc目錄下所有以數字為名的目錄進行遍歷
二、1目錄是根進程重啟會導致系統重啟,所以直接排除掉。
三、算出每個進程佔用內存的大小,然後按照大小排序
四、輸出內存佔用大於1MB的進程
4、將運行結果保存到swap.log文件中
5、查看swap.log.10325這個進程內存佔用最多有130幾M。
6、直接kill掉,然後再top查看。ok,swap一下子釋放了很多,搞定。
❾ 如何管理配置 Linux下Swap交換分區
理解什麼是swap分區
Swap是Linux下的虛擬內存分區,他的主要作用是在物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,讓當前的程序來使用,這些內存釋放出來的空間沒有什麼操作的程序,這些釋放的內存將被保存到swap空間中,等到這寫程序在運行的時候,再從swap虛擬空間來讀取這些程序給內存來使用。這樣中是在系統內存不夠用的時候,進行交換。在針對Linux web伺服器的時候,調整swap能提高系統很大的性能。
現在操作系統都突破了物理內存的限制,讓程序可以操作大於物理內存的空間,虛擬內存想防火牆一樣,讓每個進程不受其他程序的干擾。
我們需要注意的是不是所以的物理內存數據都會被交換到swap中的,要是所有的內存都放在swap中肯的是不可能的,所以有一部分直接交換到文件系統。當這文件讀取的時候,直接從文件系統調用不從swap調用程序文件。
早期的時候經常看見說swap不能超過128M,現在我們的伺服器一般不存在這種問題最大可以swap到2048M的.swap空間文件的結構是分頁的每一頁的大小和內存頁的大小是一樣的,這樣的好處是方便swap空間和內存之間的交換,舊版本的Linux實現Swap空間時,用Swap空間的第一頁作為所有Swap空間頁的一個「位映射」。這就是說第一頁的每一位,都對應著一頁Swap空間。如果這一位是1,表示此頁Swap可用;如果是0,表示此頁是壞塊,不能使用。這么說來,第一個Swap映射位應該是0,因為,第一頁Swap是映射頁。
所以取消了Linux映射的方法。
一般創建swap有兩種方法
第一種方法是在創建系統的時候添加swap分區
還有一種是在系統創建完之後再創建swap分區,或者創建臨時的swap。我們需要注意的是,在創建系統的時候我們沒有swap分區也是能正常安裝部署系統的,只是當系統文件調用swa文件的的時候會發生錯誤,所以我們需要swap不是沒有swap不一定能啟動起來系統。
查看當前swap資源的使用情況:
Swapon –s free –m
❿ 如何清理Linux中的swap,buffer及cache
使用 Furius ISO Mount 軟體,該方法的優點是無需記住以上命令,也無需輸入用戶密碼提權,推薦大家使用。首先安裝 Furius ISO Mount,Ubuntu 用戶可在 Ubuntu 軟體中心搜索安裝,或者在終端中輸入sudo apt-get
install furiusisomount。
其他 Linux 發行版請使用相應軟體包管理器安裝或自行編譯安裝。
註:由於許可權問題,部分發行版(Ubuntu 用戶無需進行此操作)可能需要將用戶添加到 fuse 組,執行sudo adser username
fuse即可。