Linux內存監控與調優

轉載自:http://yijiu.blog.51cto.com/433846/1552564


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

32位系統:zone_DMA

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

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

    ·zone_HIGHMEM(高地址內存空間 )

 

64位系統:

    ·zone_DMA(16G)

    ·zone_DMA32(4G)

    ·zone_normal(大於4G)

內存大頁 

    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內存調優的學習筆記,感謝各位


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章