linux下的/dev/shm/及對Oracle 的影響

1、/dev/shm/介紹:php

/dev/shm/是linux下一個很是有用的目錄,由於這個目錄不在硬盤上,而是在內存裏。所以在linux下,就不須要大費周折去建ramdisk,直接使用/dev/shm/就可達到很好的優化效果。 
/dev /shm/須要注意的一個是容量問題,在linux下,它默認最大爲內存的一半大小,使用df -h命令能夠看到。但它並不會真正的佔用這塊內存,若是/dev/shm/下沒有任何文件,它佔用的內存實際上就是0字節;若是它最大爲1G,裏頭放有 100M文件,那剩餘的900M仍然可爲其它應用程序所使用,但它所佔用的100M內存,是毫不會被系統回收從新劃分的,不然誰還敢往裏頭存文件呢? 
默認的最大一半內存大小在某些場合可能不夠用,而且默認的inode數量很低通常都要調高些,這時能夠用mount命令來管理它。 mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shmhtml

在2G的機器上,將最大容量調到1.5G,而且inode數量調到1000000,這意味着大體可存入最多一百萬個小文件。node

爲當/dev/shm空間不夠時能夠佔用swap的空間,因此不用擔憂存儲空間不夠用。想一想看,從磁盤IO操做到內存操做,php讀寫SESSION的速度會快多少?只是須要注意,存儲在/dev/shm的數據,在服務器重啓後會所有丟失。mysql

 

默認系統就會加載/dev/shm ,它就是所謂的tmpfs,有人說跟ramdisk(虛擬磁盤),但不同。象虛擬磁盤同樣,tmpfs 可使用您的 RAM,但它也可使用您的交換分區來存儲。並且傳統的虛擬磁盤是個塊設備,並須要一個 mkfs 之類的命令才能真正地使用它,tmpfs 是一個文件系統,而不是塊設備;您只是安裝它,它就可使用了。
  tmpfs有如下優點:
  1,動態文件系統的大小。
  2,tmpfs 的另外一個主要的好處是它閃電般的速度。由於典型的 tmpfs 文件系統會徹底駐留在 RAM 中,讀寫幾乎能夠是瞬間的。
  3,tmpfs 數據在從新啓動以後不會保留,由於虛擬內存本質上就是易失的。因此有必要作一些腳本作諸如加載,綁定的操做。
  好了講了一些大道理,仍是講講應用吧:
  首先在/dev/stm建個tmp文件夾,而後與實際/tmp綁定
  mkdir /dev/shm/tmp
  chmod 1777 /dev/shm/tmp
  mount --bind /dev/shm/tmp /tmp(--bind )
  在使用mount --bind olderdir newerdir命令來掛載一個目錄到另外一個目錄後,newerdir的權限和全部者等全部信息會發生變化。掛載後的目錄繼承了被掛載目錄的全部屬性,除了名稱。
巧用tmpfs加速你的linux服務器,就是使用虛擬磁盤來存放squid的緩存文件和php的seesion。速度快很多哦! 
默 認系統就會加載/dev/shm ,它就是所謂的tmpfs,有人說跟ramdisk(虛擬磁盤),但不同。象虛擬磁盤同樣,tmpfs 可使用您的 RAM,但它也可使用您的交換分區來存儲。並且傳統的虛擬磁盤是個塊設備,並須要一個 mkfs 之類的命令才能真正地使用它,tmpfs 是一個文件系統,而不是塊設備;您只是安裝它,它就可使用了。 
tmpfs有如下優點: 
1。動態文件系統的大小, 
2。tmpfs 的另外一個主要的好處是它閃電般的速度。由於典型的 tmpfs 文件系統會徹底駐留在 RAM 中,讀寫幾乎能夠是瞬間的。 
3。tmpfs 數據在從新啓動以後不會保留,由於虛擬內存本質上就是易失的。因此有必要作一些腳本作諸如加載,綁定的操做。 
好了講了一些大道理,你們看的煩了吧,仍是講講個人應用吧:) 
首先在/dev/shm建個tmp文件夾,而後與實際/tmp綁定 
mkdir /dev/shm/tmp 
chmod 1777 /dev/shm/tmp 
mount --bind /dev/shm/tmp /tmp 
1. squid的緩存目錄設置 
vi /etc/squid/squid.conf 
修改爲 
cache_dir ufs /tmp 256 16 256 
這 裏的第一個256表示使用256M內存,我以爲http://www.linuxaid.com.cn/articles/4/4 /441672019.shtml裏使用ramdisk的方法還不如直接使用tmpfs,至少每次啓動不用mkfs,還能夠動態改變大小。這時的/tmp 實際就是/dev/shm/tmp 
而後重啓一下服務,ok,如今全部的squid緩存文件都保存倒tmpfs文件系統裏了,很快哦。 
2. 對php性能的優化 
對於一個訪問量大的以apache+php的網站,可能tmp下的臨時文件都會不少,好比seesion或者一些緩存文件,那麼你能夠把它保存到tmpfs文件。 
保存seesion的方法很簡單了只要修改php.ini就好了,因爲我已經把/dev/stm/tmp與/tmp綁定,因此不改寫也行,至於php程序產生的緩存文件那隻能改本身的php程序了:) 
至於tmpfs的其餘應用,我想你們可能經過這篇文章會有所啓發。linux

2、與swap的區別:
/dev/shm
首先能夠看出來/dev/shm是一個設備文件, 能夠把/dev/shm看做是系統內存的入口, 能夠把它看作是一塊物理存儲設備,
一個tmp filesystem, 你能夠經過這個設備向內存中讀寫文件, 以加快某些I/O高的操做,好比對一個大型文件頻繁的open, write, read,
聽說oracle就利用了/dev/shm(shitou沒用過oracle), 能夠經過mount命令列出當前的/dev/shm的掛載的文件系統,
你能夠直接對/dev/shm進行讀寫操做, 例如:
#touch /dev/shm/file1
既然是基於內存的文件系統,系統重啓後/dev/shm下的文件就不存在了
 
