天天看點

Linux運維 第二階段(十六)OS優化(2)

虛拟化對于記憶體子系統的虛拟是很麻煩的,原因:虛拟化環境中,程序位址PA-->虛拟機記憶體位址HA-->實體記憶體位址MA,虛拟機上的程序PA轉換的結果在HA上,HA還要轉換為MA,CPU找的是實體記憶體位址MA,這種效率很低

虛拟機的OS稱為guest OS,目前的實體主機稱主控端

主控端要監控着HA到MA的轉換,一旦發現虛拟機的HA要執行特權指令了,要完成HA到MA的轉換,若直接從PA-->MA則要好很多,若硬體不支援的話将無法完成直接轉換,必須二次轉換才可,現在很多支援硬體虛拟化的CPU都能夠提供影子頁表shadow PT,page table,它能夠在原有的MMU的旁邊再提供一個虛拟MMU(假的緩存的MMU晶片),讓guest OS轉換時到真的MMU上去,而主控端的OS負責自動在背後同步就完成從HA-->MA的轉換,由此通知CPU直接一步一次性完成從PA-->MA的轉換,位址翻譯(或叫虛拟記憶體)是X86平台最難虛拟化的元件,除此之外隻能完全進行模拟

系統優化的三個層次:守護程序;OS核心;硬體

硬體(硬體性能足夠好,其上的所有參數都不用調,足以扛得下所有應用,選擇與業務合适的硬體,符合業務處理需求的(分析業務本身是CPU密集型還是IO密集型,對記憶體的資源需要多少,對CPU的計算量要多大等),有了這樣的直覺認識才會知道某個服務在什麼硬體上比較合适,硬體調優就是硬體選型,如cache server、mysql server等環境)

OS核心(對整個底層硬體管理的最根本所在,核心功能要能夠有效使用這些硬體,如調整記憶體參數、程序的優先級等,無非核心在使用底層硬體資源上得到更有效的配置,進而加速核心在使用硬體計算資源方面的能力)

守護程序(每種守護程序的調整各不相同,如nginx(nginx自身的參數名額,如CPU綁定、開啟的線程數、使用多少緩存等),而網絡方面、CPU綁定(nginx可自行綁定)、IPC調整等歸根結底還是系統核心方面的調整;而對于某種特定複雜的服務,如mysql,它自身服務參數的調整(服務級别調整)影響較大,如索引的設計、storage engine的選擇等;而對于簡單的服務來說在服務級别調整意義并不大,如httpd無非是選擇一個高性能的MPM子產品,關掉某些不必要的功能,打開壓縮等,壓縮未必是調優,它能優化帶寬的使用,但會增加CPU的負荷,沒有放之四海而皆準的方法,最重要的還是核心的基本原理)

觀察系統性能名額有:記憶體使用、程序對CPU使用、CPU的使用率、CPU隊列、網絡緩沖區是否夠用、線程重用、會話重用等

通過系統名額工具觀察,發現某些名額不符合需要,如記憶體空間(實體記憶體、交換記憶體),實體記憶體沒用完就大量使用交換記憶體了,通過本篇記憶體子系統優化即可解決

關鍵:

硬體選型

核心自身的調優(/proc和/sys,通過虛拟FS來同核心打交道,調整其工作參數)

應用服務級别(對于一般的服務,無非是服務如何使用系統資源,如web server的應用,通過觀察性能名額,能分析出對哪些參數進行調整,在某些應用上關掉不必要的功能;對于複雜的服務如資料庫,通過服務自身參數在某些特定條件下調整)

程序管理(在CPU時間片上實作)

記憶體調優(最複雜,原理上最需要基本功)

IO調優(尤其磁盤IO)

FS調優(與IO有關,在同樣的磁盤IO下,不同的FS在某些應用上的性能表現不同)

網絡子系統調優

注:CPU、memory、I/O、FS、networking;memory中capacity tuning包括(怎麼使用交換記憶體、什麼時候啟動pdflush、如何調整大記憶體頁的個數,例如overcommit_memrory=0|1|2,overcommit_ratio預設值50)

RHCA中專門的調優RH442一書

思路:

觀察系統性能名額,檢視哪些是bottleneck

使用相關參數對bottleneck調優,反複、全方位多角度的分析,一個一個參數調整或結合不同的參數調整

注:有時明确觀察到的是CPU使用率過高,但最後發現不是CPU問題,CPU被大量用作IO上了

redhat官方稱調優是black art

redhat enterprise linux6 performance工具有:

SystemTap(涉及到system程式設計,類似strace觀察系統上各個子產品的運作方式,檢視系統上的每個system call,核心與程序互動時的活動狀态)

OProfile(評估OS性能)

Valgrind(強大的記憶體洩露探測工具,程式員在程式設計完後評估自己程式是否有記憶體洩露、對于緩存的使用率等各方面的評估工具,評估CPU緩存命中、應用程式記憶體洩露、應用程式對緩存的使用率等)

Perf(調優工具,相較于以上三個要簡單些)

虛拟記憶體管理virtual memory manager

<a href="http://s2.51cto.com/wyfs02/M00/7D/29/wKioL1bhJ2HBuZAQAABQEu_1Ads778.jpg" target="_blank"></a>

如下圖:在32bitOS上最多可用記憶體為2^32(4G),這4G分為1G的核心空間和3G的使用者空間,在1G的核心空間中,有16M用來DMA(direct memeory access),這個區域包括pages,從16M-896M這800M空間是核心使用的,還有128M是用來做映射的(頁表的虛拟位址和實體位址的映射關系);對于64bitOS,有1G是用來做DMA的,其它的都是實際的可用的位址空間,是以在伺服器上直接使用64bitOS

<a href="http://s3.51cto.com/wyfs02/M00/7D/2A/wKiom1bhJuqgDjPGAAA5HtQXY0k830.jpg" target="_blank"></a>

