首先,內存在被使用是被分為區域的
32位系統:zone_DMA
zone_NORMAL (正常內存區域 16M)
zone_RESRVED(用於高地址內存空間 896M)
zone_HIGHMEM(高地址內存空間 )
64位系統:
zone_DMA(16G)
zone_DMA32(4G)
zone_normal(大於4G)
內存大頁(yè) :
HugePage:大頁(yè)面,在rhel 6 x64位系統上不但支持大頁(yè)面而且支持使用透明大頁(yè)
THP:透明大頁(yè),簡(jiǎn)單來(lái)講就是對匿名內存的使用,不需要用戶(hù)的參與自動(dòng)在背後使用大頁(yè)面來(lái)管理匿名內存段
匿名內存頁(yè):RSS - 內存段 = 匿名頁(yè)
它支持兩種內存大?。?/span>
CentOS 6.4 x86_64 :
單個(gè)頁(yè)面大小可達到1G,在TB級的內存使用上通常有效
小於TB級的內存,2M比較常見(jiàn)的
varnish是實(shí)現可以支持在內存中提供緩存的,而varnish據說(shuō)跟透明大頁(yè)是不兼容的,而透明大頁(yè)通常情況下是系統在背後使用的,既然不兼容則需要將透明大頁(yè)的功能關(guān)閉
查看內存大頁(yè)相關(guān)信息
[root@node3 ~]# cat /proc/zoneinfo
Node 0, zone DMA #顯示出是否使用透明大頁(yè)
pages free 3936
min 83
low 103
high 124
scanned 0
spanned 4095
present 3837
nr_free_pages3936
nr_inactive_anon0
nr_active_anon0
nr_inactive_file 0
nr_active_file0
nr_unevictable0
nr_mlock 0
nr_anon_pages 0
nr_mapped 0
nr_file_pages 0
nr_dirty 0
nr_writeback 0
nr_slab_reclaimable 0
nr_slab_unreclaimable 0
nr_page_table_pages 0
nr_kernel_stack0
nr_unstable 0
nr_bounce 0
nr_vmscan_write0
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 0
nr_shmem 0
numa_hit 1
numa_miss 0
numa_foreign 0
numa_interleave0
numa_local 1
numa_other 0
nr_anon_transparent_hugepages 0 #匿名的透明矩形頁(yè)有0個(gè),0說(shuō)明沒(méi)有使用
protection:(0, 2004, 2004, 2004)
pagesets
cpu: 0
count: 0
high: 0
batch: 1
vm statsthreshold: 6
cpu: 1
count: 0
high: 0
batch: 1
vm statsthreshold: 6
cpu: 2
count: 0
high: 0
batch: 1
vm statsthreshold: 6
cpu: 3
count: 0
high: 0
batch: 1
vm statsthreshold: 6
all_unreclaimable: 0
prev_priority: 12
start_pfn: 1
inactive_ratio: 1
#以下是32位系統相關(guān)信息
Node 0, zone DMA32
pages free 219541
min 11180
low 13975
high 16770
scanned 0
spanned 520189
present 513077
nr_free_pages219541
nr_inactive_anon 2190
nr_active_anon77259
nr_inactive_file 64767
nr_active_file70570
nr_unevictable0
nr_mlock 0
nr_anon_pages27601
nr_mapped 6761
nr_file_pages137536
nr_dirty 5
nr_writeback 0
nr_slab_reclaimable 24374
nr_slab_unreclaimable 7081
nr_page_table_pages 3912
nr_kernel_stack172
nr_unstable 0
nr_bounce 0
nr_vmscan_write0
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 0
nr_shmem 2200
numa_hit 40788326
numa_miss 0
numa_foreign 0
numa_interleave15094
numa_local 40788326
numa_other 0
nr_anon_transparent_hugepages 97 #自動(dòng)啟動(dòng)透明大頁(yè),而一個(gè)頁(yè)面的小小為2MB
protection:(0, 0, 0, 0)
pagesets
cpu: 0
count: 127
high: 186
batch: 31
vm statsthreshold: 30
cpu: 1
count: 87
high: 186
batch: 31
vm statsthreshold: 30
cpu: 2
count: 50
high: 186
batch: 31
vm stats threshold:30
cpu: 3
count: 148
high: 186
batch: 31
vm statsthreshold: 30
all_unreclaimable: 0
prev_priority: 12
start_pfn: 4096
inactive_ratio: 3
一個(gè)頁(yè)面大小為2M,以上沒(méi)有顯示頁(yè)面大小,所以我們要來(lái)查看另外一個(gè)文件
[root@node3 ~]# cat /proc/meminfo
MemTotal: 1922112 kB
MemFree: 893856 kB
Buffers: 77136 kB
Cached: 473116 kB
SwapCached: 0 kB
Active: 591384 kB
Inactive: 267860 kB
Active(anon): 309040 kB
Inactive(anon): 8760 kB
Active(file): 282344 kB
Inactive(file): 259100 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097144 kB
SwapFree: 2097144 kB
Dirty: 104 kB
Writeback: 0 kB
AnonPages: 308996 kB
Mapped: 27052 kB
Shmem: 8800 kB
Slab: 125692 kB
SReclaimable: 97508 kB
SUnreclaim: 28184 kB
KernelStack: 1376 kB
PageTables: 15616 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3058200 kB
Committed_AS: 1085080 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 12468 kB
VmallocChunk: 34359720976 kB
HardwareCorrupted: 0 kB
AnonHugePages: 198656 kB #匿名的透明大頁(yè)
HugePages_Total: 0 #矩形頁(yè)面的總數
HugePages_Free: 0 #矩形頁(yè)面的空閑總數
HugePages_Rsvd: 0 #預留數
HugePages_Surp: 0
Hugepagesize: 2048 kB #Hugepagesize為 2M ,與nr_anon_transparent_hugepages對應
DirectMap4k: 8180 kB
DirectMap2M: 2088960 kB
AnonHugePages 除以 Hugepagesize結果為 nr_anon_transparent_hugepages 的數量,如下所示
[root@node3 ~]# echo '198656/2048 ' | bc
97
查看當前主機內存空間的使用情況
使用free -m 查看內存使用情況
free命令是最常用的,所以一般我們喜歡使用free -m 以兆為單位的顯示內存使用狀況
[root@node3 ~]# free -m
total used free shared buffers cached
Mem: 1877 1032 844 0 75 462
-/+ buffers/cache: 495 1381
Swap: 2047 0 2047
total : 物理內存總空間
Used : 已用的物理內存
free : 剩餘的物理內存
shared: 共享內存
buffers/cache: 緩存緩存
Mem : 虛擬內存
這裏顯示844的空閑內存其實(shí)並非如此,因此空閑空間加上可以清理的buffer/cache一共是1405,這才是真正的空閑內存
buffer/cache的作用:訪(fǎng)問(wèn)IO設備,尤其硬盤(pán)上的文件,是非常慢的,為了加速訪(fǎng)問(wèn)使其緩存至內存中,如果後期用戶(hù)對其訪(fǎng)問(wèn)則直接在內存中訪(fǎng)問(wèn)而不直接再到IO設備上檢索
因此Linux在使用buffer/cache是毫不吝嗇的,只要內存有空間則直接用來(lái)緩存
關(guān)於 "-/+ buffers/cache"
[root@node3 ~]# free -m
total used free shared buffers cached
Mem: 1877 1043 683 0 178 462
-/+ buffers/cache: 471 1405
Swap: 2047 0 2047
很顯然,如果已用了1877 的內存,但是大部分都被buffer和cache使用了,所以壓根用的沒(méi)有這麼多,如果將buffer/cache減掉的話(huà)那麼實(shí)際用了471的內存
清理buffer/cache
如果一定要清理buffer/cache的話(huà),只需要將/proc/sys/vm/drop_caches 更改其數值即可
可以使用man proc來(lái)獲取幫助進(jìn)而查看其每個(gè)文件的意義
[root@node3 ~]# man proc
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches, dentriesand inodes from memory, causing that
memory to become free.
Tofree 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, useecho 3 > /proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty objects are notfreeable, the user should run
sync(8) first.
以上可以得出大概信息,如果想釋放pagecache,那麼則執行 echo 1 > /proc/sys/vm/drop_caches
只不過(guò)buffer/cache緩存的時(shí)候被分為了兩大類(lèi):
1.cache:專(zhuān)門(mén)用來(lái)緩存page cache 頁(yè)緩存,這種緩存通常緩存的是文件數據,比如打開(kāi)的文件內容
2.buffers:所緩存的是文件的元數據(inode+denty),或者通常用來(lái)緩存用戶(hù)的寫(xiě)請求同步到硬盤(pán)上去的時(shí)候,先在內存中緩存一段時(shí)間再同步至硬盤(pán)
下面我們來(lái)清理buffer/cache,並觀(guān)測free、buffer和cache這兩個(gè)值的變化
先來(lái)查看我們當前內存資源使用情況
[root@node3 ~]# free -m
total used free shared buffers cached
Mem: 1877 1004 872 0 75 462
-/+ buffers/cache: 467 1409
Swap: 2047 0 2047
清理buffer/cache
[root@node3 ~]# echo 1 > /proc/sys/vm/drop_caches
[root@node3 ~]# free -m
total used free shared buffers cached
Mem: 1877 483 1393 0 0 26
-/+ buffers/cache: 456 1420
Swap: 2047 0 2047
所以echo 1 未必是只針對於buffer的,而cached這個(gè)值卻還有數據,說(shuō)明我們修改參數的時(shí)候,它的元數據在裏面也存在
這時(shí)候如果我們大量去訪(fǎng)問(wèn)文件會(huì )發(fā)現buffers/cache又會(huì )增加,因為對linux而言是利用內核緩沖進(jìn)行加速的
交換內存的優(yōu)化
簡(jiǎn)單來(lái)講,最好不要用交換內存,但是linux系統的傾向性是非常高的,在服務(wù)器上它的默認值是相當不理想的,很多默認值只是適合於交互式桌面型的
涉及參數文件:/proc/sys/vm/swappiness
於是我們man一下proc 找一下swappiness相關(guān)說(shuō)明
/proc/sys/vm/swappiness
Thevalue in this file controls how aggressively the kernel will swap memory pages. Higher values
increase agressiveness, lower values descrease aggressiveness. The default value is 60.
我們內核有多大傾向性使用交換內存的,這個(gè)值越大,那麼越傾向使用交換內存;
值越小越不傾向使用,而默認值是60,它的取值範圍通常是0-100的;
[root@node3 ~]# cat /proc/sys/vm/swappiness
60
建議設置參數為0,因為0代表交換內存能不用則不用,而這正是恰恰是我們所需要的
在服務(wù)器上,尤其是物理內存緩存服務(wù)器上,比如varnish,一定強烈建議將此值改為0
一般而言當我們目前已經(jīng)映射進(jìn)頁(yè)表中的內存百分比,也就是說(shuō)物理內存的百分比已經(jīng)被多少頁(yè)表所使用了,各個(gè)進(jìn)程頁(yè)表映射目錄裏會(huì )映射出來(lái)每個(gè)線(xiàn)性地址到物理地址的空間,所以多個(gè)進(jìn)程都啟動(dòng)了而且都啟動(dòng)映射了,那所以物理內存中的進(jìn)程當中的已經(jīng)被直接映射進(jìn)進(jìn)程頁(yè)表中的空間大小的百分比 + swappiness的值 大於或等於100 的時(shí)候則啟動(dòng)交換內存,也就是說(shuō)當我們的進(jìn)程啟動(dòng)起來(lái)之後,會(huì )有大量的數據實(shí)現了頁(yè)表映射,除了有些不能移除的之外,那這些映射頁(yè)表中已經(jīng)使用的映射內存空間超出了物理內存的值從而加上swapiness的值,這裏swappiness是百分比) 只要大於等於100則開(kāi)始啟用交換存在
默認是60,如果這裏是40%則啟動(dòng)交換內存,所以說(shuō)不理想,如果將其調整為0,那麼就表示是100%,當然是不可能到達100%,如果到達100%表示內存耗盡,如果內存耗盡對系統來(lái)將會(huì )達到另外一種狀態(tài)--內存溢出(內存耗盡)
內存溢出/內存耗盡
在linux內核一定要有預警性的,在內存耗盡之前會(huì )將相當消耗內存的進(jìn)程kill掉,一般而言linux內核會(huì )觀(guān)測每個(gè)系統進(jìn)程,為每個(gè)進(jìn)程做標記,如發(fā)現相當占用內存的進(jìn)程會(huì )將其結束,如果我們服務(wù)上運行類(lèi)似於varnish的內存緩存服務(wù)的話(huà),那麼毫無(wú)疑問(wèn)將結束的則是這個(gè)進(jìn)程
所以我們要手動(dòng)調整其對應的級別的,不讓其內核對服務(wù)進(jìn)行幹擾
涉及參數文件:/proc/sysrq-trigger
調整內存相關(guān)屬性:
echo f > /proc/sysrq-trigger
f表示 手動(dòng)調整oom-kill 會(huì )手動(dòng)啟動(dòng)oom-kill 會(huì )kill掉占內存級別最高的進(jìn)程,當讓一旦資源耗盡其也會(huì )自動(dòng)啟動(dòng)kill的
手動(dòng)指定服務(wù)級別:
echo n > /proc/pid/comm_adj
用2的N次方來(lái)估值
禁止oom-kill
修改內核參數 :vm.panic_on_oom = 1
意味著(zhù)當系統資源耗盡的時(shí)候使系統資源崩潰
關(guān)注的文件:
/proc/進(jìn)程的pid /oom_score
需要修改的文件
#調整指數,如果不期望使某個(gè)進(jìn)程級別過(guò)高,盡可能降低此值,就不會(huì )被kill
/proc/進(jìn)程的pid/comm_adj
手動(dòng)啟動(dòng)oom-kill
echo f > /proc/sysrq-trigger
禁用oom-kill
vm.panic_on_oom = 1
只要有交換內存可用,在交換內存中仍然有些交換內存可用,而且物理內存都是活動(dòng)頁(yè)的時(shí)候就不會(huì )發(fā)生oom 所以有些時(shí)候交換內存還是有用的,只要物理內存沒(méi)有達到所有頁(yè)面都為活動(dòng)狀態(tài),那麼交換內存在這種場(chǎng)景下還是可以起到一定額外緊急狀態(tài)時(shí)的功能,所以交換內存也是必要的
交換內存如何設定 本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
以下是IBM給出的建議,應在服務(wù)器上設置多大的交換內存設定,望各位參考:
在執行批處理服務(wù)器計算的服務(wù)器上,尤其做科學(xué)計算的服務(wù)器上,要使用 4 x RAM 都不算過(guò)分,當然RAM也就達到64G以上,那麼確實(shí)有些過(guò)分了,因需而調,一般來(lái)講小於4G;
如果是數據庫服務(wù)器,不管物理內存多大,那麼交換內存要小於1G
以mysql為例,在系統上運行的時(shí)候,mysql為了提高性能大多數數據都使用在內存當中,因為mysql需要大量的數據查詢(xún)排序,尤其在查詢(xún)排序的時(shí)候需要大量?jì)却娌僮鞯?,如果放在交換內存中的話(huà)其性能一定嚴重下降的,或者下降到不可接受的地步; 本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
所以,數據庫服務(wù)器盡可能做到以下兩點(diǎn):
1.盡可能不用交換內存
2.讓交換內存的空間足夠小
應用服務(wù)器,比如apache、tomcat之類(lèi)的服務(wù)器0.5 X RAM,物理內存的一半即可,如果物理內存一共有64g 那麼它的交換內存也不小,所以當內存大於4G的時(shí)候 我們需要規劃一個(gè)指導線(xiàn),如果物理內存大於4G的話(huà)還是依然被耗盡,那麼依然需要加物理內存,因為交換內存是沒(méi)有意義的,在這種情況下物理內存大於4G或者16G的話(huà),一般交換內存分配4G左右即可;
不得不使用交換內存的建議
如果不得不使用交換內存,將交換內存放在越靠外的磁道上效果越好,那意味著(zhù)將其放在最靠外的分區上
如果我們有多塊硬盤(pán)而且沒(méi)有做RAID的話(huà),那麼可以將每個(gè)硬盤(pán)最外面的分取都用於實(shí)現交換內存,假如有4塊硬盤(pán),那麼將每個(gè)硬盤(pán)的最外道拿出1G來(lái)做交換內存
linux內核在使用硬盤(pán)的交換分區的時(shí)候有一特性:可以將交換分區定義優(yōu)先級,我們可以讓這4個(gè)的優(yōu)先級一樣,意味著(zhù)內核以負載均衡的方式均分對交換內存的使用(負載均衡)這樣就可以大大提高交換內存的使用
/dev/sda1 swap swap pri=5 0 0
/dev/sdb1 swap swap pri=5 0 0
/dev/sdc1 swap swap pri=5 0 0
/swaps/swapfile1 swap pri=1 0 0 #當以上的空間全用光了再向此文件中存放數據
當然,以上是在沒(méi)有做RAID的情景下,如果有RAID0 或RAID5的話(huà)則更好
手動(dòng)配置大頁(yè)面(Hugetable Page)
[root@node3 ~]# sysctl -a | grep hugepage
vm.nr_hugepages = 0 #使用多少自定義即可
vm.nr_hugepages_mempolicy = 0
vm.hugepages_treat_as_movable = 0
vm.nr_overcommit_hugepages = 0
我們可以手動(dòng)定義將其當做共享空間來(lái)掛載,直接掛載到某個(gè)目錄,而後創(chuàng )建文件快速刪除很有用,有時(shí)候我們寫(xiě)腳本的時(shí)候可能會(huì )生成很多臨時(shí)文件,如果我們將臨時(shí)文件都放在這樣的內存中,效果會(huì )更好
所以這時(shí)我們可以定義幾個(gè)透明大頁(yè),將這些透明大頁(yè)定義成共享內存空間並掛載
hugetable page主要是提高TLB性能,這樣頁(yè)表項就會(huì )變小,所以能提高TLB的性能
配置hugetable page
x86info ?a | grep 'Data TLB'
dmesg
cat /proc/meminfo
更改大頁(yè)
vim /etc/sysctl.conf
將值自定義更改:
vm.nr_hugepages = n
#hugepages = n
掛載
mkdir /hugepages
mount ?t hugetlbfs none hugepages
通過(guò)掛砸可以將其當做內存磁盤(pán)來(lái)使用了,當然平時(shí)的時(shí)候不需要自己指定,如果不是自己想寫(xiě)腳本並創(chuàng )建臨時(shí)文件的話(huà)是不需要掛載它的,只要啟動(dòng)透明大頁(yè),而後在mysql服務(wù)器上將服務(wù)器變量當做定義使用透明大頁(yè),它會(huì )自動(dòng)使用
所以tlbfs只有在必要的時(shí)候,或想自己手動(dòng)指定在某個(gè)位置使用內存磁盤(pán)的時(shí)候才有必要去定義的
定義透明大頁(yè)的個(gè)數:
[root@node3 ~]# cd /proc/sys/vm/
[root@node3 vm]# cat nr_hugepages
0
將其值改為理想的數值即可,或者在grub中為內核啟動(dòng)的時(shí)候定義內核參數
觀(guān)察內存的使用情況
比如觀(guān)察內存有多少被交換出去或有多少被交換進(jìn)來(lái),page頁(yè)面有多少被分配出去或有多少寫(xiě)入到磁盤(pán)中等
涉及命令:
vmstat -n 1 2
sar -r 1 2
1表示采樣時(shí)間間隔
2表示采樣時(shí)間次數
使用vmstat -n觀(guān)察內存活動(dòng)信息
[root@node3 ~]#vmstat -n 1 2
procs -----------memory---------- ---swap-- -----io------system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1216352 10392 225308 0 0 0 1 3 5 0 0100 0 0
0 0 0 1216344 10392 225264 0 0 0 0 170 308 0 0100 0 0
參數解釋?zhuān)?/span>
swap : 虛擬內存的使用情況,當然我們這裏沒(méi)用
si: 從磁盤(pán)中讀進(jìn)來(lái)的swap數據量
so: 寫(xiě)到swap中的數據量
free:空閑內存量
buffer:用於buffer空間
cache:如上
另外還有兩個(gè)沒(méi)有顯示需要使用-a參數查看
inact: 非活動(dòng)內存 意為已有一段時(shí)間沒(méi)有被程序所使用了
但是inact非活動(dòng)該內存有兩類(lèi):
幹凈頁(yè): 指的是沒(méi)有被修改的,可以將其回收,直接清理即可
臟頁(yè) : 指的是必須將其同步到磁盤(pán)上才可以回收資源
active :活動(dòng)內存 意為正在被程序所使用的
如果我們發(fā)現大量的si so 意味著(zhù)交換內存以及被使用了,而且有大量的換進(jìn)換出,意味著(zhù)物理內存不夠用,那麼提高性能的方法無(wú)非就是加大物理內存;
但是需要注意的是當觀(guān)測一個(gè)值的時(shí)候,有可能會(huì )有一些比較獨特的情況,比如CPU使用率100%並不意味著(zhù)CPU慢,因為CPU可能花費很長(cháng)時(shí)間去等待IO完成,也就是說(shuō)去進(jìn)行swap in/out 所以很多時(shí)候看上去CPU利用率高,但是最後發(fā)現是I/O的問(wèn)題,完全是有可能的
如果出現這種I/O,由於是swap產(chǎn)生的io,意味著(zhù)內存不夠用,所以要做綜合評判
使用sar -r 進(jìn)行觀(guān)測
[root@node3 ~]# sar -r 1
Linux 2.6.32-431.20.3.el6.x86_64 (node3.test.com) 09/14/2014 _x86_64_(4 CPU)
04:06:29 PM kbmemfreekbmemused %memused kbbuffers kbcached kbcommit %commit
04:06:30 PM 1216344 705768 36.72 10408 225348 1091764 27.16
04:06:31 PM 1216336 705776 36.72 10408 225348 1091764 27.16
04:06:32 PM 1216336 705776 36.72 10408 225348 1091764 27.16
04:06:33 PM 1216336 705776 36.72 10408 225348 1091764 27.16
04:06:34 PM 1216336 705776 36.72 10408 225348 1091764 27.16
04:06:35 PM 1216336 705776 36.72 10408 225348 1091764 27.16
04:06:36 PM 1216336 705776 36.72 10408 225348 1091764 27.16
需要關(guān)注前四個(gè)參數的值的變化
參數解釋?zhuān)?/span>
kbmemfree: 以kb為單位顯示內存的空閑空間
kbmemused: 以kb為單位顯示內褲空間的使用
memused : 內存使用百分比
kbbuffers: 略
kbcached : 略
kbcommit :內存的提交
需要關(guān)注的是前四個(gè)值,如果數據量變化非常頻繁的話(huà),則表明內存被頻繁的使用/釋放;
如果釋放回收的比例過(guò)高,而free空間過(guò)小 use的空間過(guò)大,而且變化過(guò)於頻繁的時(shí)候,那麼很可能是內存活動(dòng)劇烈導致的,有可能是像varnish之類(lèi)的服務(wù)由於頻繁的內存釋放回收等實(shí)現緩存對象創(chuàng )建和清除的活動(dòng)帶來(lái)的,只要對比沒(méi)有到100% 就可以任由他去 ,但是注意實(shí)時(shí)監控
使用sar -R 觀(guān)測內存其活動(dòng)速率 本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
[root@node3 ~]# sar -R 1
Linux 2.6.32-431.20.3.el6.x86_64 (node3.test.com) 09/14/2014 _x86_64_(4 CPU)
04:08:42 PM frmpg/s bufpg/s campg/s
04:08:43 PM -33.00 0.00 0.00
04:08:44 PM 0.00 0.00 0.00
04:08:45 PM 0.00 0.00 0.00
04:08:46 PM 0.00 0.00 0.00
frmpg/s : 每秒釋放了多少個(gè)內存頁(yè),如果我們想要知道多大內存需要將這個(gè)數值乘以4
bufpg/s : 每秒被用於哪來(lái)實(shí)現buffer的頁(yè)面個(gè)數
campg/s : 如上,每秒被用於哪來(lái)實(shí)現cache的頁(yè)面個(gè)數
bufpg+campg-frmpg = 真正釋放的個(gè)數
如果一直是負值,那麼內存空間肯定是一直有限的,總有一定時(shí)間總會(huì )被耗盡,所以一直為負值就意味著(zhù)可能會(huì )內存泄露了
這個(gè)觀(guān)測值還可以長(cháng)時(shí)間評判出內存是否有泄露情況發(fā)生,釋放和分配的值大致可以相同
使用sar -W查看交換內存使用情況
[root@node3 ~]# sar -W
Linux 2.6.32-431.20.3.el6.x86_64 (node3.test.com) 09/13/2014 _x86_64_ (4 CPU)
12:00:01 AM pswpin/s pswpout/s
12:10:01 AM 0.00 0.00
12:20:01 AM 0.00 0.00
12:30:01 AM 0.00 0.00
由於沒(méi)跑任何服務(wù)所以這裏為0,如果有頻繁的pswpin 和pswpout 就意味著(zhù)我們的物理內存太小了
交換內存用了沒(méi)有關(guān)系,但是變化量很小但是使用空間很大也沒(méi)有問(wèn)題
如果變化值很高,通常會(huì )有問(wèn)題需要我們關(guān)注了
使用sar -B查看I/O使用情況
[root@node3 ~]# sar -B
Linux 2.6.32-431.20.3.el6.x86_64 (node3.test.com) 09/14/2014 _x86_64_(4 CPU)
12:00:01 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
12:10:01 AM 0.00 1.45 11.83 0.00 4.00 0.00 0.00 0.00 0.00
12:20:01 AM 0.00 0.82 147.74 0.00 176.60 0.00 0.00 0.00 0.00
12:30:01 AM 0.00 2.18 4.40 0.00 1.66 0.00 0.00 0.00 0.00
12:40:01 AM 0.00 1.30 3.31 0.00 1.53 0.00 0.00 0.00 0.00
12:50:01 AM 0.00 0.77 146.06 0.00 174.63 0.00 0.00 0.00 0.00
01:00:01 AM 0.01 2.14 5.73 0.00 1.80 0.00 0.00 0.00 0.00
pgpgin : 每秒頁(yè)面載入個(gè)數
pgpgout: 頁(yè)面寫(xiě)出個(gè)數,以頁(yè)為單位直接與內核內存交互的,而內核內存最終是與I/O交互
#一通不同到磁盤(pán)中通常都是臟頁(yè),需要pgpgin一般需要用到buffer/cache
fault : 每秒出現的異常個(gè)數
majflt : 大異常的個(gè)數
#以下參數不需要被關(guān)心
pgfree :每秒鐘有多少個(gè)頁(yè)被放到空閑列表中去,說(shuō)明被回收回來(lái)的頁(yè)面個(gè)數
pgscank:每秒被kswap所掃描的頁(yè)面個(gè)數
pgscand:直接被內核掃描的頁(yè)面個(gè)數
以上是跟真正I/O相關(guān)的參數(跟硬盤(pán)交互的時(shí)候數據載入內核內存並載入到進(jìn)程內存中,或從臟頁(yè)中寫(xiě)入到磁盤(pán)中的數據)
題外:使用dstat觀(guān)察內存狀況
dstat是非常好用的工具,能客觀(guān)明了的顯示出內存當前使用情況,個(gè)人比較喜歡用,這裏略過(guò)
[root@node3 ~]# dstat -g -m -s
---paging-- ------memory-usage----- ----swap---
in out | used buff cach free| used free
0 0 | 496M 10.4M 220M 1151M| 0 2048M
0 0 | 496M 10.4M 220M 1151M| 0 2048M
0 0 | 496M 10.4M 220M 1151M| 0 2048M
0 0 | 496M 10.4M 220M 1151M| 0 2048M
0 0 | 496M 10.4M 220M 1151M| 0 2048M
本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
調整內核參數
容量調節
比如我們內存空間一共只有1G的容量,而是否能讓內存使用大於1G,大於物理內存則意味著(zhù)要使用交換內存進(jìn)行存儲數據,也就意味著(zhù)只要允許過(guò)量那就必然會(huì )使用交換內存
如果確確實(shí)實(shí)不能加物理內存不得不使用交換內存的時(shí)候,尤其是在批量處理的環(huán)境上,比如hadoop,其不提供實(shí)時(shí)處理的,所以批量提交處理作業(yè),和提交作業(yè)的輸出中間可能有一段時(shí)間間隔,這種情況下是允許可以過(guò)量使用內存的
涉及參數文件:
/proc/sys/vm/overcommit_memory
/proc/sys/vm/overcommit_ratio
/proc/sys/vm/max_map_count
本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
overcommit_memory
[root@node3 ~]# cat /proc/sys/vm/overcommit_memory
0
相關(guān)參數:
0 :默認設置,是否允許過(guò)量,由內核決定是否可以過(guò)量而且允許過(guò)量多少
1 :允許使用交換內存,但是不明確使用大小,有可能會(huì )導致崩潰的
2 :允許使用交換內存,但是過(guò)量多少是需要手動(dòng)定義的
本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
如果設定為2,那麼可用總的內存大小是:所有的交換內存空間 + 物理內存空間的一部分
使用多少物理內存是由overcommit_ratio進(jìn)行定義的內存比例,用這個(gè)比例乘以物理內存的大小再加上交換內存的大小就是所有可用的內存空間
overcommit_ratio
假如這個(gè)ratio 為0.5的話(huà),swap為4G 那麼最大可用內存空間為6G
如果overcommit_ratio的值為0的話(huà),那就意味著(zhù)所有可用大小是交換內存的全部+物理內存x0% 最終還是4G 本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
很顯然,如果交換內存是4G 物理內存也是4G 又通過(guò)這種方式定義最多只能使用4G,那就意味著(zhù)交換內存可能會(huì )用到 本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
如果將swapiness的參數設置為0,那麼意味著(zhù)盡量不使用交換內存,而我們這裏又明確說(shuō)明內存總共可用空間只有4G,因為我們設置overcommit_ratio為0 而overcommit_memory的值為2,那毫無(wú)疑問(wèn)肯定總共大小為4G,那就意味著(zhù)我們交換內存可能會(huì )派不上用場(chǎng),這就起到類(lèi)似禁用交換內存的效果
本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥! 本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
有些場(chǎng)景下,如果我們期望盡可能不使用交換內存可用使用這種方式
swapiness = 0
overcommit_memory = 2
overcommit_ratio = 0
這是一個(gè)非常常見(jiàn)的內存內核優(yōu)化機制
本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
進(jìn)程間通信內存性能調節
涉及參數配置文件路徑:/proc/sys/kernel/
msgmax
進(jìn)程間通信如果基於消息間通信的話(huà)有可能一個(gè)進(jìn)程與N個(gè)進(jìn)程交互
如果各worker發(fā)現其處理速度很快的話(huà),而master處理速度很慢,那同樣的速率下一個(gè)進(jìn)程只能處理有限的幾個(gè),那麼則有很多會(huì )處於等待狀態(tài)(將其放在隊列中)
所以其參數的意思為:以字節為單位,用來(lái)定義單個(gè)消息大小的,默認值為65536
msgmnb
以字節為單位,指定消息隊列的大小,單個(gè)消息上限
msgmni
是否允許多少隊列個(gè)數
假如一個(gè)隊列為10k,那我們有10個(gè)隊列,10個(gè)隊列加一起則為100k也就是說(shuō)一共允許使用多少個(gè)消息隊列,而每個(gè)隊列有多大,而每個(gè)隊列中的消息有多大,都是通過(guò)以上三個(gè)參數進(jìn)行定義的
如果某個(gè)進(jìn)程通信量的確很大,而且單個(gè)消息量也大,那我們可以將單個(gè)隊列長(cháng)度進(jìn)行調整,將單個(gè)消息的上限調整;如果消息量也很大,則可以增加隊列數
前提是進(jìn)程間通信是根據消息通信的,如果不是則進(jìn)入第二種方法:
本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
以共享內存作為通信方式
涉及參數配置文件路徑:/proc/sys/kernel/
shmmni
可用於共享內存的最大內存大小,指的是片段,因為共享內存不一定是連續的,所以指的是用於共享內存的內存段的個(gè)數,默認值為4096
有些服務(wù),比如oracle,oracle內部有許多子進(jìn)程這些進(jìn)程各自負責不同的任務(wù),而彼此之間通信都是基於共享內存所實(shí)現的,所以通常需要調整其值
shmmax
可允許最大共享內存片段(單個(gè)內存片段大小上限),64位系統默認值為68719476736,在紅帽6.x 64位系統則不用調整了
shmall
單次在系統中可以使用的共享內存量,某一次申請共享內存,最多可申請多少個(gè)
比如:一個(gè)片最大10k,一共4096片,我們規定一次只能使用20k,那麼意味著(zhù)我們最多可以使用2片;那麼如果我們定義單片最大上限為20k,那麼意味著(zhù)一次只能申請一片。
在紅帽6.4,如果內存夠多通常是不用調整的
threads-max 本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
最大線(xiàn)程,規定內核使用的最大線(xiàn)程數
threads-max最小為20
計算最大值:
max_threads = mempages / (8 * /THREAD_SIZE / PAGE_SIZE )
如果多個(gè)進(jìn)程大小值通常很難平均的時(shí)候,這個(gè)值可能會(huì )用的到
與容量相關(guān)的文件系統可調整參數
主要關(guān)心的參數:
file-max
設置最大的文件描述符
echo '* - nofile 65535 ' >>/etc/security/limits.conf
#nofile 表示所能打開(kāi)的最大的文件數
min_free_kbytes
最小空閑的內存空間,我們的物理空間不能全部分配出去,必須要預留一部分供內核所使用、分配,設置這個(gè)數值務(wù)必要小心,因為過(guò)高或過(guò)低都有風(fēng)險的,多數情況下如果不清楚可以不調
dirty_ratio
當物理內存中臟頁(yè)比例超出一定比值的時(shí)候一定會(huì )使用pdflush定期刷寫(xiě)到硬盤(pán)上去,但是如果變化量非???,如果不到一秒鐘就會(huì )有很多,那麼用定時(shí)刷寫(xiě)則效率會(huì )比較低
通常將臟頁(yè)刷寫(xiě)到硬盤(pán)通常有兩個(gè)策略
按照時(shí)間,固定周期 本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
按照刷寫(xiě)的內容,達到一定比例,到達一定比值的時(shí)候
時(shí)間間隔越小就意味著(zhù)刷鞋頻率越高,頻率越高就意味著(zhù)數據在內存中可能丟失的越小,但是IO活動(dòng)量就越大,所以很多時(shí)候取得一個(gè)理想值是很關(guān)鍵的
比如:如果有時(shí)候3秒鐘的數據丟失,就意味著(zhù)數據量可以在內存中存儲3秒以上,意味著(zhù)3秒刷寫(xiě)一次,那麼IO量會(huì )降低,IO是性能的瓶頸所在
dirty_ratio默認值為20,當臟頁(yè)比例所占據的總內存空間所達到了總內存空間的百分之二十之後則自動(dòng)刷寫(xiě)到硬盤(pán)中
如果認為這個(gè)值比較低,可以將其調高,可以降低刷寫(xiě)次數,提高性能表現,但是可能會(huì )丟失數據,具體調整多少值需要自己去衡量
在對於數據要求非常高的場(chǎng)景中,比如數據庫,這個(gè)值不可以調高;但是對於varnish這種內存緩存服務(wù)器來(lái)講,緩存的數據丟失也沒(méi)有關(guān)系,這樣的話(huà)可以調高,但是緩存是不能夠寫(xiě)數據的,或者說(shuō)在內存中存儲緩存是不可能刷寫(xiě)的硬盤(pán)上去的,但是有的時(shí)候需要的,比如用磁盤(pán)進(jìn)行緩存數據,這時(shí)候可以極大的調整此值;
dirty_background_ratio
與上面不同,此值定義全局百分比 本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
dirty_background_ratio和dirty_ratio的區別:
dirty_ratio是由當某個(gè)進(jìn)程自己所使用的內存數據的臟頁(yè)將達到總體內存的百分比,於是進(jìn)程自動(dòng)向內核申請激活pdflush 由pdflush將進(jìn)程的臟頁(yè)同步至磁盤(pán)(與單進(jìn)程相關(guān))
dirty_background_ratio: 如果某個(gè)進(jìn)程使用比例都是5% 但是所有進(jìn)程所占的比例加一起都有可能超過(guò)某一數值,所以所有數值加一起達到這個(gè)比例的時(shí)候則由內核啟動(dòng)pdflush,當某個(gè)進(jìn)程自己的比例達到dirty_ratio的比例的時(shí)候,進(jìn)程將自己向內核申請執行pdflush
以上是常調的兩個(gè)參數
那麼啟動(dòng)多少個(gè)pdflush線(xiàn)程比較合適:
一般默認而言,一個(gè)硬盤(pán)一個(gè)pfflush即可,多了反而會(huì )起到反作用
總結:對我們而言最常要調的有三組
1.swapinice overcommit 等
2.msgmax msgmin mnb 等
3.pdflush
而在有些特殊場(chǎng)景下,比如database 單進(jìn)程大量使用的場(chǎng)景下,需要自己手動(dòng)定義大頁(yè)的,這樣能夠顯著(zhù)降低數據庫的頁(yè)表條目,以及提高tlb命中率的
以上,為linux內存調優(yōu)的學(xué)習筆記,感謝各位
本文來(lái)自 http://go.rritw.com/yijiu.blog.51cto.com/ 轉載請與博主聯(lián)系,翻版可恥!
本文出自 “心情依舊” 博客,轉載請與作者聯(lián)系!
聯(lián)系客服