Linux默認(CentOS)/dev/shm分區的大小是系統物理內存的50%, 雖然說使用/dev/shm對文件操做的效率會高不少,
可是目前各發行軟件中卻不多有使用它的(除了前面提到的Oracle), 能夠經過ls /dev/shm查看下面是否有文件, 若是沒有就說明當前系統並無使用該設備.
 
swap
而swap是Linux的虛擬內存, 即在硬盤上開闢空間當內存不夠時充當內存使用, 所以能夠理解爲當/dev/shm空間不夠時能夠佔用swap的空間nginx

tmpfs(/dev/shm)的使用及應用場景web

 

tmpfs是基於內存的,速度是不用說的,硬盤和它無法比。Oracle 中的Automatic Memory Management特性就使用了/dev/shm。另外若是在網站運維中好好利用tmpfs,將有意想不到的收穫。咱們先在/dev/shm建一個tmp目前,並與/tmp綁定。sql

 

[root@AY1212111202285f63122 ~]# mkdir  /dev/shm/tmp

 

 

[root@AY1212111202285f63122 ~]# chmod  1777  /dev/shm/tmp         //注意權限數據庫

 

[root@AY1212111202285f63122 ~]# mount --bind  /dev/shm/tmp  /tmpapache

 

[root@AY1212111202285f63122 ~]# ls -ld /tmp

 

drwxrwxrwt 2 root root 40 May 29 21:46 /tmp

 

如下/tmp使用tmpfs文件系統的一些應用示例,通常tmpfs內存文件系統在作web緩存,臨時文件存儲時會對web訪問有很好的加速做用,從而提升網站訪問的速度。

 

 

 

1.將squid的緩存目錄cache_dir放到/tmp下

 

vi /etc/squid/squid.conf 修改爲 cache_dir ufs /tmp 256 16 256

這裏的第一個256表示使用256M內存,重啓一下squid服務,這樣緩存目錄都放在了tmpfs文件中了,速度不用說吧。

 

 

 

2.將php的session文件放在/tmp下

 

對於一個訪問量大的以apache php的網站,可能tmp下的臨時文件都會不少,好比seesion或者一些緩存文件,那麼你能夠把它保存到tmpfs文件。保存seesion的方法很簡單了:只要修改php.ini就好了,經過phpinfo測試文件查看你的php session存儲位置,若是不在/tmp下,修改php.ini文件,修改以下:

session.save_path = 「/tmp」

 

 

 

3.將服務的socket文件放在/tmp下

 

如nginx.socket和mysql.sock

 

至於tmpfs的其餘應用,我想你們可能經過這篇文章會有所啓發。再次強調下:tmpfs 數據在從新啓動以後不會保留,重啓tmpfs 數據會丟失,因此有必要作一些腳本作諸如加載,綁定的操做!

 http://www.tmtpost.com/43815.html

/dev/shm對Oracle 11g的影響:

      ORACLE 從11g版本開始,引入了一個自動內存管理(Automatic Memory Management)特性,該特性須要更多的共享內存(/dev/shm),所以若是決定應用該特性的話, 必需要確保共享內存大於ORACLE 中初始化參數MEMORY_MAX_TARGET 和MEMORY_TARGET(特別提示,這兩個參數即自動內存管理特性對應的初始化參數)的值。

      若是在初始化參數中設置了MEMORY_MAX_TARGET 和MEMORY_TARGET 兩參數爲非0值,而且不符合系統共享內存,則ORACLE 數據庫啓動時,就會觸發ORA-00845:MEMORY_TARGET not supported on this system 錯誤。

 

Oracle 11g的Linux版本在修改了MEMORY_TARGET或者SGA_TARGET後啓動可能會報錯:

 

SQL> shutdown immediate

Database closed.

SQL> startup

ORA-00845: MEMORY_TARGET not supported on this system

 

在數據庫的alert日誌中將有下面的報錯:

Starting ORACLE instance (normal)

WARNING: You are trying to use the MEMORY_TARGET feature. This feature requires the /dev/shm file system to be mounted for at least 10536091648 bytes. /dev/shm is either not mounted or is mounted with available space less than this size. Please fix this so that MEMORY_TARGET can work as expected. Current available is 8589852672 and used is 81920 bytes.

memory_target needs larger /dev/shm

問題很明顯:是由於/dev/shm的可用空間(非shm的總大小)小於了參數文件中設置的MEMORY_TARGET值。

 

解決辦法就是增大/dev/shm或是減少MEMORY_TARGET,下面是經過增長/dev/shm來解決:

修改前:

osedb01:~ # cat /etc/fstab | grep shm

shm                  /dev/shm             tmpfs      size=11g               0 0

 

osedb01:~ # df -h /dev/shm

Filesystem            Size  Used Avail Use% Mounted on

shm                    11G  6.5G   4.5G  59% /dev/shm

 

MEMORY_TARGET 設置爲10G,而/dev/shm可用空間的只有4.5G。

 

修改/dev/shm大小:

osedb01:~ # cat /etc/fstab | grep shm

shm                  /dev/shm             tmpfs      size=18g               0 0

修改完後,須要從新掛載/dev/shm生效:

osedb01:~ # mount -o remount /dev/shm

 

osedb01:~ # df -h /dev/shm

Filesystem            Size  Used Avail Use% Mounted on

shm                    18G  6.5G   12G  36% /dev/shm

 

再次重啓數據庫,正常!!

相關文章
相關標籤/搜索