1、TLB(translation lookaside buffer)傳輸後備緩沖器是一個記憶體管理單元MMU(memory management unit),用于改進虛拟位址到實體位址轉換進度的緩存,TLB裡面存放的是一些頁表檔案

TLB與CPU的L1、L2緩存類似,TLB緩存頁表資料,CPU的一二級緩存的是實際資料;X86體系的系統記憶體裡存放了兩級頁表,第一級頁表稱為頁目錄,第二級稱為頁表;若TLB中正好存放着所需的頁表,則稱TLB Hit,若TLB中沒有所需的頁表,則稱TLB Miss

記憶體優化最主要的一點就是提升TLB的性能,使用hugetable page(大表頁),要啟用hugetlbfs(類似上一篇末cpuset檔案系統),它能夠實作使用多種不同的頁面大小,可使用一部分正常的4K頁面,也可使用一部分hugepages大頁面

[root@node1 ~]# cat /proc/meminfo | grep -i HugePage(檢視HugePage是否啟用)

HugePages_Total:     0(0表示未啟用)

HugePages_Free:      0

HugePages_Rsvd:      0

Hugepagesize:     4096 kB(32bitOS正常頁面4K,大頁面4M;64bitOS,大頁面2M)

improving TLB performance:

[root@node1 ~]# vim /etc/sysctl.conf(在此檔案中添加一行,也可通過核心參數hugepages=NUM設定)

nr_hugepages = NUM

當建立出大頁面後,可指定被某些應用程式所使用;也可将hugepage當FS(hugetlbfs)直接使用(要挂載至某個目錄下當作FS直接用,實作檔案複制、删除、修改等),重新開機後會消失,通常将臨時檔案這樣用

configure hugetlbfs if needed by application:

[root@node1 ~]# mkdir /hugepages

[root@node1 ~]# mount -t hugetlbfs none /hugepages/(為某個應用程式明确指明要使用hugepages才要挂載,有些應用程式如mysql會自動使用hugepages不必非得挂載FS)

[root@node1 ~]# ls /hugepages

[root@node1 ~]# dd if=/dev/zero of=/hugepages/a.txt bs=1M count=5

