CPU及內存調優

# 進程類別
	交互式進程(I/O)
	批處理進程(CPU)
	實時進程(Real-time)
	
	CPU密集型:分配時間片長,優先級低
    IO密集型:時間片短,優先級高
    
Linux優先級:priority
	實時優先級:1-99,數字越小,優先級越低;
	靜態優先級:100-139,數字越小,優先級越高; nice值得範圍-20~19分別對應於優先級得100~139
		實時優先級比靜態優先級高

ps -e -o class,rtprio,pri,nice,cmd # 以下圖1
	-e:顯示和終端相關和無關的進程
	-o:表示自定義顯示的字段
	class:調度類別
	rptprio:實時優先級
	pri:優先級(靜態優先級)
	nice:nice值,調整靜態優先級的
	cmd:啓動進程的命令 

調度類別:
	實時進程:
		SCHED_FIFO:First In First Out
		SCHED_RR:Round Robin
		SCHED_Other:用來調度100~139之間的進程

動態優先級:
	dynamic prioruty = max(100,min(static priority - bonus + 5,139))
		bonus:0~10
		
手動調整優先級:
	100~139:nice
		nice:
			nice N COMMNAD
		renice:
			renice -n # PID
		
		chrt -p [prio] PID # 也能夠調整用戶空間的100~139進程的優先級
		
	1~99:
        chrt [options] -p [prio] pid
            options:
                -f:FIFO
                -r:Round Robin
            -p: priority,其後加上優先級參數 
            pid:表明是哪個進程

        chrt -f -p [prio] PID
        chrt -r -p [prio] PID
        
        chrt -f -p [prio] COMMAND # 啓動一個進程,直接指定爲實時優先級

圖1:node

進程的格式:# 以下圖2
	一個進程的內部,在他的線性地址空間裏,從0x000到0xfff,有一段地址空間是不能使用的(32位的系統上,線性地址空間爲4G,有1G是留給內核),在進程本身的地址空間當中,從低地址開始,放的是:
	TEXT:代碼段(指令區),只讀的;
	DATA:有了初始值的變量;
	BSS:初始化爲零的變量;
	HEAP(堆):打開的文件內容都在堆上;
	Stack(棧):函數的參數、函數的返回地址及局部變量、本地變量都在棧當中;# 程序執行過程當中產生的變量都在棧上;
	棧是從高地址空間向低地址空間增加的,而堆是從低地址空間向高地址空間增加的

圖2:ios

CPU調優

cpu訪問本身的內存須要三個時鐘週期,一、CPU通知內存控制器,二、內控制器尋址,三、CPU取內存中的數據和指令;訪問其它內存須要六個時鐘週期,首先訪問本身的內存控制器須要一個,本身的內存控制器和對方內存控制器的通訊須要三個,對方控制器再繼續尋址和讀取數據和指令,須要兩個時鐘週期。。。shell

CPU affinity:CPU的姻親關係,指的是某些進程再啓動之後綁定到指定的CPU上或CPU核心上運行,再也不交叉訪問內存。編程

# report memory and swap space utilization statistics
sar -r [interval] [count]

# rate of change in memory
sar -R [interval] [count] # report memory statistics

# report swapping statistics
sar -W [interval] [count]

# ALL IO
sar -B [interval] [count] # report paging statistics


sar -q # rpm -qf `which sar` ==> sysstat模塊==>rpm -qf sysstat ==> yum install -y systat
sar -q 1 # 每隔一秒鐘查看一次上下文切換(進程切換)的平均次數,若是切換次數多,說明起的進程過多;若是中斷的次數過多,說明外部硬件繁忙。
top
w
uptime

vmstat -n [interval] [count]
vmstat 1 5 

pmstat 1 2
sar -P 1 2 # 每隔2s顯示一次第1號CPU的使用率
iostat -c 1 6
cat /proc/stat  # 查看每個CPU的使用率

dstat
	--top-cpu # 查看哪一個進程最消耗CPU
	--top-mem # 查看哪一個進程最消耗內存
    --top-io # 查看哪一個進程的IO量最大
    -c #  查看CPU使用率

taskset -p -c 0 16386  # 將16386號進程綁定到0號進程上。-p必須再-c前面

通常來說,用戶空間和內核空間CPU的使用率百分比爲:7:3,且CPU的使用率不要長期超過80%,意味着系統比較繁忙,未來有可能會掛掉。

內存常見調優參數

內存子系統組件

slab allocator
buddy system
kswapd
pdflush
mmu

# 啓用大頁面(enable hugepages)
	1. 在/etc/sysctl.conf文件中,添加參數vm.nr_hugepages = n 
	或者:
	2.在操做系統啓動的時候,向內核傳送參數 hugepages = n

