[AIRFLOW] 如何增加Ubuntu的虛擬內存


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

virtual memory exhausted: Cannot allocate memory 

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

1、打開終端,切換到root用戶,輸入:free -m查看內存狀態
[root@lxt 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)查看各分區當前使用情況
[root@lxt 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、選擇一個較大的分區,建立分區文件:
[root@lxt 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、移動該文件到空間較大的其他分區:
[root@lxt lxt]# mkdir /mnt/swap
[root@lxt /]# mv swapadd /mnt/swap
5、執行以下命令啟用虛擬內存並重啟電腦
[root@lxt /]# mkswap /mnt/swap/swapadd
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=a5c8b651-6f64-4414-bb5f-580b742acfce
[root@lxt /]# swapon /mnt/swap/swapadd
查看內存:
[root@lxt /]# 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查看剩余內存
[root@ 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 中的資料強制寫入硬盤中。

 

[root@Oracle ~]# echo 1 > /proc/sys/vm/drop_caches
[root@oracle ~]# sysctl -p


[root@oracle ~]# 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,這個是服務器真實還可利用的內存大小

[oracle@cddserver1 ~]$ 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM