Linux內存監控與調優

 

首先,內存在被使用是被分爲區域的node

32位系統:zone_DMAmysql

    ·zone_NORMAL (正常內存區域 16M) linux

    ·zone_RESRVED(用於高地址內存空間 896M)sql

    ·zone_HIGHMEM(高地址內存空間 )數據庫

 

64位系統:apache

    ·zone_DMA(16G)vim

    ·zone_DMA32(4G)api

    ·zone_normal(大於4G)緩存

內存大頁 tomcat

    HugePage:大頁面,在rhel 6 x64位系統上不但支持大頁面並且支持使用透明大頁

    THP:透明大頁,簡單來說就是對匿名內存的使用,不須要用戶的參與自動在背後使用大頁面來管理匿名內存段

    匿名內存頁:RSS - 內存段 = 匿名頁

     

它支持兩種內存大小:

CentOS 6.4 x86_64 : 

    單個頁面大小可達到1G,在TB級的內存使用上一般有效

    小於TB級的內存,2M比較常見的

varnish是實現能夠支持在內存中提供緩存的,而varnish聽說跟透明大頁是不兼容的,而透明大頁一般狀況下是系統在背後使用的,既然不兼容則須要將透明大頁的功能關閉

 

查看內存大頁相關信息

[root@node3 ~]# cat /proc/zoneinfo

Node 0, zone     DMA                #顯示出是否使用透明大頁

  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             #匿名的透明矩形頁有0個,0說明沒有使用

 

        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位系統相關信息

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           #自動啓動透明大頁,而一個頁面的小小爲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

一個頁面大小爲2M,以上沒有顯示頁面大小,因此咱們要來查看另一個文件

[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               #匿名的透明大頁

HugePages_Total:       0                  #矩形頁面的總數

HugePages_Free:        0                  #矩形頁面的空閒總數

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的空閒內存其實並不是如此,所以空閒空間加上能夠清理的buffer/cache一共是1405這纔是真正的空閒內存

buffer/cache的做用:訪問IO設備,尤爲硬盤上的文件,是很是慢的,爲了加速訪問使其緩存至內存中,若是後期用戶對其訪問則直接在內存中訪問而不直接再到IO設備上檢索

所以Linux在使用buffer/cache是絕不吝嗇的,只要內存有空間則直接用來緩存

 

·關於 "-/+ 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使用了,因此壓根用的沒有這麼多,若是將buffer/cache減掉的話那麼實際用了471的內存

 

清理buffer/cache

若是必定要清理buffer/cache的話,只須要將/proc/sys/vm/drop_caches 更改其數值便可

可使用man proc來獲取幫助進而查看其每一個文件的意義

[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

只不過buffer/cache緩存的時候被分爲了兩大類:

1.cache:專門用來緩存page cache 頁緩存,這種緩存一般緩存的是文件數據,好比打開的文件內容

2.buffers:所緩存的是文件的元數據(inode+denty),或者一般用來緩存用戶的寫請求同步到硬盤上去的時候,先在內存中緩存一段時間再同步至硬盤

 

下面咱們來清理buffer/cache,並觀測free、buffer和cache這兩個值的變化

先來查看咱們當前內存資源使用狀況

[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這個值卻還有數據,說明咱們修改參數的時候,它的元數據在裏面也存在

這時候若是咱們大量去訪問文件會發現buffers/cache又會增長,由於對linux而言是利用內核緩衝進行加速的

 

交換內存的優化

簡單來說,最好不要用交換內存,可是linux系統的傾向性是很是高的,在服務器上它的默認值是至關不理想的,不少默認值只是適合於交互式桌面型的

涉及參數文件:/proc/sys/vm/swappiness

因而咱們man一下proc 找一下swappiness相關說明

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

咱們內核有多大傾向性使用交換內存的,這個值越大,那麼越傾向使用交換內存;

值越小越不傾向使用,而默認值是60,它的取值範圍一般是0-100的;

[root@node3 ~]# cat /proc/sys/vm/swappiness

60

建議設置參數爲0,由於0表明交換內存能不用則不用,而這正是偏偏是咱們所須要的

在服務器上,尤爲是物理內存緩存服務器上,好比varnish,必定強烈建議將此值改成0

 

通常而言當咱們目前已經映射進頁表中的內存百分比,也就是說物理內存的百分比已經被多少頁表所使用了,各個進程頁表映射目錄裏會映射出來每一個線性地址到物理地址的空間,因此多個進程都啓動了並且都啓動映射了,那因此物理內存中的進程當中的已經被直接映射進進程頁表中的空間大小的百分比 + swappiness的值 大於或等於100 的時候則啓動交換內存,也就是說當咱們的進程啓動起來以後,會有大量的數據實現了頁表映射,除了有些不能移除的以外,那這些映射頁表中已經使用的映射內存空間超出了物理內存的值從而加上swapiness的值,這裏swappiness是百分比) 只要大於等於100則開始啓用交換存在

 

默認是60,若是這裏是40%則啓動交換內存,因此說不理想,若是將其調整爲0,那麼就表示是100%,固然是不可能到達100%,若是到達100%表示內存耗盡,若是內存耗盡對系統來將會達到另一種狀態--內存溢出(內存耗盡)

 

內存溢出/內存耗盡

在linux內核必定要有預警性的,在內存耗盡以前會將至關消耗內存的進程kill掉,通常而言linux內核會觀測每一個系統進程,爲每一個進程作標記,如發現至關佔用內存的進程會將其結束,若是咱們服務上運行相似於varnish的內存緩存服務的話,那麼毫無疑問將結束的則是這個進程

 

因此咱們要手動調整其對應的級別的,不讓其內核對服務進行干擾

涉及參數文件:/proc/sysrq-trigger

調整內存相關屬性:

echo f > /proc/sysrq-trigger

f表示 手動調整oom-kill 會手動啓動oom-kill 會kill掉佔內存級別最高的進程,當讓一旦資源耗盡其也會自動啓動kill的

手動指定服務級別:

echo n > /proc/pid/comm_adj

用2的N次方來估值

 

禁止oom-kill

修改內核參數 :vm.panic_on_oom = 1

意味着當系統資源耗盡的時候使系統資源崩潰

 

關注的文件:

 /proc/進程的pid /oom_score

 

須要修改的文件

#調整指數,若是不指望使某個進程級別太高,儘量下降此值,就不會被kill

 /proc/進程的pid/comm_adj 

 

手動啓動oom-kill

echo f > /proc/sysrq-trigger

 

禁用oom-kill

vm.panic_on_oom = 1

只要有交換內存可用,在交換內存中仍然有些交換內存可用,並且物理內存都是活動頁的時候就不會發生oom 因此有些時候交換內存仍是有用的,只要物理內存沒有達到全部頁面都爲活動狀態,那麼交換內存在這種場景下仍是能夠起到必定額外緊急狀態時的功能,因此交換內存也是必要的

 

交換內存如何設定 本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

如下是IBM給出的建議,應在服務器上設置多大的交換內存設定,望各位參考:

·在執行批處理服務器計算的服務器上,尤爲作科學計算的服務器上,要使用 4 x RAM 都不算過度,固然RAM也就達到64G以上,那麼確實有些過度了,因需而調,通常來說小於4G; 

·若是是數據庫服務器,無論物理內存多大,那麼交換內存要小於1G

   以mysql爲例,在系統上運行的時候,mysql爲了提升性能大多數數據都使用在內存當中,由於mysql須要大量的數據查詢排序,尤爲在查詢排序的時候須要大量內存操做的,若是放在交換內存中的話其性能必定嚴重降低的,或者降低到不可接受的地步; 本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

   因此,數據庫服務器儘量作到如下兩點:

   1.儘量不用交換內存

   2.讓交換內存的空間足夠小

·應用服務器,好比apache、tomcat之類的服務器0.5 X RAM,物理內存的一半便可,若是物理內存一共有64g 那麼它的交換內存也不小,因此當內存大於4G的時候 咱們須要規劃一個指導線,若是物理內存大於4G的話仍是依然被耗盡,那麼依然須要加物理內存,由於交換內存是沒有意義的,在這種狀況下物理內存大於4G或者16G的話,通常交換內存分配4G左右便可;

 

不得不使用交換內存的建議

若是不得不使用交換內存,將交換內存放在越靠外的磁道上效果越好,那意味着將其放在最靠外的分區上

若是咱們有多塊硬盤並且沒有作RAID的話,那麼能夠將每一個硬盤最外面的分取都用於實現交換內存,假若有4塊硬盤,那麼將每一個硬盤的最外道拿出1G來作交換內存

linux內核在使用硬盤的交換分區的時候有一特性:能夠將交換分區定義優先級,咱們可讓這4個的優先級同樣,意味着內核以負載均衡的方式均分對交換內存的使用(負載均衡)這樣就能夠大大提升交換內存的使用

/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  #當以上的空間全用光了再向此文件中存放數據 

固然,以上是在沒有作RAID的情景下,若是有RAID0 或RAID5的話則更好 

   

手動配置大頁面(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

咱們能夠手動定義將其當作共享空間來掛載,直接掛載到某個目錄,然後建立文件快速刪除頗有用,有時候咱們寫腳本的時候可能會生成不少臨時文件,若是咱們將臨時文件都放在這樣的內存中,效果會更好

因此這時咱們能夠定義幾個透明大頁,將這些透明大頁定義成共享內存空間並掛載

hugetable page主要是提升TLB性能,這樣頁表項就會變小,因此能提升TLB的性能

配置hugetable page

x86info –a | grep 'Data TLB'

dmesg

cat /proc/meminfo

更改大頁

vim /etc/sysctl.conf

將值自定義更改:

vm.nr_hugepages = n

#hugepages = n

掛載

mkdir /hugepages

mount –t hugetlbfs none hugepages

經過掛砸能夠將其當作內存磁盤來使用了,固然平時的時候不須要本身指定,若是不是本身想寫腳本並建立臨時文件的話是不須要掛載它的,只要啓動透明大頁,然後在mysql服務器上將服務器變量當作定義使用透明大頁,它會自動使用

因此tlbfs只有在必要的時候,或想本身手動指定在某個位置使用內存磁盤的時候纔有必要去定義的

定義透明大頁的個數:

[root@node3 ~]# cd /proc/sys/vm/
[root@node3 vm]# cat nr_hugepages

0

將其值改成理想的數值便可,或者在grub中爲內核啓動的時候定義內核參數

 

觀察內存的使用狀況

好比觀察內存有多少被交換出去或有多少被交換進來,page頁面有多少被分配出去或有多少寫入到磁盤中等

涉及命令:

vmstat -n 1 2

sar -r  1 2

1表示採樣時間間隔

2表示採樣時間次數

 

使用vmstat -n觀察內存活動信息

 [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 

 

參數解釋:

swap : 虛擬內存的使用狀況,固然咱們這裏沒用

    si: 從磁盤中讀進來的swap數據量

    so: 寫到swap中的數據量

 

free:空閒內存量

    buffer:用於buffer空間
    cache:如上

 

另外還有兩個沒有顯示須要使用-a參數查看

inact: 非活動內存 意爲已有一段時間沒有被程序所使用了

可是inact非活動該內存有兩類:

  ·乾淨頁:  指的是沒有被修改的,能夠將其回收,直接清理便可

  ·髒頁  :  指的是必須將其同步到磁盤上才能夠回收資源

active :活動內存 意爲正在被程序所使用的

 

若是咱們發現大量的si so 意味着交換內存以及被使用了,並且有大量的換進換出,意味着物理內存不夠用,那麼提升性能的方法無非就是加大物理內存;

可是須要注意的是當觀測一個值的時候,有可能會有一些比較獨特的狀況,好比CPU使用率100%並不意味着CPU慢,由於CPU可能花費很長時間去等待IO完成,也就是說去進行swap in/out  因此不少時候看上去CPU利用率高,可是最後發現是I/O的問題,徹底是有可能的

若是出現這種I/O,因爲是swap產生的io,意味着內存不夠用,因此要作綜合評判

 

使用sar -r 進行觀測

[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

須要關注前四個參數的值的變化

參數解釋:

kbmemfree:  以kb爲單位顯示內存的空閒空間

kbmemused: 以kb爲單位顯示內褲空間的使用

memused :  內存使用百分比

kbbuffers:  略 

kbcached : 略

kbcommit  :內存的提交

須要關注的是前四個值,若是數據量變化很是頻繁的話,則代表內存被頻繁的使用/釋放;

若是釋放回收的比例太高,而free空間太小 use的空間過大,並且變化過於頻繁的時候,那麼極可能是內存活動劇烈致使的,有多是像varnish之類的服務因爲頻繁的內存釋放回收等實現緩存對象建立和清除的活動帶來的,只要對比沒有到100% 就能夠任由他去 ,可是注意實時監控

 

使用sar -R 觀測內存其活動速率 本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

[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 : 每秒釋放了多少個內存頁,若是咱們想要知道多大內存須要將這個數值乘以4

bufpg/s : 每秒被用於哪來實現buffer的頁面個數

campg/s : 如上,每秒被用於哪來實現cache的頁面個數

bufpg+campg-frmpg = 真正釋放的個數

若是一直是負值,那麼內存空間確定是一直有限的,總有必定時間總會被耗盡,因此一直爲負值就意味着可能會內存泄露了

這個觀測值還能夠長時間評判出內存是否有泄露狀況發生,釋放和分配的值大體能夠相同

 

使用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

因爲沒跑任何服務因此這裏爲0,若是有頻繁的pswpin 和pswpout 就意味着咱們的物理內存過小了

交換內存用了沒有關係,可是變化量很小可是使用空間很大也沒有問題

若是變化值很高,一般會有問題須要咱們關注了

 

使用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 :   每秒頁面載入個數

pgpgout:   頁面寫出個數,以頁爲單位直接與內核內存交互的,而內核內存最終是與I/O交互

#一通不一樣到磁盤中一般都是髒頁,須要pgpgin通常須要用到buffer/cache

fault  :   每秒出現的異常個數

majflt :   大異常的個數

 

#如下參數不須要被關心

pgfree :每秒鐘有多少個頁被放到空閒列表中去,說明被回收回來的頁面個數

pgscank:每秒被kswap所掃描的頁面個數

pgscand:直接被內核掃描的頁面個數

 

以上是跟真正I/O相關的參數(跟硬盤交互的時候數據載入內核內存並載入到進程內存中,或從髒頁中寫入到磁盤中的數據

 

題外:使用dstat觀察內存情況

dstat是很是好用的工具,能客觀明瞭的顯示出內存當前使用狀況,我的比較喜歡用,這裏略過

[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

 本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

調整內核參數

·容量調節

好比咱們內存空間一共只有1G的容量,而是否能讓內存使用大於1G,大於物理內存則意味着要使用交換內存進行存儲數據,也就意味着只要容許過量那就必然會使用交換內存

若是確確實實不能加物理內存不得不使用交換內存的時候,尤爲是在批量處理的環境上,好比hadoop,其不提供實時處理的,因此批量提交處理做業,和提交做業的輸出中間可能有一段時間間隔,這種狀況下是容許能夠過量使用內存的

涉及參數文件:

/proc/sys/vm/overcommit_memory

/proc/sys/vm/overcommit_ratio

/proc/sys/vm/max_map_count

  本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

·overcommit_memory

[root@node3 ~]# cat /proc/sys/vm/overcommit_memory

0

相關參數:

0 :默認設置,是否容許過量,由內核決定是否能夠過量並且容許過量多少

1 :容許使用交換內存,可是不明確使用大小,有可能會致使崩潰的

2 :容許使用交換內存,可是過量多少是須要手動定義的

   本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

若是設定爲2,那麼可用總的內存大小是:全部的交換內存空間 + 物理內存空間的一部分

使用多少物理內存是由overcommit_ratio進行定義的內存比例,用這個比例乘以物理內存的大小再加上交換內存的大小就是全部可用的內存空間

 

·overcommit_ratio

    假如這個ratio 爲0.5的話,swap爲4G 那麼最大可用內存空間爲6G

    若是overcommit_ratio的值爲0的話,那就意味着全部可用大小是交換內存的所有+物理內存x0% 最終仍是4G  本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

 

很顯然,若是交換內存是4G 物理內存也是4G 又經過這種方式定義最多隻能使用4G,那就意味着交換內存可能會用到 本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

若是將swapiness的參數設置爲0,那麼意味着儘可能不使用交換內存,而咱們這裏又明確說明內存總共可用空間只有4G,由於咱們設置overcommit_ratio爲0 而overcommit_memory的值爲2,那毫無疑問確定總共大小爲4G,那就意味着咱們交換內存可能會派不上用場,這就起到相似禁用交換內存的效果

 本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥! 本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

有些場景下,若是咱們指望儘量不使用交換內存可用使用這種方式

swapiness = 0

overcommit_memory = 2

overcommit_ratio = 0

這是一個很是常見的內存內核優化機制

 本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

 

進程間通訊內存性能調節 

涉及參數配置文件路徑:/proc/sys/kernel/

·msgmax

    進程間通訊若是基於消息間通訊的話有可能一個進程與N個進程交互

    若是各worker發現其處理速度很快的話,而master處理速度很慢,那一樣的速率下一個進程只能處理有限的幾個,那麼則有不少會處於等待狀態(將其放在隊列中)

    因此其參數的意思爲:以字節爲單位,用來定義單個消息大小的,默認值爲65536

·msgmnb

  以字節爲單位,指定消息隊列的大小,單個消息上限

·msgmni

  是否容許多少隊列個數

 

假如一個隊列爲10k,那咱們有10個隊列,10個隊列加一塊兒則爲100k也就是說一共容許使用多少個消息隊列,而每一個隊列有多大,而每一個隊列中的消息有多大,都是經過以上三個參數進行定義的

若是某個進程通訊量的確很大,並且單個消息量也大,那咱們能夠將單個隊列長度進行調整,將單個消息的上限調整;若是消息量也很大,則能夠增長隊列數

前提是進程間通訊是根據消息通訊的,若是不是則進入第二種方法:

  本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

 

以共享內存做爲通訊方式

涉及參數配置文件路徑:/proc/sys/kernel/

·shmmni

   可用於共享內存的最大內存大小,指的是片斷,由於共享內存不必定是連續的,因此指的是用於共享內存的內存段的個數,默認值爲4096

   有些服務,好比oracle,oracle內部有許多子進程這些進程各自負責不一樣的任務,而彼此之間通訊都是基於共享內存所實現的,因此一般須要調整其值

·shmmax

    可容許最大共享內存片斷(單個內存片斷大小上限),64位系統默認值爲68719476736,在紅帽6.x 64位系統則不用調整了

·shmall

    單次在系統中可使用的共享內存量,某一次申請共享內存,最多可申請多少個

    好比:一個片最大10k,一共4096片,咱們規定一次只能使用20k,那麼意味着咱們最多可使用2片;那麼若是咱們定義單片最大上限爲20k,那麼意味着一次只能申請一片。

     在紅帽6.4,若是內存夠多一般是不用調整的

·threads-max   本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

   最大線程,規定內核使用的最大線程數

  threads-max最小爲20 

計算最大值:

  max_threads = mempages / (8 * /THREAD_SIZE / PAGE_SIZE )

  若是多個進程大小值一般很難平均的時候,這個值可能會用的到

 

與容量相關的文件系統可調整參數 

主要關心的參數:

·file-max 

設置最大的文件描述符

echo '*    -      nofile     65535 ' >>/etc/security/limits.conf

#nofile 表示所能打開的最大的文件數

 

·min_free_kbytes

最小空閒的內存空間,咱們的物理空間不能所有分配出去,必需要預留一部分供內核所使用、分配,設置這個數值務必要當心,由於太高或太低都有風險的,多數狀況下若是不清楚能夠不調

 

·dirty_ratio

當物理內存中髒頁比例超出必定比值的時候必定會使用pdflush按期刷寫到硬盤上去,可是若是變化量很是快,若是不到一秒鐘就會有不少,那麼用定時刷寫則效率會比較低

一般將髒頁刷寫到硬盤一般有兩個策略

    ·按照時間,固定週期 本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

    ·按照刷寫的內容,達到必定比例,到達必定比值的時候

時間間隔越小就意味着刷鞋頻率越高,頻率越高就意味着數據在內存中可能丟失的越小,可是IO活動量就越大,因此不少時候取得一個理想值是很關鍵的

 

好比:若是有時候3秒鐘的數據丟失,就意味着數據量能夠在內存中存儲3秒以上,意味着3秒刷寫一次,那麼IO量會下降,IO是性能的瓶頸所在

dirty_ratio默認值爲20,當髒頁比例所佔據的總內存空間所達到了總內存空間的百分之二十以後則自動刷寫到硬盤中

若是認爲這個值比較低,能夠將其調高,能夠下降刷寫次數,提升性能表現,可是可能會丟失數據,具體調整多少值須要本身去衡量

在對於數據要求很是高的場景中,好比數據庫,這個值不能夠調高;可是對於varnish這種內存緩存服務器來說,緩存的數據丟失也沒有關係,這樣的話能夠調高,可是緩存是不可以寫數據的,或者說在內存中存儲緩存是不可能刷寫的硬盤上去的,可是有的時候須要的,好比用磁盤進行緩存數據,這時候能夠極大的調整此值;

 

·dirty_background_ratio

與上面不一樣,此值定義全局百分比 本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

 

dirty_background_ratio和dirty_ratio的區別:

dirty_ratio是由當某個進程本身所使用的內存數據的髒頁將達到整體內存的百分比,因而進程自動向內核申請激活pdflush 由pdflush將進程的髒頁同步至磁盤(與單進程相關)

dirty_background_ratio: 若是某個進程使用比例都是5% 可是全部進程所佔的比例加一塊兒都有可能超過某一數值,因此全部數值加一塊兒達到這個比例的時候則由內核啓動pdflush,當某個進程本身的比例達到dirty_ratio的比例的時候,進程將本身向內核申請執行pdflush

以上是常調的兩個參數

那麼啓動多少個pdflush線程比較合適:

通常默認而言,一個硬盤一個pfflush便可,多了反而會起到副作用

 

總結:對咱們而言最常要調的有三組

1.swapinice overcommit

2.msgmax msgmin mnb

3.pdflush

而在有些特殊場景下,好比database 單進程大量使用的場景下,須要本身手動定義大頁的,這樣可以顯著下降數據庫的頁表條目,以及提升tlb命中率的

 

以上,爲linux內存調優的學習筆記,感謝各位

 

  本文來自 http://yijiu.blog.51cto.com/ 轉載請與博主聯繫,翻版可恥!

相關文章
相關標籤/搜索