# Configure hugetlbfs if needed by application
	mmap system call requires that hugetlbfs is mounted
		mkdir /hugepages
		mount -t hugetlbfs none /hugepages  # none 字段指的是掛載的設備,不用指定任何的設備類型
	shmat and shmget system calls do not require hugetlbfs

strace命令:
	strace COMMAND: 查看命令的syscall
	strace -p PID:查看已經啓動進程的syscall
	
	-c:只輸出其歸納信息;
	-o:將追蹤結果保存至文件中,以供後續分析使用;
	
1.下降微型內存對象的系統開銷,使用slab
	cat /proc/slabinfo
	slabtop
2.縮減慢速子系統的服務時間
	使用buffer cache 緩存文件元數據;
	使用page cache緩存DISK IO;
	使用share memory完成進程間通訊;
	使用buffer cache、arp cache和connection tracking 提高網絡IO性能;

vfs_cache_pressure:
	0:不回收dentries和inodes;
	1-99:傾向於不回收;
	100:傾向性與page cache和swap cache相同;
	100+:傾向於回收;

進程間通訊管理類命令:
	ipcs
	ipcsrm

shm:
	shmani:系統級別,所容許使用的共享內存段上限;
	shmall:系統級別,可以爲共享內存分配使用的最大頁面數;
	shmmax:單個共享內存段的上限;
messages:
	msgmnb:單個消息隊列的上限,單位爲字節;
	msgmni:系統級別,消息隊列個數上限;
	msgmax:單個消息大小的上限,單位爲字節;

手動清寫髒緩存和緩存:
	sync
	echo s > /proc/sysrq-trigger

回收清理頁:
	echo 3 > /proc/sys/vm/drop_caches
		1:釋放緩存頁(pagecache)
		2:釋放dentries(目錄項)和inodes
		3:釋放緩存頁(pagecache)、dentries(目錄項)、inodes。

echo $$ :用於打印當前進程的進程號;

slab allocator和buddy system完成內存的申請、分配和釋放,MMU將線性地址映射爲物理地址,bdflush每隔一段時間清寫Physical Memory中的數據到Disk,kswapd監控頁面到交換內存的換進換出。咱們調控參數就是爲了控制子系統工做。包括:
	HugePage:TLB
	IPC:
	pdflush
	slab
	swap
	oom

yum install -y perf

perf stat
Task-clock-msecs:CPU利用率,該值高,說明程序的多數時間花費在CPU計算上而非IO。
Context-switches:進程切換次數,記錄了程序運行過程當中發生了多少次進程切換,頻繁的進程切換是應該避免的。
Cachae-misses:程序運行過程當中整體的cache利用狀況,若是改制太高,說明程序的cache利用很差。
CPU-migrations:表示進程ti運行過程當中發生了多少次CPU遷移,即被調度器從一個CPU轉移到另外一個CPU上運行。
Cycles:處理器時鐘,一條機器指令可能須要多少cycles。
Instructions:機器指令數目。
IPC:是Instructions/Cycles的比值,該值越大越好,說明程序充分利用了處理器的特性。
Cache-references:cache命中的次數
Cache-misses:cache失效的次數
經過指定-e選項,能夠改變perf stat的缺省事件(能夠經過perf list 來查看),可能會使用-e選項來查看感興趣的特殊的事件。

perf Top
使用perf stat的時候,每每您已經有一個調優的目標,也有些時候,您只是發現系統性能無故降低,並不清楚究竟哪一個進程成爲了貪吃的hog,此時須要一個相似top的命令,列出全部值得懷疑的進程,從中找到須要進一步審查的傢伙,相似法制節目中辦案民警經常作的那樣,經過查看監控錄像從茫茫人海中找到行爲古怪的那些人,而不是到大街上抓住每個人來審問。
Perf Top用於實時顯示當前系統的性能統計信息,該命令主要用來觀察整個系統當前的狀態,好比能夠經過查看該命令的輸出來查看當前系統最好是的內核函數或某個用戶進程。

使用 perf record,解讀report
使用 top 和stat以後,您可能已經大體有數了,要進一步分析,便須要一些粒度更細的信息,好比說您已經判定目標程序計算量較大,也許是由於有些代碼寫的不夠精簡,那麼面對長長的代碼文件,究竟哪幾行代碼須要進一步修改呢?這便須要使用perf record 記錄單個函數級別的統計信息,並使用perf report來顯示統計結果。
您的調優應該將注意力集中到百分比高的熱點代碼片斷上,假如一段代碼只佔用整個程序運行事件的0.1%,即便您將其優化到僅剩一條機器指令,恐怕也只能將總體的程序性能提升0.1%。