dd: writing `/hugepages/a.txt': Invalidargument

1+0 records in

0+0 records out

0 bytes (0 B) copied, 0.00205759 seconds,0.0 kB/s

[root@node1 ~]# ll /hugepages(注意檔案大小為0,使用的是記憶體空間)

total 0

-rw-r--r-- 1 root root 0 Dec 21 21:28 a.txt

[root@node1 ~]# umount /hugepages

注:innodb_buffer_pool_size這個空間是讓mysql的innodbstorage engine緩存資料、索引,通常特别大,若記憶體10G給它6G都不過分,若這6G空間被它反複拿來申請使用,若仍用4K的一般頁面,性能效率就太低了,這種情形下使用hugepages可有效提高其性能(配置innodb可使用大頁面,隻需指定有大頁面,不必挂載)

viewing system call:

某個應用程式在運作時需要操作硬體,通過system call的方式,必須由核心完成應用程式申請的特權功能

[root@node1 ~]# man strace(trace systemcalls and signals)

#strace  -p  PID(觀察程序如何運作,執行了哪些system call)

#strace  COMMAND(檢視指令的system call)

#strace  -o FILE  -p  PID(将追蹤結果儲存至檔案中,供分析用)

#strace  -c  -p  PID

#strace  -c COMMAND

例:

[root@node1 ~]# ps -C httpd(檢視某程序的PID号)

[root@node1 ~]# ab -n 100000 -c 100 http://127.0.0.1/index.html

[root@node1 ~]# strace -p 18567(該程序接收了請求,使用者請求的是頁面檔案,頁面檔案中disk上,産生system call加載硬碟中的頁面檔案,()内都是system call)

……

read(16, "GET /index.htmlHTTP/1.0\r\nUser-A"..., 8000) = 94

gettimeofday({1450706277, 640065}, NULL) =0

stat64("/var/www/html/index.html",{st_mode=S_IFREG|0644, st_size=26, ...}) = 0

open("/var/www/html/index.html",O_RDONLY|O_LARGEFILE) = 17

mmap2(NULL, 26, PROT_READ, MAP_SHARED, 17,0) = 0xb7f47000

writev(16, [{"HTTP/1.1 200 OK\r\nDate:Mon, 21 D"..., 261}, {"the server is maintaining\n", 26}], 2) =287

munmap(0xb7f47000, 26)                  = 0

write(11, "127.0.0.1 - -[21/Dec/2015:21:57"..., 106) = 106

shutdown(16, 1 /* send */)              = 0

[root@node1 ~]# stracecat /etc/fstab(execve()運作指令,open()打開一個檔案,fstat()檢視權限相關資訊,read()讀取檔案内容,write()往螢幕上寫)

[root@node1 ~]#strace -c cat /etc/fstab(Count  time,  calls, and errors for each system call andreport a summary on program exit,追蹤整體結果,将彙總資訊顯示出來,可分析某程式執行的大量system call時間都消耗在什麼地方了,如在LAMP架構中php以子產品方式嵌入在httpd程序中發現httpd響應慢,可找出慢的主要原因)

% time    seconds  usecs/call     calls   errors syscall

------ ----------- ----------- ------------------ ----------------

   nan    0.000000           0         3           read

  nan    0.000000           0         1           write

  nan    0.000000           0         4           open

  nan    0.000000           0         5           close

  nan    0.000000           0        1           execve

  nan    0.000000           0         1         1 access

  nan    0.000000           0         3           brk

  nan    0.000000           0         1           munmap

  nan    0.000000           0         3           mprotect

   nan   0.000000           0         7           mmap2

  nan    0.000000           0         5           fstat64

  nan    0.000000           0         1           set_thread_area

100.00   0.000000                   35         1 total

2、

strategies for using memory:

reduce overhead for tiny memory objects盡可能降低微小記憶體對象的開銷(slab cache,slab allocate配置設定的都是用來存儲中繼資料的tiny memory object,叫小記憶體資料結構,這些小記憶體資料結構會被頻繁的建立和撤銷,是以使用slab)

slab使用的記憶體政策:

the slab memory cache contains pre-allocated memory pools that the kernel pulls memory from when it needsspace to store various types of data structures

<a href="http://s3.51cto.com/wyfs02/M02/7D/29/wKioL1bhKGGxy-fzAAA-8esKiB4706.jpg" target="_blank"></a>

先申請幾個記憶體頁如kmem_cache,将記憶體頁按類型(各種規格)劃分好,分好後是slab頁面,在每個頁面上放一堆的object,為提高效率會事先劃分好多個不同規格的頁面,不管某個規格用不用都事先劃分好,kmem_cache裡包含很多頁,分成三類如slabs_full、slabs_partial、slabs_empty,使用完一個再使用另外一個,slabs_partial正在使用中,已使用的不管,未使用的自上而下排,page中可存儲object

注:slabs_full(已全部使用的slab緩存),slabs_partial(僅部分使用的slab緩存),slabs_empty(空間未使用的slab緩存)

slab用來實作小對象的快速配置設定和回收,使用時預先配置設定好,不夠用再申請新的,如果某個記憶體對象被删除了,而它所使用的空間隻是被騰空而不會删除這個空間

reduce or defer service time for slower subsystems降低或延遲慢速子系統的服務時間,整個系統,整個系統IO慢,通過提供buffer cache将資料從外圍裝置上加載并緩存在記憶體中,縮減方法:提供buffer cache):

filesystem metadata(buffer cache也叫slab cache,實際slab cache就在buffer cache中,FS的中繼資料在buffer上,全稱buffer cache,還可用來緩存寫操作)

disk IO(page cache,資料是用page cache來緩存的,中繼資料是用buffer cache緩存的)

interprocess communications(shared memory,shm,程序間通信使用共享記憶體完成)

network IO(buffer cache、arp cache、connectiontracking,網絡IO借助buffer cache、arp cache、連接配接追蹤等功能來提升性能,每個使用者會話建立都要占據記憶體空間,實作将使用者的會話存儲下來并進行追蹤)

總結:

(1)      降低微型記憶體對象的系統開銷(使用slab)

(2)      縮減慢速子系統的服務時間(使用buffer cache緩存檔案的中繼資料;使用page cache緩存disk IO檔案資料;使用shm提升程序間通信的效率;使用buffer cache、arp cache、connection tracking來提升網絡IO性能)

注:[root@node1 ~]# cd /proc/sys/vm

[root@node1 vm]# ls

block_dump                 drop_caches           max_reclaims_in_progress  overcommit_ratio          topdown_allocate_fast

dirty_background_bytes     flush_mmap_pages      max_writeback_pages       pagecache                 vdso_enabled

dirty_background_ratio     hugetlb_shm_group     min_free_kbytes           page-cluster              vfs_cache_pressure

dirty_bytes                laptop_mode           mmap_min_addr             panic_on_oom              vm_devzero_optimized

dirty_expire_centisecs     legacy_va_layout      nr_hugepages              percpu_pagelist_fraction

dirty_ratio                lowmem_reserve_ratio  nr_pdflush_threads        swappiness

dirty_writeback_centisecs  max_map_count         overcommit_memory         swap_token_timeout

tuning page allocation(調整頁面配置設定):

vm.min_free_kbytes(最小空閑Kb數,記憶體有實體記憶體和交換記憶體,交換記憶體可當記憶體來使用,目前主機會運作很多程序,每個程序運作時可能會打開檔案申請新的記憶體空間使用,同時運作的多個程序,當有程序又要申請記憶體空間時,若記憶體空間不夠用,當記憶體耗盡系統會崩潰的,是以無論如何不能讓記憶體耗盡,而且記憶體空間太少也不能保證多個程序正常使用,是以要将某些實體記憶體頁交換到交換記憶體中,此項就是定義實體記憶體最少空閑多少空間,這樣實體記憶體始終不會占滿,已預留出了最小空間,當某程序又要申請空間但記憶體占滿,這時就要将某些占用記憶體最多的程序給交換到交換記憶體中了,絕大多數場景都不需調整此參數,僅特殊場景下要調,如磁盤太慢、CPU性能太差時,可将此項調小一點,因為這段預留的空間将無法被其它程序使用,必須要空閑出來一些)

[root@node1 vm]# cat min_free_kbytes

2048

tuning overcommit(調整記憶體過量使用,常用,尤其在虛拟化環境中尤其有用):

vm.overcommit_memory =0|1|2

0(heuristic overcommit,啟發式過量,由OS核心自己決定要不要過量什麼時候過量使用,什麼時候使用交換記憶體及使用多少交換記憶體)

1(always overcommit,總是過量使用,在任何場景都用交換記憶體;此項在DB server上盡可能不要使用,swap太慢了;在有些場景如hadoop下這是個批處理系統,對real time實時的要求不高,需要大量記憶體用來計算,使用此項)

2(commit all RAM plusa percentage of swap(may be&gt;100),所有實體記憶體加一部分swap記憶體)

注:主機上運作多個虛拟機,每個虛拟機配置設定的有虛拟CPU(按時間切片虛拟),如主控端1顆CPU4核心,在此宿主上安裝了4個虛拟機,給每個虛拟機配置設定1顆CPU2核心,這就共8核了,過量使用;若主控端上8G記憶體,若給這4個虛拟機每個分4G的記憶體會配置設定不出去,會提示沒有更多的記憶體空間可用,在實體機的基礎上過量使用,CPU可以多虛拟出幾個(按時間虛拟),記憶體則不行(是空間映射),實體記憶體的過量使用是以swap為前提的,可以超出實體記憶體一部分,在性能要求很高的場景能不使用swap則不使用

vm.overcommit_ratio(用來定義可超出實體記憶體的比例,預設值50,僅在vm.overcommit_memory=2時使用,注意確定此實體記憶體空間*此比例不能超出swap記憶體空間的實際大小,否則會記憶體溢出out of memory,OOM很嚴重,核心要執行一些管理操作将無空間可用,這時核心會找一些使用記憶體空間比較大的程序不管是誰也不管重不重要将其幹掉,核心中有OOM killer,可自定義一旦有OOM将殺死哪些程序,根據程序的評分,每個程序都有評分,得分高的将優先被殺)(/proc/PID/oom_score,/proc/PID/oom_adj,/proc/PID/oom_score_adj可調整分數)

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

[root@node1 ~]# cat /proc/sys/vm/overcommit_ratio

50

[root@node1 ~]# cat /proc/7359/oom_score

1

[root@node1 ~]# cat /proc/7359/oom_adj

[root@node1 ~]# cat /proc/7359/oom_score_adj

slab cache(調大slab cache可提升CPU在通路記憶體小對象時的性能):

[root@node1 vm]# cat /proc/slabinfo

slabinfo - version: 2.1

# name            &lt;active_objs&gt;&lt;num_objs&gt; &lt;objsize&gt; &lt;objperslab&gt; &lt;pagesperslab&gt; :tunables &lt;limit&gt; &lt;batchcount&gt; &lt;sharedfactor&gt; : slabdata&lt;active_slabs&gt; &lt;num_slabs&gt; &lt;sharedavail&gt;

ip_vs_conn             0      0   128   30    1 : tunables  120  60    8 : slabdata      0     0      0

rpc_buffers            8      8  2048    2    1 : tunables   24  12    8 : slabdata      4     4      0

[root@node1 vm]# cat /proc/slabinfo | grep -E "(dentry|ext3)"(dentry和inode cache)

ext3_inode_cache    2999  5432    492    8   1 : tunables   54   27   8 : slabdata    679    679     0

ext3_xattr           729  1092     48   78   1 : tunables  120   60   8 : slabdata     14     14     0

dentry_cache        8442 11165    136   29   1 : tunables  120   60   8 : slabdata    385    385     0

[root@node1 vm]# man slabtop(displaykernel slab cache information in real time)

[root@node1 vm]#slabtop(随時監控着系統上的slab對象,在某些特定場景,調整slab對象的參數以使得有足夠的不同類型的slab空間可用,Active活動對象,當使用百分比過高時再次打開類似對象就要清除一些緩存,騰出空間,每種類型的數目總體是有限定的,用量很大的dentry_cache、ext3_inode_cache,一般FS和目錄的用量都是很大的)

Active / Total Objects (% used)   : 317793 / 345656 (91.9%)

 Active / Total Slabs (% used)      : 5069 / 5069 (100.0%)

 Active / Total Caches (% used)     : 103 / 153 (67.3%)

 Active / Total Size (% used)       : 15928.85K / 18870.70K (84.4%)

 Minimum / Average / Maximum Object : 0.01K /0.05K / 128.00K

 OBJSACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                  

144130 144056  99%   0.02K    710      203  2840K avtab_node

101700 100590  98%   0.03K    900      113  3600K size-32

注:dentry(通過目錄可找到檔案,路徑映射關系,每打開一個檔案路徑映射關系都緩存到slab object中,否則每次打開都很慢)

[root@node1 vm]#vmstat –m(Report virtual memory statistics,The -m displaysslabinfo)

Cache                       Num  Total  Size  Pages

ip_vs_conn                    0      0   128     30

rpc_buffers                   8      8  2048      2

rpc_tasks                     8    20    192     20

rpc_inode_cache               6      9   448      9

ip_fib_alias                 10    113    32    113

ip_fib_hash                  10    113    32    113

tuning a particular slab cache:

#echo  “cache_name limit  batchcount  sharedfactor” &gt;  /proc/slabinfo(可被CPU緩存的最多對象條目,batchcount當CPU緩存為空時一次性傳到CPU緩存對象的個數,sharedfactor在SMP架構各CPU間共享的slab緩存條目)

[root@node1 vm]# echo "ext3_inode_cache 108 54 8" &gt; /proc/slabinfo

[root@node1 vm]# cat /proc/slabinfo | grep ext3

ext3_inode_cache    2999  5432    492    8   1 : tunables  108   54   8 : slabdata    679    679     0

arp cache(

預設arp的緩存在/proc/net/arp檔案中,預設緩存512個條目(soft limit),最多可緩存1024(hard limit),超出512個後隻能緩存有限的時間(5s,預設是5min),若緩存數目超過硬限制,核心中有GC,garbage collection會清理一些過時的stale和廢舊的條目older entries,arp緩存的條目預設隻5min,若處在一個非常大的網絡中應将此項調大,否則緩存的條目會被頻繁重新整理,C網預設253個主機,若處在網絡中的主機不多,此項一般都不需調)

檢視緩存清單條目:

[root@node1 vm]#cat /proc/net/arp

IP address       HW type     Flags      HW address            Mask     Device

192.168.41.1     0x1        0x2         00:50:56:C0:00:08     *       eth0

[root@node1 vm]# ipneighbor list

192.168.41.1 dev eth0 lladdr00:50:56:c0:00:08 REACHABLE

[root@node1 vm]# ipneighbor flush dev eth0(flush cache清空某個裝置上的所有緩存條目)

[root@node1 vm]# ipneighbor flush

Flush requires arguments.

/proc/sys/net/ipv4/neigh/default/下有thresh{1,2,3}三個預值,預設分别為128、512、1024,

net.ipv4.neigh.default.gc_thresh1(預設128個條目,gc不管)

net.ipv4.neigh.default.gc_thresh2(預設512個條目,softupper limit)

net.ipv4.neigh.default.gc_thresh3(預設1024個條目,hardupper limit)

net.ipv4.neigh.default.gc_interval(gc間隔時間,gcfrequency in seconds)

注:超過128個沒到512個要清理過期條目;超過512個的條目緩存時長僅5s

[root@node1 vm]# cd /proc/sys/net/ipv4/neigh/default/

[root@node1 default]# cat gc_thresh1

128

[root@node1 default]# cat gc_thresh2

512

[root@node1 default]# cat gc_thresh3

1024

[root@node1 default]# cat gc_interval

30

page cache(主要目的加速讀操作,a large percentage of paging activity is due to I/O,file reads:each pageof file read from disk into memory,these pages form thepage cache):

讀進的檔案若修改,之後要清寫到磁盤上,要将page cache中的内容同步到磁盤,同步有可能要借助buffer完成,有時直接将page cache的内容寫到磁盤,并沒嚴格限定寫必須要使用buffer,讀必須用cache

page cache is always checked for IO requests:

directory reads

reading and writing regular files(普通檔案的r和w,這裡的w是指在page cache中修改,修改完後用回寫政策過一段時間才同步到磁盤上,同步到磁盤上的過程是清寫)

reading and writing via block devicefiles,DISK IO(r和w通過塊裝置的DISK IO實作)

accessing memory mapped files,mmap(為加速使用記憶體映射)

accessing swapped out pages(有時過量記憶體使用會将pages交換到交換記憶體中)

tuning page cache:

vm.lowmem_reserve_ratio(在低端記憶體中為pagecache預留白間的比例,低端記憶體ZONE_DMA和ZONE_NORMAL那段,在64bitOS上此參數不用調)

vm.vfs_cache_pressure(虛拟FS的緩存pressure,核心回收dentries和inodes的緩存對象,為加速通路檔案這些緩存空間不應該回收,預設值100,0(不回收dentries和inodes),1-99(傾向于不回收),100(傾向于page cache和swap cache相同時,試圖回收dentries和inodes),100以上(傾向于回收dentries和inodes))

vm.page-cluster(頁簇,實體記憶體中一次拿多少個頁面到交換記憶體中,1表示2^1,2表示2^2,預設是3,8個,一般系統若要大量使用交換分區時調大此值才有意義,一般最大調為4,可獲得稍微性能提升,不要再大于4,在雲計算場景和虛拟機環境常用此參數(在一個實體機上運作多個虛拟機,虛拟機的記憶體很有可能超出實體記憶體,要頻繁使用交換記憶體))

vm.zone_reclaim_mode(此項用的很少,現在都用64bitOS考慮區域的場景很少見,傾向于回收哪個區域的模型,1(表示區域回收功能開啟,由核心自行決定如何回收),2(回收寫操作産生的髒頁,髒頁同步到磁盤即回收回來),4(回收swaps pages)

[root@node1 ~]# cat /proc/sys/vm/lowmem_reserve_ratio

256  256  32

[root@node1 ~]# cat /proc/sys/vm/vfs_cache_pressure

100

[root@node1 ~]# cat /proc/sys/vm/page-cluster

3

anonymous pages:

Anonymous pages=RSS-shared(實際記憶體集-共享記憶體集),匿名頁占據的空間不能被交換出

匿名頁中通常不是檔案内容(檔案打開後放在page cache中),包含資料有:

program data-arrays,heap allocations,etc(程式自身産生的資料)

anonymous memory regions(匿名記憶體區域,有些區域無法全名不友善引用)

dirty memory mapped process private pages(髒記憶體頁面映射為程序私有頁面)

IPC shared memory region pages(程序間通信的記憶體區域頁面)

注:IPC有三種:基于信号semaphores方式,基于共享記憶體shm(僅兩個程序通信時才使用此種方式,程序間通信也有參數需要調),基于消息隊列message queues)

[root@node1 ~]# grep Anon /proc/meminfo

AnonPages:         17496 kB

AnonHugePages:         0 kB

[root@node1 ~]# cat /proc/7359/statm

43371 598 158 84 0 403 0

IPC調優(shared memory、messages、semaphores):

[root@node1 ~]# man ipc(System V IPCsystem calls)

[root@node1 ~]# man ipcmk(createvarious ipc resources)

[root@node1 ~]# man ipcrm(remove amessage queue, semaphore set or shared memory id,萬一某個IPC睡眠了,喚醒不了卡死了,使用這個指令移除)

[root@node1 ~]# man ipcs(provideinformation on ipc facilities)

[root@node1 ~]# ipcs -h

ipcs provides information on ipc facilitiesfor which you have read access.

Resource Specification:

         -m: shared_mem

         -q: messages

         -s: semaphores

         -a: all (default)

Output Format:

         -t: time

         -p: pid

         -c: creator

         -l: limits

         -u: summary

-i id [-s -q -m] : details on resourceidentified by id

usage : ipcs -asmq -tclup

         ipcs[-s -m -q] -i id

         ipcs-h for help.

[root@node1 ~]#ipcs –l(-a,all預設,-s,shm,-q,messages,-s,semaphores)

------ Shared Memory Limits --------

max number of segments = 4096

max seg size (kbytes) = 67108864

max total shared memory (kbytes) =17179869184

min seg size (bytes) = 1

------ Semaphore Limits --------

max number of arrays = 128

max semaphores per array = 250

max semaphores system wide = 32000

max ops per semop call = 32

semaphore max value = 32767

------ Messages: Limits --------

max queues system wide = 454

max size of message (bytes) = 65536

default max size of queue (bytes) = 65536

關于shm:

kernel.shmmni(在全系統範圍内最大允許使用多少個共享記憶體段,經常用,尤其在資料庫server上,default4096,機關byte,定義系統級别所允許使用的共享記憶體段上限,有時有點少)

kernel.shmall(系統級别一次性可使用的最大共享記憶體頁面數,能夠為共享記憶體配置設定使用的最大頁面數,預設2097152,機關byte,this should be at least kernel.shmmax/page_size)

kernel.shmmax(單個共享記憶體段的上限,以位元組為機關建立)

關于messages:

kernel.msgmni(系統級别,消息隊列個數的上限,預設16)

kernel.msgmnb(單個消息隊列的上限,機關byte,預設16384)

kernel.msgmax(單個消息大小的上限,機關byte,預設8192)

注:通過#ipcs –p PID檢視某一個應用的shm和messages的大小,一旦發現不夠用将其調大,shm和messages一般都是将其調大

[root@node1 ~]# cat /proc/sys/kernel/shmmni

4096

[root@node1 ~]# cat /proc/sys/kernel/shmall

4294967296

[root@node1 ~]# cat /proc/sys/kernel/shmmax

68719476736

[root@node1 ~]# cat /proc/sys/kernel/msgmni

454

[root@node1 ~]# cat /proc/sys/kernel/msgmnb

65536

[root@node1 ~]# cat /proc/sys/kernel/msgmax

[root@node1 ~]# free –m(Display amount of free and used memory in the system,-m,megabytes)

            total       used       free    shared    buffers     cached

Mem:           230        172         58          0         15         86

-/+ buffers/cache:         70        160

Swap:         3999         11       3988

<a href="http://s3.51cto.com/wyfs02/M02/7D/29/wKioL1bhKu-zsP0gAACB5esDL_o958.jpg" target="_blank"></a>

[root@node1 ~]# cat /proc/vmstat(page tables)

nr_free_pages 14864

nr_inactive_anon 1870

nr_active_anon 1384

nr_inactive_file 13112

nr_active_file 12958

nr_unevictable 0

nr_mlock 0

nr_anon_pages 2975

nr_mapped 2075

nr_file_pages 26729

[root@node1 ~]# cat /proc/meminfo(systemmemory,total physical memory,memory being used by caches,active(in use),inactive)

MemTotal:         236380 kB

MemFree:           59508 kB

Buffers:           15856 kB

Cached:            88532 kB

SwapCached:         2536 kB

Active:            57368 kB

Inactive:          59932 kB

Active(anon):       5536 kB

Inactive(anon):     7480 kB

[root@node1 ~]# vmstat –s(summary,或使用#sar –r 110,report memory and swap space utilization statistics)

      236380  total memory

      176932  used memory

       57368  active memory

       59976  inactive memory

       59448  free memory

       15888  buffer memory

       88532  swap cache

     4095992  total swap

       11616  used swap

     4084376  free swap

        9201 non-nice user cpu ticks

           0 nice user cpu ticks

       14459 system cpu ticks

     6857440 idle cpu ticks

       18395 IO-wait cpu ticks

          40 IRQ cpu ticks

        3869 softirq cpu ticks

           0 stolen cpu ticks

      581699 pages paged in

      188630 pages paged out

       19041 pages swapped in

       20108 pages swapped out

     1029952 interrupts

      791138 CPU context switches

  1452896188 boot time

        8230 forks

[root@node1 ~]# vmstat –a(switchdisplays active/inactive memory)

procs -----------memory---------- ---swap-------io---- --system-- -----cpu-----

 r b   swpd   free inact active   si   so   bi    bo   in  cs us sy id wa st

 0 0  11616  59216 60048  57420    1   1     8     3  15   11  0  099  0 0

pdflush清寫記憶體的dirty page到磁盤上,預設最少2個pdflush線程,一般1個磁盤要有1個pdflush線程

vm.nr_pdflush_threads(顯示目前pdflush線程的個數,redhat6會自動管理pdflush的線程數)

[root@node1 ~]# cat/proc/sys/vm/nr_pdflush_threads

tuning pdflush:

vm.dirty_background_ratio(髒頁占總記憶體多大比例啟用pdflush開始清寫,可了解為是觸發條件)

vm.dirty_ratio(單個程序的髒頁占總記憶體多大比例啟用pdflush開始清寫)

vm.dirty_bytes(一般都用ratio來控制,很少用bytes控制)

vm.dirty_expire_centisecs(每隔多長時間啟用pdflush一次,機關百分之一秒,0表示禁止)

vm.dirty_writeback_centisecs(已很長時間的髒頁啟用pdflush清寫到磁盤)

[root@node1 ~]# cat /proc/sys/vm/dirty_background_ratio

10

[root@node1 ~]# cat /proc/sys/vm/dirty_ratio

20

[root@node1 ~]# cat /proc/sys/vm/dirty_bytes

[root@node1 ~]# cat /proc/sys/vm/dirty_expire_centisecs

3000

[root@node1 ~]# cat /proc/sys/vm/dirty_writeback_centisecs

500

reclaiming clean pages(回收幹淨頁):

[root@node1 ~]# sync

[root@node1 ~]# echo s &gt; /proc/sysrq-trigger(手動清寫髒緩沖和緩存,清寫完後就回收了,/proc/sysrq-trigger系統級别資源管理的觸發器)

[root@node1 ~]# free

            total       used       free    shared    buffers     cached

Mem:       236380      80300    156080          0        108       8620

-/+ buffers/cache:      71572    164808

Swap:     4095992      11616    4084376

[root@node1 ~]# sync

[root@node1 ~]# echo 1 &gt; /proc/sys/vm/drop_caches(1,to free pagecache;2,to free dentries and inodes;3,to free pagecache denties and inodes)

[root@node1 ~]# free(上步隻釋放了pagecache,在cache中仍有内容與slaballocator有關)

Mem:       236380      80300     156080          0         92      8616

-/+ buffers/cache:      71592    164788

out of memory killer:

一旦記憶體耗盡會啟動OOM killer,實作把非常消耗記憶體的程序殺死,以騰出記憶體空間

/proc/PID/oom_score(誰的分數高,誰就優先被殺,分數範圍-16-17,此分數是參照/proc/PID/oom_adj核心自動計算得來;在ZONE_NORMAL區域中沒有可用的空間時會啟動OOM killer,意味着記憶體耗盡)

/proc/PID/oom_adj(該值為-17-15,有效範圍-16-15,用于得出oom_score的标準,該值越大oom_score就越大,越容易被殺死,-17表示該程序無論任何時候都不會被kill掉,可将重要的服務設為-17避免被kill)

32bitOS,ZONE_HIGHMEM這段是超出1G的段,而在ZONE_NORMAL段中隻要記憶體耗盡無論ZONE_HIGHMEM中有無内容就會啟動OOMkiller,64bitOS除ZONE_DMA都是ZONE_NORMAL

[root@node1 ~]# cat /proc/sys/vm/panic_on_oom(0表示啟用,一旦記憶體耗盡就使用OOM killer,1禁用)

detecting memory leaks(探測記憶體洩露):

記憶體分出去了,别人不用了卻釋放不了,始終處于被使用狀态,洩露的多了最後OOM,有些程式員寫的程式有memory leaks很正常

#valgrind(此指令有很多子指令,是指令也是包名)

[root@node1 ~]# man valgrind(a suite oftools for debugging and profiling programs)

#valgrind [valgrind-options] [your-program][your-program-options]

--tool=&lt;toolname&gt; [default: memcheck]

  Runthe Valgrind tool called toolname, e.g. Memcheck, Cachegrind, etc.

[root@node1 ~]# valgrind --tool=memcheck cat /proc/$$/maps($$表示目前程序,memcheck表示子元件名稱,注意以下紅色字型)

==8438== Memcheck, a memory error detector

==8438== Copyright (C) 2002-2012, and GNUGPL'd, by Julian Seward et al.

==8438== Using Valgrind-3.8.1 and LibVEX;rerun with -h for copyright info

==8438== Command: cat /proc/7919/maps

==8438==

00400000-004d4000 r-xp 00000000 fd:00137982                            /bin/bash

006d3000-006dd000 rw-p 000d3000 fd:00137982                            /bin/bash

006dd000-006e2000 rw-p 00000000 00:00 0

7fce2cff7000-7fce2cff8000 rw-p 0000000000:00 0

7fffe97f7000-7fffe980c000 rw-p 0000000000:00 0                          [stack]

7fffe991b000-7fffe991c000 r-xp 0000000000:00 0                          [vdso]

ffffffffff600000-ffffffffff601000 r-xp00000000 00:00 0                 [vsyscall]

==8438== HEAPSUMMARY:

==8438==    in use at exit: 0 bytes in 0 blocks

==8438==  total heap usage: 31 allocs, 31 frees, 40,552 bytes allocated

==8438== All heap blockswere freed -- no leaks are possible

==8438== For counts of detected andsuppressed errors, rerun with: -v

==8438== ERROR SUMMARY: 0errors from 0 contexts (suppressed: 6 from 6)

[root@node1 ~]# watch -n 1 'ps axo pid,comm,rss,vsize | grep httpd'(若rss和vsize隻增不減就很可能記憶體洩露,rss,resident setsize别名rsz,vsize,virtual memory size of the process in KB)

[root@node1 ~]# sar -R 1 120(-R,Report memory statistics,檢視系統範圍内整體記憶體的配置設定情況,若記憶體隻往外配置設定沒有釋放,或配置設定的多釋放的少,也意味着memory leaks,要長期觀察)

what is swap:

swap out(從系統寫到swap交換分區上)

swap in(從swap交換分區讀資料進來)

inactive pages非活動頁和anonymous pages匿名頁可被swapped(通常都是inactive pages)

swap cache(從swap in讀進來的頁面未做修改,在多個程序通路同一頁框時可避免資源競争,多個程序可從swap cache中讀一個資源)

improving swap performace:

(1)frequent small swaps,swap anonymous pages more readily(使用swap小分區,也可将anonymous pages交換出去)

注:anonymous pages(使用者模式下的标準棧或使用mmap匿名映射的記憶體區)

(2)reduce visit count(降低或不使用swap,增大實體記憶體最有效,有多塊磁盤劃分多個swap分區)

(3)reduce service time(或不得不使用,降低服務時間,使用快速裝置SSD盤,SSD用作cache server還行用做swap分區就奢侈了,或将swap分區置于硬碟最外道的分區上)

注:若有多塊磁盤,使用多個交換分區(或僅一塊盤就不必劃分多個swap分區,除增大尋址時間并無益處),每塊磁盤上都劃分一個交換分區,同時将優先級調為一緻,當系統往交換分區上交換資料時類似LB似的會輪流使用,這可有效降低每個分裝置的通路次數,若某塊磁盤較慢可将此塊盤swap分區的優先級降低

tuning swappiness:

vm.swappiness(預設不交換匿名頁,若要交換匿名頁調整此項,調大傾向于交換,預設60,此項是個調整參數,映射到頁表中的記憶體大小占整個記憶體的百分比大于等于100時就啟用交換記憶體,對性能要求高的場景應調小此值,調大此值是讓記憶體有更大空間可用,若記憶體不夠用将anonymous pages交換出去可提高性能,page cache具有多次被通路的可能性)

注:% of memory mapped into page tables + vm.swappiness &gt;=100

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

60

tuning swap size:

up to 4*RAM(batch compute server運作科學計算的場景)

&lt;=1G(資料庫server)

&gt;=0.5*RAM(application server)

tuning swap for think time:

vm.page_cluster(可一次性一批交換多點)

tuning swap visit count:

#mkswap [-L  SWAP_LABEL]  /PATH/TO/DEVICE

#vim /etc/fstab

/dev/sda1 swap  swap  pri=5 0  0

/dev/sdb1 swap  swap  pri=5 0  0

LABEL=testswap  swap swap  pri=5  0  0

/swap/swapfile1  swap swap  pri=5  0  0

#swapon -a

monitoring memory usage:

(1)      memroy activity:

[root@node1 ~]# vmstat -n 1 3(The -n switch causes the header to be displayed only once ratherthan periodically)

 r b   swpd   free  buff  cache   si  so    bi    bo  in   cs us sy id wa st

 1 0  11616 137804   5176 21640    1    1     7    2   14   11 0  0 99  0  0  

 0 0  11616 137780   5176 21668    0    0    0     0   25  24  0  0 100 0  0         

 0 0  11616 137780   5176 21668    0    0    0     0   20  17  0  0 100 0  0         

[root@node1 ~]# sar -r 1 3(-r,Report memory utilization statistics)

Linux 2.6.32-358.el6.x86_64(node1.magedu.com)       2016年01月16日        _x86_64_          (2CPU)

17時50分47秒 kbmemfreekbmemused  %memused kbbuffers  kbcached kbcommit   %commit

17時50分48秒    137608    98772     41.79      5192    21668    142776      3.30

17時50分49秒    137592    98788     41.79      5192    21668    142776      3.30

17時50分50秒    137592    98788     41.79      5192    21668    142776      3.30

平均時間:    137597     98783    41.79      5192     21668   142776      3.30

[root@node1 ~]# dstat 1 3

----total-cpu-usage---- -dsk/total--net/total- ---paging-- ---system--

usr sys idl wai hiq siq| read  writ| recv send|  in   out | int  csw

 0   0  99  0   0   0| 14k 4735B|   0     0 |1867B 1972B|  28   22

 0   0 100   0  0   0|   0    0 |  60B  842B|  0     0 |  27   19

 0   0 100   0  0   0|   0    0 |  60B  346B|  0     0 |  20   17

 0   0 100   0  0   0|   0    0 |  60B  346B|  0     0 |  25   20

[root@node1 ~]# dstat -m 1 3

------memory-usage-----

 used buff  cach  free

73.8M 5844k 23.6M  128M

[root@node1 ~]# dstat -s 1 3

----swap---

 used free

  11M3989M

rate of change in memory:

[root@node1 ~]# sar -R 1 3

17時56分02秒   frmpg/s  bufpg/s   campg/s

17時56分03秒    -15.15     0.00      0.00

17時56分04秒      0.00     0.00      0.00

17時56分05秒      0.00     0.00      0.00

平均時間:     -5.02      0.00     0.00

swap activity:

[root@node1 ~]# sar -w 1 3(-w,Report task creation and system switching activity)

17時56分50秒    proc/s  cswch/s

17時56分51秒      0.00    19.00

17時56分52秒      0.00    24.24

17時56分53秒      0.00    20.79

平均時間:      0.00     21.33

all IO:

[root@node1 ~]# sar -B 1 3(-B,Report  paging statistics)

17時58分16秒  pgpgin/s pgpgout/s   fault/s majflt/s  pgfree/s pgscank/spgscand/s pgsteal/s    %vmeff

17時58分17秒      0.00     0.00     35.00      0.00    70.00      0.00      0.00     0.00      0.00

17時58分18秒      0.00     0.00     39.39      0.00    70.71      0.00      0.00     0.00      0.00

17時58分19秒      0.00    24.00     34.00      0.00    71.00      0.00      0.00     0.00      0.00

平均時間:      0.00      8.03    36.12      0.00     70.57     0.00      0.00      0.00     0.00

注:完成記憶體配置設定的申請、釋放由slab allocator和buddy allocator

将線性位址映射到實體位址是MMU

pdflush會每隔一段時間清寫實體記憶體的資料到磁盤

kswapd監控到交換記憶體的換進換出

注:hugepage、oom、IPC、pdflush、slab、swap

disk:

IO scheduler(/sys/&lt;block_device&gt;/queue/scheduler):

CFQ(complete fair queue,預設)

deadline(最後期限排程)

NOOP(no operation)

anticipatory(期望,讀這個資料之後會等待幾ms讀後面的資料,适合順序讀寫多的場景)

memory:

MMU(memory managementunit;TLB,translation lookaside buffer,緩存MMU轉換的結果,使用hugetlbfs(hugepages),MMU是晶片,TLB也是記憶體的一緩存晶片)

vm.swappiness=#(預設60,使用交換分區的傾向性,數越小不使用,越大越傾向使用,此項是調整參數,page tables+vm.swappiness&gt;=100)

overcommit_memory=0,1,2(生産環境中控制記憶體過量使用,0啟發式過量,1總是過量,2所有實體記憶體加一部分swap記憶體可超出指定百分比)

overcommit_ratio(預設50,overcommit_memory=2時此項才有意義,可使用記憶體=swap+RAM*overcommit_ratio,舉例如下)

舉例:swap:4G,RAM:8G,overcommit_ratio=50,則可使用記憶體8G

swap:4G,RAM:4G,overcommit_ratio=50,則可使用記憶體6G

swap:2G,RAM:8G,overcommit_ratio=50,則可使用記憶體6G

一般swap是ram的一半,可儲存記憶體充分使用,要想100%的使用實體記憶體,方法一:swap跟RAM一樣大,vm.swappiness=0;方法二:overcommit_memory=2,overcommit_ratio=100,vm.swappiness=0

networking:

/proc/sys/net/ipv4:

tcp_mem(tcp socket緩沖大小,包括接收緩沖和發送緩沖)

tcp_rmem(接收緩沖)

tcp_wmem(發送緩沖)

tcp_fin_timeout

tcp_max_tw_buckets(儲存系統處于timeout狀态的連接配接個數,隻能調大)

/proc/sys/net/core:

rmem_max

rmem_default

wmem_max

wmem_default

IPC:

shm(/proc/sys/kernel/{shmmni,shmall,shmmax})

messages(/proc/sys/kernel/{msgmni,msgmnb,msgmax}

常用指令:

top,free,iostat,sar,dstat,mpstat,iotop,vmstat,uptime,netstat,strace,lsof,blktrace,blkparse,btt,time,ss,perf,dd,iozone,io-stress,fio

本文轉自 chaijowin 51CTO部落格,原文連結:http://blog.51cto.com/jowin/1749628,如需轉載請自行聯系原作者

繼續閱讀