天天看點

RH442-9 Memory Cache

 Memory Caches

一、 記憶體的使用政策

1.   減少記憶體的開銷

Slab cache

2.   減少系統服務時間的方法

l  檔案系統的中繼資料(Filesystem metadata):buffer cache(slab cache)

l  Disk IO:page cache

l  IPC(Interprocess communication):shared momory(共享記憶體)

l  Netwok IO:buffer cache、arp cache、connection track

3.   記憶體調優的注意事項

l  盡量回收頁面記憶體,以避免記憶體的壓力

l  記憶體調優對小的寫操作不會很明顯,記憶體調優主要是針對大量的寫

二、 記憶體調優

1.   Tuning page allocation

l  最小保留記憶體空間:<b> vm.min_free_kbytes</b>

<b></b>

[root@station9 ~]# sysctl -a|grep vm.min_free

<b>vm.min_free_kbytes</b> = 3831

#該記憶體空間将不會作為其他用途,減小特定程式的服務時間,會增加zone_normal的壓力。

#有些應用程式程序會要使用大量記憶體,需要調節最小保留的記憶體空間以便滿足此需求。

<b>2.  </b>Tuning overcommit(過量使用):<b></b>

l  過量使用:<b>vm.overcommit_memory</b>

[root@station9 ~]# sysctl -a|grep vm.overcommit_memory

<b>vm.overcommit_memory</b> = 0

#0=heuristic overcommit 關閉過量使用,有多少就配置設定多少。

#1=always overcommit   開啟過量的使用,要多少分多少,不建議用該選項,大量過量使用可能會導緻系統崩潰(記憶體溢出)。

#2=commit all swap plus a perentage of RAM (may be &gt;100) 先利用所有的swap,同時将适量百度比的記憶體配置設定給應用程式。

l  過度使用百分比:<b>vm.overcommit_ration</b>

[root@station9 ~]# sysctl -a|grep vm.overcommit_ratio

<b>vm.overcommit_ratio</b> = 50

#該參數表示用于過度使用的記憶體百分比,與vm.overcommit_memory配合使用

l  測試:

[root@station9 ~]# watch -n 1 grep -i committed_as /proc/meminfo

Every 1.0s: grep -i committed_as /proc/meminfo           Thu Aug 25 06:16:13 2011

Committed_AS:   192184 kB

#參看記憶體配置設定變化情況

[root@station9 ~]# vmemleak 1024 400

Process ID is: 2413

Grabbing some memory

#請求記憶體配置設定,每次1024KiB,請求400次,需安裝軟體包leaky-0.1-2.i386.rpm

3.   Slab cache

Slab cache用于存放核心中頻繁調用的小對象

l  檢視slab cache資訊

[root@station9 ~]# cat /proc/slabinfo

[root@station9 ~]# slabtop

[root@station9 ~]# vmstat –m

#slab隻能檢視,無法調slab存放的資訊

4.   Arp cache

Arp是Mac address映射IP address的條目表,存放在slab裡的小對象。

l  檢視arp cache

[root@station9 ~]#cat /proc/net/arp

[root@station9 ~]#ip neighbor list

l  清空arp cache

[root@station9 ~]#ip neighbor flush dev eth0

l  調整arp cache大小

[root@station9 ~]# sysctl -a|grep net.ipv4.neigh.default.gc_thresh

<b>net.ipv4.neigh.default.gc_thresh3</b> = 1024  

#硬限制,arp cache到1024條時,立即清空arp cache

<b>net.ipv4.neigh.default.gc_thresh2</b> = 512    

#軟限制,arp cache達到128條時,預設每30s清空一次arp cache,到達512條時,每5s清空一次arp緩存

<b>net.ipv4.neigh.default.gc_thresh1</b> = 128  

 #arp cache小于128條時不會清空arp cache

l  調整arp cache清空周期

[root@station9 ~]# sysctl -a|grep net.ipv4.neigh.default.gc_interval

<b>net.ipv4.neigh.default.gc_interval</b> = 30    

#調整arp cache清空周期,預設30s

5.   Page cache

l  作用

<b>對IO有大量請求,且大部分請求是一樣的,就會用到page cache</b>:

File reads:預設每個檔案讀都需要将資料從磁盤讀到記憶體,将這些資料放在page cache

<b>Page cahe</b><b>總是會檢查IO的請求</b>:

  目錄讀、讀寫正常檔案、讀寫磁盤塊裝置、通路記憶體映射檔案、通路swap輸出頁等。

<b>頁總會配置設定一些檔案資料給page cache</b>。

l  檢視page cache

<b>#cat /proc/meminfo |grep -i page</b>

[root@station9 ~]# cat /proc/meminfo |grep -i page

AnonPages:       67488 kB

PageTables:       2316 kB

HugePages_Total:    20

HugePages_Free:     20

HugePages_Rsvd:      0       

Hugepagesize:     2048 kB   #配置設定page cache 2M

l  調記憶體中保留作為page cache的記憶體大小

<b>vm.lowmem_reserve_ratio</b>

[root@station9 ~]# sysctl -a|grep lowmem

vm.lowmem_reserve_ratio = 256   256    32

#三個值分别代表                DMA  Normal  HighMem,在正常區域中将保留 256 頁(預設)。

<b>vm.vfs_cache_pressure </b>

[root@station9 ~]# sysctl -a|grep vfs

vm.vfs_cache_pressure = 100 

#核心回收用于page cache的傾向;預設值100表示核心将把pagecachee保持在一個合理的百分比;降低該值低于100,将導緻核心傾向于保留pagecache;增加該值超過100,将導緻核心傾向于回收.