Disk:
	IO Scheduler:
		CFQ:徹底公平隊列,
		deadline:最後期限調度
		anticipatory:指望,讀這個數據以後,還會讀這個數據以後的其它數據,會等待幾毫秒,這種等待極可能是白費的,比較適合順序讀寫的場景當中。
		NOOP
		
		# 磁盤的IO調度器,能夠根據須要調節
		/sys/block/<device>/queue/scheduler  
		
Memory:
	MMU:memory management unit ,是一個硬件芯片。
	TLB:緩存MMU轉換的結果,爲了提升TLB的性能,可使用大內存頁。是在硬件中實現的緩存芯片
	
	vm.swapiness={0..100}:咱們知道系統使用交換內存,會下降系統性能,可是當咱們內存不夠用的,系統也不能說就不運行了,這個時候咱們可使用交換內存,而swapiness能夠控制是否在多大程度上傾向將page cache 交換至swap. 這個值越大,使用的傾向性越大。vm.swapiness=0表示物理內存夠用時,不使用交換內存。

	overcommit_memory:過量使用
		0:啓發式過量
		1:老是過量
		2:能夠超出指定百分比
		RAM,swap
	overcommit_ratio:
		當overcommit_memory=2時,overcommit_ratio=50意味着什麼呢?
			表示:swap+RAM*ratio
				例如:
					swap:4G
					RAM:8G
					
					可使用的內存空間爲:4+8*50%=8G

	充分使用物理內存:
		1.swap跟RAM同樣大;swapiness=0(儘可能不使用swap)
		2. overcommit_memory=2,overcommit_ratio=100;
			這樣將使用全部的swap和物理內存(swap+ram),會致使系統性能降低,如何提高呢?咱們能夠再加上 vm.swapiness=0,意味着儘可能不使用swap,這樣ram(物理內存)就可以獲得充分利用。

cd /proc/sys/net/ipv4
	tcp_max_tw_buckets:爲何只能調大,不能調小?此參數用於保存當前系統上處於timewait狀態的會話的個數或者叫鏈接的個數,在斷開TCP鏈接的時候,服務器再沒有收到斷開的請求以前是不可能被清除出去的,不能被清除出去,就只能持有着,只要tw會話不能被斷開或者超時,就意味着tw_buckets就不能騰出來,不能騰出來,其它的斷開鏈接的會話就不能進入TW程序,若是將tcp_max_tw_buckets參數調小,會致使同時持有TW狀態會話的鏈接個數更少,因此增大才有意義,調小會使系統上同時持有多的tw狀態的鏈接個數更小。
	tcp_mem:tcp套接字緩衝區大小,包括接收緩存和發送緩存
	tcp_rmem:TCP套接字的接收緩衝區大小
	tcp_wmem:TCP套接字的發送(寫)緩衝區大小
	tcp_fin_timeout:定義fin狀態標誌超時時長
	
cd /proc/sys/net/core
	# 核心緩衝
	rmem_max:
	wmem_max:
	rmem_default:
	wmem_default:

IPC:進程間通訊的三種方式
	消息(message)
		能夠調節的參數:
			msgmni
			msgmax
			msgmnb
	共享內存(shm:shared memory)
		能夠調節的參數:
			shmall
			shmmax
			shmmni
	somephore:信號

cpu和內存監控的命令:
	sar,dstat,vmstat,mpstat,iostat,top,free,iotop,uptime,cat /proc/meminfo,ss,netstat,lsof(查看進程打開的文件),time(評估一個命令的運行時長,以下圖1), perf(評估整個命令的執行狀況,perf stat,perf top),strace(追蹤每個命令產生的系統調用狀況)

blktrace,blkparse,btt

對文件系統進行壓力測試的工具:
	dd,iozone,io-stress,fio(功能及其強大)


OS能夠說是進程控制器,OS負責協調運行在其上進程的資源的申請。假如咱們的CPU只有一顆,一個進程正在運行,其它的進程就只能等待。


IO端口是讓CPU跟IO設備實現數據交換的,而中斷是讓IO設備通知CPU,它有一個緊急事件須要處理。CPU利用可編程中斷控制器讓每個IO設備註冊使用一箇中斷線上的中斷設備號的。

圖1:api

虛擬化技術

Intel和AMD分別經過EPT(Extended Page Tables)和NPT(Nested Page Tables)爲虛擬化應用提高影子MMU的性能,並經過標記(tagged)TLB來避免虛擬機切換時頻繁清寫(flush)TLB以提升TLB緩存的命中率。
相關文章
相關標籤/搜索