1. 程式人生 > >如何增加Ubuntu的虛擬記憶體(轉)

如何增加Ubuntu的虛擬記憶體(轉)

今日編譯某軟體系統時,出現如下錯誤:

virtual memory exhausted: Cannot allocate memory 

為解決此問題,找到如下解決方案。

1、開啟終端,切換到root使用者,輸入:free -m檢視記憶體狀態
[[email protected] lxt]# free -m
total used free shared buffers cached
Mem: 498 357 141 0 27 162
-/+ buffers/cache: 167 331
Swap: 1023 0 1023
2、輸入df -B M(或df -m)檢視各分割槽當前使用情況
[[email protected]

lxt]# df -B M
檔案系統 1M-塊 已用 可用 已用% 掛載點
/dev/mapper/vg_lxt-lv_root
12875M 4059M 8162M 34% /
/dev/sda7 194M 14M 170M 8% /boot
tmpfs 250M 1M 249M 1% /dev/shm
(fdisk -l可檢視磁碟分割槽情況)
3、選擇一個較大的分割槽,建立分割槽檔案:
[[email protected] lxt]# dd if=/dev/zero of=/swapadd bs=1024 count=524288
524288+0 records in
524288+0 records out
536870912 bytes (537 MB) copied,13.0709 秒,41.1 MB/秒
以上命令在根目錄新建一個名為swapadd,大小為512M的虛擬記憶體檔案
4、移動該檔案到空間較大的其他分割槽:
[
[email protected]
lxt]# mkdir /mnt/swap
[[email protected] /]# mv swapadd /mnt/swap
5、執行以下命令啟用虛擬記憶體並重啟電腦
[[email protected] /]# mkswap /mnt/swap/swapadd
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=a5c8b651-6f64-4414-bb5f-580b742acfce
[[email protected] /]# swapon /mnt/swap/swapadd
檢視記憶體:
[
[email protected]
/]# free -m
total used free shared buffers cached
Mem: 498 492 6 0 15 302
-/+ buffers/cache: 174 323
Swap: 1535 0 1535
6、如果不需要使用新增的虛擬記憶體,則輸入:
swapoff -v /mnt/swap/swapadd

擴充套件:

如果需要一直保持這個 swap ,可以sudo -s換到root
然後把它寫入 /etc/fstab 檔案。

swapadd path swap swap defaults 0 0

清除Linux快取

今天用spot on light 查了一下開發伺服器的記憶體佔用,只剩下60MB 用下面的方法就可以實現清空快取 頻繁的檔案訪問會導致系統的Cache使用量大增
首先使用free -m檢視剩餘記憶體 [[email protected]Oracle ~]# free -m
total used free shared buffers cached
Mem: 3383 3319 63 0 97 2395
-/+ buffers/cache: 826 2556
Swap: 1983 195 1788

total 記憶體總數 used 已經使用的記憶體數 free 空閒的記憶體數 shared 多個程序共享的記憶體總額

說明,釋放前最好sync一下,防止丟資料。

使用方式 : sync
使用說明 : Linux 系統中欲寫入硬碟的資料有的時候會了效率起見,

     會寫到 filesystem buffer 中,這個 buffer 是一塊記憶體空間,

     如果欲寫入硬碟的資料存於此 buffer 中,而系統又突然斷電的話,

     那麼資料就會流失了,sync 指令會將存於 buffer 中的資料強制寫入硬碟中。

[[email protected] ~]# echo 1 > /proc/sys/vm/drop_caches
[[email protected] ~]# sysctl -p


[[email protected] ~]# free -m
total used free shared buffers cached
Mem: 3383 1952 1431 0 1 1136
-/+ buffers/cache: 814 2568
Swap: 1983 195 1788 說明:
1>. /proc是一個虛擬檔案系統,我們可以通過對它的讀寫操作作為與kernel實體間進行通訊的一種手段。也就是說可以通過修改/proc中的檔案,來對當前kernel的行為做出調整。也就是說我們可以通過調整/proc/sys/vm/drop_caches來釋放記憶體。 0 – 不釋放
1 – 釋放頁快取
2 – 釋放dentries和inodes
3 – 釋放所有快取
數字1是用來清空最近放問過的檔案頁面快取 數字2是用來清空檔案節點快取和目錄項快取 數字3是用來清空1和2所有內容的快取。 2>. 關於drop_caches的官方說明如下: Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to becomefree.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 >/proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first. 3>. Linux核心會將它最近訪問過的檔案頁面快取在記憶體中一段時間,這個檔案快取被稱為pagecache。 Inode是linux/unix作業系統中的一種資料結構,包含了各檔案相關的一些重要資訊。在建立檔案系統時,就會同時建立大量的inode。一般inode表會佔用檔案系統磁碟空間的1%。

目錄項快取(dcache)dentries

各引數含義:
total:總實體記憶體
used:已使用記憶體
free:完全未被使用的記憶體
shared:應用程式共享記憶體
buffers:快取,主要用於目錄方面,inode值等
cached:快取,用於已開啟的檔案
-buffers/cache:應用程式使用的記憶體大小,used減去快取值
+buffers/cache:所有可供應用程式使用的記憶體大小,free加上快取值 其中:
total = used + free
-buffers/cache=used-buffers-cached,這個是應用程式真實使用的記憶體大小
+buffers/cache=free+buffers+cached,這個是伺服器真實還可利用的記憶體大小
[[email protected] ~]$ free -m
total used free shared buffers cached
Mem: 32096 10379 21717 0 38 7942
-/+ buffers/cache: 2398 29698
Swap: 34287 0 34287
這裡面的第二行才是真正伺服器的空閒記憶體 2. Linux的記憶體分配方式 大家都知道,Linux伺服器為了提高效率,會提前申請記憶體,即使這些記憶體沒有被具體應用使用,Linux也會提前申請這些記憶體,然後利用這些記憶體做快取用,即將剛開啟的檔案系統存入cache中,這樣對應的伺服器free值會越來越少,buffers和cached會越來越大,因此給大家表象就是記憶體越來越少了,大家就緊張了;其實,大家完全不用緊張,Linux伺服器在發現記憶體不足時,會自動清理cached區域,釋放記憶體,然後繼續增大cache,free繼續減少。因此,那樣手動降低記憶體使用率的方法,其實就是圖一時之快,呵呵。

echo 1 > /proc/sys/vm/drop_caches 可以暫時清空cache和buffer

在rhel5和Ubuntu上(rhel4不可以),可以直接修改核心檔案
# /etc/sysctl.conf
vm.drop_caches = 1

#sysctl -p

$ sync
$ free -m
total used free shared buffers cached
Mem: 32096 30084 2011 0 590 26162
-/+ buffers/cache: 3332 28764
Swap: 34287 0 34287
echo 3 > /proc/sys/vm/drop_caches
free -m

原本以為是oracle快取佔滿了, 在SQLPLUS中輸入 ALTER SYSTEM FLUSH BUFFER_CACHE; alter system flush shared_pool; 但是看了一下效果不明顯 後面試試Linux清除ARP快取
一、 arp -n|awk '/^[1-9]/ {print "arp -d "$1}' | sh
清除所有ARP快取,推薦!
二、for((ip=2;ip<255;ip++));do arp -d 192.168.0.$ip &>/dev/null;done
清除192.168.0.0網段的所有快取
三、arp -d IP
這樣可以清除單一IP 的ARP快取 注意:以上均需要root許可權,尤其是最後一個,如果不再root下執行,則改為: arp -n|awk '/^[1-9]/ {print "arp -d "$1}' | sudo sh