l  調到達率和丢失率

<b>vm.page.cluster     </b> 

[root@station9 ~]# sysctl -a |grep vm.page.cluster

vm.page-cluster = 3           

#一次性性從swap往記憶體寫的頁數,2的3次方

<b>vm.zone_reclaim_mode</b>

[root@station9 ~]#echo “vm.zone_reclaim_mode = 1”&gt;&gt;/etc/sysctl.conf

#值0或1,當記憶體發生危機時是否盡量回收記憶體,0不回收,1回收,預設無此參數。僅支援X86_64。

6.   Anonymouns pages

這些頁屬于某個程序,但是沒有任何磁盤檔案和它們有關。如陣列的資料等,程序間通信(IPC)的記憶體。anonymous pages可轉換到swap裡。

l  檢視

<b>#grep -i anon /proc/meminfo </b><b>或</b><b></b>

<b>#cat /proc/PID/statm</b>

[root@station9 ~]# cat /proc/meminfo |grep -i anon

AnonPages:       67476 kB

三、 SysV IPC(Inter-Process Communication)

1.         IPC主要手段:信号量、共享記憶體、消息隊列。另外還有:管道、Socket等。非網絡IPC和網絡IPC(Socket API)都是需要的。

IPC按形式上分可分成4種不同的IPC形式:

1)  消息傳遞(管道、FIFO命名管道、消息隊列)

2)  同步(互斥量、條件變量、讀寫鎖、檔案和記錄鎖、信号量):

信号量,是一個特殊變量,隻能對它進行初始化操作、PV操作、删除操作。主要是PV操作(又稱wait、signal或者up、down)。

3)  共享記憶體(匿名的和具名的)

Ø  共享記憶體是程序間最快速的通信方式:

Ø  程序共享同一塊記憶體空間。

Ø  通路共享記憶體和通路私有記憶體一樣快。

Ø  不需要系統調用和核心入口。

Ø  不造成不必要的記憶體複制

4)  遠過程調用(Solaris門和SunRPC) 

2.         檢視IPC

<b>#ipcs</b>

[root@station9 ~]# ipcs

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status     

0x740003f9 1671168    root      600        4          0                      

0x740003ce 2392065    root      600        4          0                      

0x00000000 2785282    gdm       600        393216     2          dest        

0x74000435 819203     root      600        4          0                      

0x740003cd 2359300    root      600        4          0                      

------ Semaphore Arrays --------

key        semid      owner      perms      nsems    

------ Message Queues --------

key        msqid      owner      perms      used-bytes   messages   

[root@station9 ~]# df -h |grep shm  

tmpfs                 2.0G     0  2.0G   0% /dev/shm   #共享記憶體大小

[root@station9 ~]# dd if=/dev/zero of=/dev/shm/test bs=1M count=50

50+0 records in

50+0 records out

52428800 bytes (52 MB) copied, 0.0626032 seconds, 837 MB/s

#直接寫入資料到共享記憶體,/dev/shm中資料存放在共享記憶體中,而不是硬碟中,系統重新開機即丢失

3.   tuning sysV IPC

l  修改核心信号量

<b>kernel.sem</b>

[root@station9 ~]# sysctl -a|grep kernel.sem

<b>kernel.sem </b>= 250        32000   32      128

#第一列,表示每個信号集中的最大信号量數目。

第二列,表示系統範圍内的最大信号量總數目。

第三列,表示每個信号發生時的最大系統操作數目。

第四列,表示系統範圍内的最大信号集總數目。

是以,(第一列)*(第四列)=(第二列)

l  修改消息隊列的大小和數量

[root@station9 ~]# sysctl -a|grep kernel.msgm

<b>kernel.msgmnb</b> = 65536   #消息隊列的最大長度(bytes)

<b>kernel.msgmni</b> = 16      #消息隊列辨別的最大數目,即系統範圍内最大多少個消息隊列

<b>kernel.msgmax</b> = 65536   #從一個程序發送到另一個程序的消息的最大長度(bytes)。程序間的消息傳遞是在核心的記憶體中進行的,不會交換到磁盤上,是以如果增加該值,則将增加作業系統所使用的記憶體數量。

l  修改共享記憶體大小

[root@station9 ~]# sysctl -a|grep kernel.shm

<b>kernel.shmmni</b> = 4096           #用于整個系統的共享記憶體段的最大數目(個)

<b>kernel.shmall</b> = 268435456      #系統上可以使用的共享記憶體的總量(bytes)

<b>kernel.shmmax</b> = 4294967295     #核心所允許的最大共享記憶體段的大小(bytes);實際可用最大共享記憶體段大小=shmmax * 98%,其中大約2%用于共享記憶體結構

4.   記憶體的剩餘空間

[root@station9 ~]# free -ltm

             total       used       free     shared    buffers     cached

Mem:          4054       1040       3013          0        224        630

Low:           854        293        561

High:         3199        747       2452

-/+ buffers/cache:        186       3868

Swap:         8189          0       8189

Total:       12243       1040      11203

<b>已經使用記憶體空間=used -buffers-cached</b>

                  1040 -224-630       =186

<b>剩餘記憶體空間=free+buffers+cached</b>

              3013+224    +630    =3867

5、檢視記憶體的使用情況

l  system memory:

   <b>/proc/meminfo</b>

   <b>/proc/zoneinfo</b>

l  page tables:

   <b>/proc/vmstat</b>

l  summary

   <b>vmstat -s</b>

l  io devices

   <b>/proc/iomem</b>

本文轉自netsword 51CTO部落格,原文連結:http://blog.51cto.com/netsword/650143

繼續閱讀