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 >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”>>/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