❶ 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分區被哪些進程佔用實
相信很多的系統管理員可能都遇見過這樣的情況,用登錄一台伺服器,使用free命令查看內存,卻發現swap分區被佔用。那麼到底是什麼進程佔用了這部分swap分區呢?
從2.6.16版本的kernel開始,我們可以使用proc文件系統中的smaps來查找這個問題。下邊是一個列出所有進程佔用swap分區情況的列表。可以通過簡單修改就可以用於統計在/proc/$PID/smaps查出。以下是腳本:
復制代碼 代碼如下:
for
i in `cd /proc;ls |grep "^[0-9]"|awk ' $0 >100'` ;do awk
'/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps ;done |sort
-k2nr
❸ 如何解決Linux系統Swap耗盡問題
Linux系統上可以同時有多個swap,用swapon -s命令可以看到系統上所有的swap,用free命令看到的是swap總的大小。所以swap不夠用時可以再建立一個swap,一般可以用文件的方式建立一個swap空間。下面以1G大小的文件為例介紹如何用文件建立內存交換空間:
1. 使用dd命令在某個目錄(實際使用時換成其他目錄,/tmp目錄的數據會在重啟後丟失)下新建一個1G的文件:
dd if=/dev/zero of=/tmp/swap bs=1M count=1024
解釋:1M是單位,1024是數目,合計1024M就是總大小1G
2. 格式化這個文件為swap格式:(用mkswap命令)
mkswap /tmp/swap
3. 啟動swap,用swapon命令(就是將新建的swap添加到系統):
swapon /tmp/swap
4. 查看效果(用swapon的-s參數):
swapon -s
可以看到所有的swap分區,如果成功了,/tmp/swap必然在裡面。然後再用free命令查看,就可以看到swap空間增加了。
❹ linux下查看哪些進程在佔用swap
1、使用top命令查看當前進程swap佔用
2、使用腳本文件
#!/bin/bash
# Get current swap usage for all running processes
# Erik Ljungstrom 27/05/2011
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
do
let SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"
let OVERALL=$OVERALL+$SUM
SUM=0
done
echo "Overall swap used: $OVERALL"
注意:使用sudo或root許可權來執行該腳本,不然的話非執行用戶的進程的輸出結果為0.
❺ 為什麼linux的swap分區最好設置成內存容量的兩倍,這個倍數是怎麼得出的
這個並沒有硬性的指定你必須使用
物理內存
的2倍來作為交換分區的大小,但是一般的入門讀物裡面都喜歡把這一條列出來,這個其實是和你要載入的程序是有一定關系的,如果你的系統在滿載的時候,就會有一部分程序佔用的內存會被寫入交換分區,當這時你的系統突然down掉的話,可以保證你的swap里有足夠大的地方放下當時內存里的東西來作為後面查詢使用,大概就是這么個意思,如果你是新手設置為2倍物理內存大小的swap是無所謂的,如果你是高手那怎麼設置當然是你自己的事情了
❻ Linux 下查看哪個進程佔用swap空間
相當於Windows下的pagefile!!呵呵呵。是linux下的特殊的文件系統作為交換分區。你可以查看/proc/
swapinfo ,了解你的交換分區信息
❼ 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介紹
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分區比較多
最近有人問,我的系統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交換空間不足怎麼辦
1、使用分區:
在安裝OS時劃分出專門的交換分區,空間大小要事先規劃好,啟動系統時自動進行mount。
這種方法只能在安裝OS時設定,一旦設定好不容易改變,除非重裝系統。
2、使用swapfile:(或者是整個空閑分區)
新建臨時swapfile或者是空閑分區,在需要時設定為交換空間,最多可以增加8個swapfile。
交換空間的大小,與CPU密切相關,在i386系中,最多可以使用2GB的空間。
在系統啟動後根據需要在2G的總容量下進行增減。
這種方法比較靈活,也比較方便,缺點是啟動系統後需要手工設置。
以下是運用swapfile增加交換空間的步驟:
涉及到的命令:
free ---查看內存狀態命令,可以顯示memory,swap,buffer cache等的大小及使用狀況;
dd ---讀取,轉換並輸出數據命令;
mkswap ---設置交換區
swapon ---啟用交換區,相當於mount
swapoff ---關閉交換區,相當於umount
步驟:
1、創建swapfile:
root許可權下,創建swapfile,假設當前目錄為"/",執行如下命令:
# dd if=/dev/zero of=swapfile bs=1024 count=500000
則在根目錄下創建了一個swapfile,名稱為「swapfile」,大小為500M,也可以把文件輸出到自己想要的任何目錄中,
個人覺得還是直接放在根目錄下比較好,一目瞭然,不容易誤破壞,放在其他目錄下則不然了;
命令中選項解釋:
---of:輸出的交換文件的路徑及名稱;
---bs:塊大小,單位byte,一般為1k即1024個byte;
---count:總塊數即空間總大小,單位為塊即k;
---if:讀取的源空閑空間,為什麼是zero,不清楚,先固定這么寫吧;
2、將swapfile設置為swap空間
# mkswap swapfile
3、啟用交換空間,這個操作有點類似於mount操作(個人理解):
# swapon swapfile
至此增加交換空間的操作結束了,可以使用free命令查看swap空間大小是否發生變化;
4、如果不再使用空間可以選擇關閉交換空間,這個操作有點類似於umount操作(個人理解)::
# swapoff swapfile
使用這種方法在每次系統啟動時都需要手動設置、開啟swapfile,比較麻煩,解決方法:
在 /etc/rc.d/rc.local 文件的末行下追加加以下內容:(編輯這個文件當然是用vi了~)
/sbin/swapon /swapfile
保存後退出,這樣在系統啟動後,swap空間就會自動載入了;
總結:在安裝OS時一定要規劃後swap大小,通常為內存的2倍,但是要考慮到以後增加內存的可能,所以可以考慮設的稍大一些,想在虛擬機裡面安裝oracle10g,發現默認的swap交換空間不滿足最低要求,因為我分配的物理內存是1G,那麼就按照要求需要2G的swap交換空間,默認只有1G的交換空間。
添加swap交換空間的步驟如下:
第一步:確保系統中有足夠的空間來用做swap交換空間,我使用的是KVM,准備在一個獨立的文件系統中添加一個swap交換文件,在/opt/image中添加2G的swap交換文件
第二步:添加交換文件並設置其大小為2G,使用如下命令
[root@sense image]# dd if=/dev/zero of=/opt/image/swap bs=1024 count=2048000
過段時間就返回如下結果:
2048000+0 records in
2048000+0 records out
2097152000 bytes (2.1 GB) copied, 272.867 seconds, 7.7 MB/s
第三步:創建(設置)交換空間,使用命令mkswap
[root@sense image]# mkswap /opt/image/swap
Setting up swapspace version 1, size = 2097147 kB
第四步:檢查現有的交換空間大小,使用命令free
[root@sense image]# free -m
total used free shared buffers cached
Mem: 1011 989 21 0 1 875
-/+ buffers/cache: 112 898
Swap: 1027 0 1027
或者檢查meminfo文件
grep SwapTotal /proc/meminfo
第五步:啟動新增加的2G的交換空間,使用命令swapon
[root@sense image]# swapon /opt/image/swap
第六步:確認新增加的2G交換空間已經生效,使用命令free
[[root@sense image]# free -m
total used free shared buffers cached
Mem: 1011 995 15 0 4 877
-/+ buffers/cache: 113 897
Swap: 3027 0 3027
或者檢查meminfo文件
grep SwapTotal /proc/meminfo
第七步:修改/etc/fstab文件,使得新加的2G交換空間在系統重新啟動後自動生效
在文件最後加入:
/opt/image/swap swap swap defaults 0 0
我的操作
[root@weblogic Server]# free
total used free shared buffers cached
Mem: 1785856 1753452 32404 0 38592 1036312
-/+ buffers/cache: 678548 1107308
Swap: 2064376 116 2064260
創建交換空間文件,1000M
[root@weblogic /]# dd if=/dev/zero of=/swapfile bs=1024 count=1000000
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 28.5423 seconds, 35.9 MB/s
[root@weblogic /]# mkswap swapfile
Setting up swapspace version 1, size = 1023995 kB
[root@weblogic /]# swapon swapfile 打開
[root@weblogic /]#swapoff swapfile 關閉
刪除
swapoff swapfile
rm -rf swapfile