首先,swap空間是由磁盤(pán)空間轉(zhuǎn)換成虛擬內(nèi)存空間的,而tmpfs是由虛擬內(nèi)存空間轉(zhuǎn)換成文件系統(tǒng)使用的。而swap空間是由操作系統(tǒng)和tmpfs文件系統(tǒng)使用,而tmpfs是由用戶指定才能使用;默認(rèn)情況下,系統(tǒng)會(huì)把/dev/shm掛載為tmpfs系統(tǒng),并且默認(rèn)大小是實(shí)際內(nèi)存大小的一半,這個(gè)大小只是一個(gè)上限值,并且tmpfs使用的是VM的空間,VM就是虛擬內(nèi)存,由物理內(nèi)存和swap組成,如果你的/dev/shm里面沒(méi)有放任何東西,那么不會(huì)占用VM的大小,如果設(shè)置tmpfs的大小超過(guò)物理內(nèi)存的一半,而且使用tmpfs的時(shí)候也超過(guò)了物理內(nèi)存的一般,那么tmpfs將使用swap空間。使用完畢之后,/dev/shm下面的某些內(nèi)容被刪除了,那么VM的空間也會(huì)相應(yīng)的自動(dòng)回收,所以tmpfs真正使用的空間大小是由VM管理子系統(tǒng)自動(dòng)管理的。而swap是由磁盤(pán)創(chuàng)建的,里面存放的主要是一些匿名變量,包括堆棧空間,由new和malloc分配的空間,進(jìn)程和線程被操作系統(tǒng)調(diào)度時(shí)使用到的某些資源。
swap分區(qū)的詳細(xì)介紹:
Swap,即交換區(qū),除了安裝Linux的時(shí)候,有多少人關(guān)心過(guò)它呢?其實(shí),Swap的調(diào)整對(duì)Linux服務(wù)器,特別是Web服務(wù)器的性能至關(guān)重要。通過(guò)調(diào)整Swap,有時(shí)可以越過(guò)系統(tǒng)性能瓶頸,節(jié)省系統(tǒng)升級(jí)費(fèi)用。
Swap的原理是一個(gè)較復(fù)雜的問(wèn)題,需要大量的篇幅來(lái)說(shuō)明。在這里只作簡(jiǎn)單的介紹,在以后的文章中將和大家詳細(xì)討論Swap實(shí)現(xiàn)的細(xì)節(jié)。
眾所周知,現(xiàn)代操作系統(tǒng)都實(shí)現(xiàn)了“虛擬內(nèi)存”這一技術(shù),不但在功能上突破了物理內(nèi)存的限制,使程序可以操縱大于實(shí)際物理內(nèi)存的空間,更重要的是,“虛擬內(nèi)存”是隔離每個(gè)進(jìn)程的安全保護(hù)網(wǎng),使每個(gè)進(jìn)程都不受其它程序的干擾。
Swap 空間的作用可簡(jiǎn)單描述為:當(dāng)系統(tǒng)的物理內(nèi)存不夠用的時(shí)候,就需要將物理內(nèi)存中的一部分空間釋放出來(lái),以供當(dāng)前運(yùn)行的程序使用。那些被釋放的空間可能來(lái)自一些很長(zhǎng)時(shí)間沒(méi)有什么操作的程序,這些被釋放的空間被臨時(shí)保存到Swap空間中,等到那些程序要運(yùn)行時(shí),再?gòu)腟wap中恢復(fù)保存的數(shù)據(jù)到內(nèi)存中。這樣,系統(tǒng)總是在物理內(nèi)存不夠時(shí),才進(jìn)行Swap交換。
計(jì)算機(jī)用戶會(huì)經(jīng)常遇這種現(xiàn)象。例如,在使用Windows系統(tǒng)時(shí),可以同時(shí)運(yùn)行多個(gè)程序,當(dāng)你切換到一個(gè)很長(zhǎng)時(shí)間沒(méi)有理會(huì)的程序時(shí),會(huì)聽(tīng)到硬盤(pán)“嘩嘩”直響。這是因?yàn)檫@個(gè)程序的內(nèi)存被那些頻繁運(yùn)行的程序給“偷走”了,放到了Swap區(qū)中。因此,一旦此程序被放置到前端,它就會(huì)從Swap區(qū)取回自己的數(shù)據(jù),將其放進(jìn)內(nèi)存,然后接著運(yùn)行。
需要說(shuō)明一點(diǎn),并不是所有從物理內(nèi)存中交換出來(lái)的數(shù)據(jù)都會(huì)被放到Swap中(如果這樣的話,Swap就會(huì)不堪重負(fù)),有相當(dāng)一部分?jǐn)?shù)據(jù)被直接交換到文件系統(tǒng)。例如,有的程序會(huì)打開(kāi)一些文件,對(duì)文件進(jìn)行讀寫(xiě)(其實(shí)每個(gè)程序都至少要打開(kāi)一個(gè)文件,那就是運(yùn)行程序本身),當(dāng)需要將這些程序的內(nèi)存空間交換出去時(shí),就沒(méi)有必要將文件部分的數(shù)據(jù)放到 Swap空間中了,而可以直接將其放到文件里去。如果是讀文件操作,那么內(nèi)存數(shù)據(jù)被直接釋放,不需要交換出來(lái),因?yàn)橄麓涡枰獣r(shí),可直接從文件系統(tǒng)恢復(fù);如果是寫(xiě)文件,只需要將變化的數(shù)據(jù)保存到文件中,以便恢復(fù)。但是那些用malloc和new函數(shù)生成的對(duì)象的數(shù)據(jù)則不同,它們需要Swap空間,因?yàn)樗鼈冊(cè)谖募到y(tǒng)中沒(méi)有相應(yīng)的“儲(chǔ)備”文件,因此被稱作“匿名”(Anonymous)內(nèi)存數(shù)據(jù)。這類數(shù)據(jù)還包括堆棧中的一些狀態(tài)和變量數(shù)據(jù)等。所以說(shuō),Swap 空間是“匿名”數(shù)據(jù)的交換空間。
突破128M Swap限制
經(jīng)常看到有些Linux(國(guó)內(nèi)漢化版)安裝手冊(cè)上有這樣的說(shuō)明:Swap空間不能超過(guò)128M。為什么會(huì)有這種說(shuō)法?在說(shuō)明“128M”這個(gè)數(shù)字的來(lái)歷之前,先給問(wèn)題一個(gè)回答:現(xiàn)在根本不存在128M的限制!現(xiàn)在的限制是2G!
Swap 空間是分頁(yè)的,每一頁(yè)的大小和內(nèi)存頁(yè)的大小一樣,方便Swap空間和內(nèi)存之間的數(shù)據(jù)交換。舊版本的Linux實(shí)現(xiàn)Swap空間時(shí),用Swap空間的第一頁(yè)作為所有Swap空間頁(yè)的一個(gè)“位映射”(Bit map)。這就是說(shuō)第一頁(yè)的每一位,都對(duì)應(yīng)著一頁(yè)Swap空間。如果這一位是1,表示此頁(yè)Swap可用;如果是0,表示此頁(yè)是壞塊,不能使用。這么說(shuō)來(lái),第一個(gè)Swap映射位應(yīng)該是0,因?yàn)?,第一?yè)Swap是映射頁(yè)。另外,最后10個(gè)映射位也被占用,用來(lái)表示Swap的版本(原來(lái)的版本是 Swap_space ,現(xiàn)在的版本是swapspace2)。那么,如果說(shuō)一頁(yè)的大小為s,這種Swap的實(shí)現(xiàn)方法共能管理“8 * ( s - 10 ) - 1”個(gè)Swap頁(yè)。對(duì)于i386系統(tǒng)來(lái)說(shuō)s=4096,則空間大小共為133890048,如果認(rèn)為1 MB=2^20 Byte的話,大小正好為128M。
之所以這樣來(lái)實(shí)現(xiàn)Swap空間的管理,是要防止Swap空間中有壞塊。如果系統(tǒng)檢查到Swap中有壞塊,則在相應(yīng)的位映射上標(biāo)記上0,表示此頁(yè)不可用。這樣在使用Swap時(shí),不至于用到壞塊,而使系統(tǒng)產(chǎn)生錯(cuò)誤。
現(xiàn)在的系統(tǒng)設(shè)計(jì)者認(rèn)為:
1.現(xiàn)在硬盤(pán)質(zhì)量很好,壞塊很少。
2.就算有,也不多,只需要將壞塊羅列出來(lái),而不需要為每一頁(yè)建立映射。
3.如果有很多壞塊,就不應(yīng)該將此硬盤(pán)作為Swap空間使用。
于是,現(xiàn)在的Linux取消了位映射的方法,也就取消了128M的限制。直接用地址訪問(wèn),限制為2G。
Swap配置對(duì)性能的影響
分配太多的Swap空間會(huì)浪費(fèi)磁盤(pán)空間,而Swap空間太少,則系統(tǒng)會(huì)發(fā)生錯(cuò)誤。
如果系統(tǒng)的物理內(nèi)存用光了,系統(tǒng)就會(huì)跑得很慢,但仍能運(yùn)行;如果Swap空間用光了,那么系統(tǒng)就會(huì)發(fā)生錯(cuò)誤。例如,Web服務(wù)器能根據(jù)不同的請(qǐng)求數(shù)量衍生出多個(gè)服務(wù)進(jìn)程(或線程),如果Swap空間用完,則服務(wù)進(jìn)程無(wú)法啟動(dòng),通常會(huì)出現(xiàn)“application is out of memory”的錯(cuò)誤,嚴(yán)重時(shí)會(huì)造成服務(wù)進(jìn)程的死鎖。因此Swap空間的分配是很重要的。
通常情況下,Swap空間應(yīng)大于或等于物理內(nèi)存的大小,最小不應(yīng)小于64M,通常Swap空間的大小應(yīng)是物理內(nèi)存的2-2.5倍。但根據(jù)不同的應(yīng)用,應(yīng)有不同的配置:如果是小的桌面系統(tǒng),則只需要較小的Swap空間,而大的服務(wù)器系統(tǒng)則視情況不同需要不同大小的Swap空間。特別是數(shù)據(jù)庫(kù)服務(wù)器和Web服務(wù)器,隨著訪問(wèn)量的增加,對(duì)Swap空間的要求也會(huì)增加,具體配置參見(jiàn)各服務(wù)器產(chǎn)品的說(shuō)明。
另外,Swap分區(qū)的數(shù)量對(duì)性能也有很大的影響。因?yàn)镾wap交換的操作是磁盤(pán)IO 的操作,如果有多個(gè)Swap交換區(qū),Swap空間的分配會(huì)以輪流的方式操作于所有的Swap,這樣會(huì)大大均衡IO的負(fù)載,加快Swap交換的速度。如果只有一個(gè)交換區(qū),所有的交換操作會(huì)使交換區(qū)變得很忙,使系統(tǒng)大多數(shù)時(shí)間處于等待狀態(tài),效率很低。用性能監(jiān)視工具就會(huì)發(fā)現(xiàn),此時(shí)的CPU并不很忙,而系統(tǒng)卻慢。這說(shuō)明,瓶頸在IO上,依靠提高CPU的速度是解決不了問(wèn)題的。
系統(tǒng)性能監(jiān)視
Swap空間的分配固然很重要,而系統(tǒng)運(yùn)行時(shí)的性能監(jiān)控卻更加有價(jià)值。通過(guò)性能監(jiān)視工具,可以檢查系統(tǒng)的各項(xiàng)性能指標(biāo),找到系統(tǒng)性能的瓶頸。本文只介紹一下在Solaris下和Swap相關(guān)的一些命令和用途。
最常用的是Vmstat命令(在大多數(shù)Unix平臺(tái)下都有這樣一些命令),此命令可以查看大多數(shù)性能指標(biāo)。
例如:
# vmstat 3
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
0 0 0 0 93880 3304 19372 0 0 10 2 131 10 0 0 99
0 0 0 0 93880 3304 19372 0 0 0 0 109 8 0 0 100
0 0 0 0 93880 3304 19372 0 0 0 0 112 6 0 0 100
…………
命令說(shuō)明:
vmstat 后面的參數(shù)指定了性能指標(biāo)捕獲的時(shí)間間隔。3表示每三秒鐘捕獲一次。第一行數(shù)據(jù)不用看,沒(méi)有價(jià)值,它僅反映開(kāi)機(jī)以來(lái)的平均性能。從第二行開(kāi)始,反映每三秒鐘之內(nèi)的系統(tǒng)性能指標(biāo)。這些性能指標(biāo)中和Swap有關(guān)的包括以下幾項(xiàng):
procs下的w
它表示當(dāng)前(三秒鐘之內(nèi))需要釋放內(nèi)存、交換出去的進(jìn)程數(shù)量。
memory下的swpd
它表示使用的Swap空間的大小。
Swap下的si,so
si表示當(dāng)前(三秒鐘之內(nèi))每秒交換回內(nèi)存(Swap in)的總量,單位為kbytes;so表示當(dāng)前(三秒鐘之內(nèi))每秒交換出內(nèi)存(Swap out)的總量,單位為kbytes。
以上的指標(biāo)數(shù)量越大,表示系統(tǒng)越忙。這些指標(biāo)所表現(xiàn)的系統(tǒng)繁忙程度,與系統(tǒng)具體的配置有關(guān)。系統(tǒng)管理員應(yīng)該在平時(shí)系統(tǒng)正常運(yùn)行時(shí),記下這些指標(biāo)的數(shù)值,在系統(tǒng)發(fā)生問(wèn)題的時(shí)候,再進(jìn)行比較,就會(huì)很快發(fā)現(xiàn)問(wèn)題,并制定本系統(tǒng)正常運(yùn)行的標(biāo)準(zhǔn)指標(biāo)值,以供性能監(jiān)控使用。
另外,使用Swapon-s也能簡(jiǎn)單地查看當(dāng)前Swap資源的使用情況。例如:
# swapon -s
Filename Type Size Used Priority
/dev/hda9 partition 361420 0 3
能夠方便地看出Swap空間的已用和未用資源的大小。
應(yīng)該使Swap負(fù)載保持在30%以下,這樣才能保證系統(tǒng)的良好性能。
有關(guān)Swap操作的系統(tǒng)命令
增加Swap空間,分以下幾步:
1)成為超級(jí)用戶
$su - root
2)創(chuàng)建Swap文件
# dd if=/dev/zero of=swapfile bs=1024 count=65536
創(chuàng)建一個(gè)有連續(xù)空間的交換文件。
3)激活Swap文件
#/usr/sbin/swapon swapfile
swapfile指的是上一步創(chuàng)建的交換文件。 4)現(xiàn)在新加的Swap文件已經(jīng)起作用了,但系統(tǒng)重新啟動(dòng)以后,并不會(huì)記住前幾步的操作。因此要在/etc/fstab文件中記錄文件的名字,和Swap類型,如:
/path/swapfile none Swap sw,pri=3 0 0
5)檢驗(yàn)Swap文件是否加上
/usr/sbin/swapon -s
刪除多余的Swap空間。
1)成為超級(jí)用戶
2)使用Swapoff命令收回Swap空間。
#/usr/sbin/swapoff swapfile
3)編輯/etc/fstab文件,去掉此Swap文件的實(shí)體。
4)從文件系統(tǒng)中回收此文件。
#rm swapfile
5)當(dāng)然,如果此Swap空間不是一個(gè)文件,而是一個(gè)分區(qū),則需創(chuàng)建一個(gè)新的文件系統(tǒng),再掛接到原來(lái)的文件系統(tǒng)上。
tmpfs文件系統(tǒng)的介紹:
linux下面VM的大小由RM(Real Memory)和swap組成,RM的大小就是物理內(nèi)存的大小,而Swap的大小是由你自己決定的。Swap是通過(guò)硬盤(pán)虛擬出來(lái)的內(nèi)存空間,因此它的讀寫(xiě)速度相對(duì)RM(Real Memory)要慢許多,我們?yōu)槭裁葱枰猄wap呢?當(dāng)一個(gè)進(jìn)程申請(qǐng)一定數(shù)量的內(nèi)存時(shí),如內(nèi)核的vm子系統(tǒng)發(fā)現(xiàn)沒(méi)有足夠的RM時(shí),就會(huì)把RM里面的一些不常用的數(shù)據(jù)交換到Swap里面,如果需要重新使用這些數(shù)據(jù)再把它們從Swap交換到RM里面。 如果你有足夠大的物理內(nèi)存,根本不需要?jiǎng)澐諷wap分區(qū)。
通過(guò)上面的說(shuō)明,你該知道tmpfs使用的存儲(chǔ)空間VM是什么了吧? 前面說(shuō)過(guò)VM由RM+Swap兩部分組成,因此tmpfs最大的存儲(chǔ)空間可達(dá)(The size of RM + The size of Swap)。 但是對(duì)于tmpfs本身而言,它并不知道自己使用的空間是RM還是Swap,這一切都是由內(nèi)核的vm子系統(tǒng)管理的。
怎樣使用tmpfs呢?
CODE: #mount -t tmpfs -o size=20m tmpfs /mnt/tmp |
上面這條命令分配了上限為20m的VM到/mnt/tmp目錄下,用df命令查看一下,確實(shí)/mnt/tmp掛載點(diǎn)顯示的大小是20m,但是tmpfs一個(gè)優(yōu)點(diǎn)就是它的大小是隨著實(shí)際存儲(chǔ)的容量而變化的,換句話說(shuō),假如/mnt/tmp目錄下什么也沒(méi)有,tmpfs并不占用VM。上面的參數(shù)20m只是告訴內(nèi)核這個(gè)掛載點(diǎn)最大可用的VM為20m,如果不加上這個(gè)參數(shù),tmpfs默認(rèn)的大小是RM的一半,假如你的物理內(nèi)存是128M,那么tmpfs默認(rèn)的大小就是64M,
tmpfs有沒(méi)有缺點(diǎn)呢?
當(dāng)然有,由于它的數(shù)據(jù)是在VM里面,因此斷電或者你卸載它之后,數(shù)據(jù)就會(huì)立即丟失,這也許就是它叫tmpfs的原故。不過(guò)這其實(shí)不能說(shuō)是缺點(diǎn)。那tmpfs到底有什么用呢?
tmpfs的用途
由于tmpfs使用的是VM,因此它比硬盤(pán)的速度肯定要快,因此我們可以利用這個(gè)優(yōu)點(diǎn)使用它來(lái)提升機(jī)器的性能。
CODE: #mount -t tmpfs -o size=2m tmpfs /tmp |
上面這條命令分配了最大2m的VM給/tmp。
由于/tmp目錄是放臨時(shí)文件的地方,因此我們可以使用tmpfs來(lái)加快速度,由于沒(méi)有掛載之前/tmp目錄下的文件也許正在被使用,因此掛載之后系統(tǒng)也許有的程序不能正常工作。沒(méi)有關(guān)系,只要在/etc/fstab里面加上下面的語(yǔ)句
CODE: tmpfs /tmp tmpfs size=2m 0 0 |
重啟電腦之后就一切OK了。
RAMDISK的介紹:
Linux內(nèi)存磁盤(pán),虛擬硬盤(pán)的使用
由于php沒(méi)有超級(jí)變量,一直想把一些變量,類等放到內(nèi)存,不用每次請(qǐng)求都重新讀取一次提高性能,但一直沒(méi)找到好的辦法
先是想到php的模塊 eacclerator,它可以使用系統(tǒng)的共享內(nèi)存,并且提供函數(shù)可以讀寫(xiě),但php的類有個(gè)問(wèn)題就是:實(shí)例化以后,類的方法不能被序列化,必須在之前包含,于是用共享內(nèi)存的方法失敗。
再想到用Linux系統(tǒng)帶的ram,把它掛載成磁盤(pán)不就行了:
首先執(zhí)行
然后掛載 mount /dev/ram0 /ram
這樣用時(shí)沒(méi)問(wèn)題的,但存在幾個(gè)問(wèn)題導(dǎo)致了我放棄了這個(gè)思路:1,啟動(dòng)的時(shí)候不能自動(dòng)掛載,就是沒(méi)法通過(guò)修改/etc/fstab 加載,因?yàn)榧虞d之前需要mkfs。2,文件系統(tǒng)導(dǎo)致內(nèi)存空間浪費(fèi),越先進(jìn)的fs浪費(fèi)越多,而內(nèi)存不需要太先進(jìn),因?yàn)椴豢紤]數(shù)據(jù)丟失。3,不論虛擬盤(pán)里有沒(méi)有文件,都會(huì)占用這么大的內(nèi)存,不能動(dòng)態(tài)分配。
經(jīng)過(guò)搜索和實(shí)踐,終于找到一個(gè)好的解決辦法,就是使用tmpfs,它是動(dòng)態(tài)管理的,而且可以放在/etc/fstab 啟動(dòng)時(shí)候加載,寫(xiě)一行:
tmpfs /var/ram tmpfs size=100M 0 0
表示 掛載到 /var/ram
只要在apache啟動(dòng)前把類文件解壓到此虛擬盤(pán)就行了,修改php.ini的include_path,這樣所有的include不再耗費(fèi)io時(shí)間,速度肯定暴快,而且還能用來(lái)保存一些需要快速讀取得變量,比如點(diǎn)擊統(tǒng)計(jì),也能存成超級(jí)變量,不過(guò)需要注意的是磁盤(pán)空間,如果服務(wù)器磁盤(pán)夠大,就沒(méi)問(wèn)題了。
如何創(chuàng)建任意大小的linux內(nèi)存虛擬硬盤(pán)
您講的內(nèi)存盤(pán)是英譯過(guò)來(lái)的:即ramdisk,并非虛擬內(nèi)存大多數(shù)的Linux發(fā)行版本中,內(nèi)存盤(pán)默認(rèn)使用的是/dev/shm 路徑,文件系統(tǒng)類型為tmpfs 默認(rèn)大小是內(nèi)存實(shí)際的大小,這很符合實(shí)際的操作習(xí)慣,操作這個(gè)路徑就是對(duì)內(nèi)存的操作。我們可以重新設(shè)置這個(gè)內(nèi)存盤(pán)的大小,或者建立新的內(nèi)存盤(pán),以加速一些特別的應(yīng)用,例如squid的緩沖,dns的緩沖文件等等。重設(shè)內(nèi)存盤(pán)大小:例如: mount -o remount,size=3G /dev/shm 注意size的大小可以的單位是M\k\G 新建內(nèi)存盤(pán):例如: mkdir /usr/local/squid/var/cache mount -t tmpfs -o size=3G,mode=0755 tmpfs /usr/local/squid/var/cache 注意重新設(shè)置內(nèi)存盤(pán)后為了使用下次啟用生效必須寫(xiě)到fstab文件中,一般linux是在/etc/fstab中。
在開(kāi)發(fā)中,程序經(jīng)常需要頻繁地讀寫(xiě)某些臨時(shí)文件,遇到這種情況,RAM disk就是最好的解決辦法。
簡(jiǎn)單地說(shuō),RAM disk就是將一塊內(nèi)存模擬成為某個(gè)磁盤(pán)驅(qū)動(dòng)器,對(duì)應(yīng)用程序來(lái)說(shuō),RAM disk和普通磁盤(pán)是完全一樣的,也就是說(shuō),RAM disk對(duì)應(yīng)用程序是“透明”的——唯一的區(qū)別在于,系統(tǒng)重新啟動(dòng)或者關(guān)機(jī)時(shí),存儲(chǔ)在RAM disk上的數(shù)據(jù)會(huì)丟失。
核心版本在2.4以上的Linux內(nèi)置了對(duì)RAM disk的支持,下面,我們就來(lái)看看如何使用RAM disk(操作系統(tǒng)為RedHat Linux AS)。
在默認(rèn)情況下,RedHat會(huì)創(chuàng)建16塊RAM disk,但不是所有的RAM disk都處于激活(active)狀態(tài)。下面列出了ram0-ram19一共20塊RAM disk,但只有ram0-ram15是可以使用的。
[root]# ls -l /dev/ram*
lrwxrwxrwx
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----
brw-rw----