可以從哪些方面進行調優?
CPU子系統
記憶體子系統
IO子系統
網絡子系統
調優的步驟:
确定應用類型
IO密集型:資料庫
CPU密集型:動态頁面的web伺服器
建立基準資料
安裝監控工具
發現問題,發掘原因,調整-->觀察--->調整
調優的準則:
有目的的去調優。
一次隻對一個領域進行調整。
每次隻改一個設定。
建議采用兩種以上性能測試工具。
經驗很重要。
CPU子系統
檢視cpu資訊
# cat /proc/cpuinfo
# dmidecode --type processor
# dmidecode --type cache
中斷 裝置通知核心,完成了一次資料處理過程。也可以了解為:cpu停止下來去執行别的指令。例如:完成一次IO。或者完成一次網絡資料包的發送。
核心處理過程 --- 控制優先級,進行任務排程。
使用者程序
上下文切換
運作隊列
常見cpu性能資料采集工具:
vmstat,top,uptime
mpstat
sar <--systat
# uptime
11:02:04 up 1:21, 2 users, load average: 2, 0.95, 0.97
1核心的cpu
負載中的數字代表目前有多少個任務等待cpu的處理和正在處理
2,代表目前cpu正在處理1個任務,還有3個任務在等待。
4,代表目前cpu正在處理1個任務,還有3個任務在等待。
4核心的cpu
2,其中兩個核心的cpu正在處理兩個任務,沒有任務在等待。
8,四個任務正在被cpu處理,還有四個任務在等待。
一般來說,一個核心的cpu,存在2-3個等待的任務是屬于正常。
# vmstat 2 每2秒鐘采集一下資料
# vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 78112 63432 1519100 0 0 233 18 1906 1190 26 13 59 1 0
1 0 0 78112 63432 1519100 0 0 0 0 4180 1378 33 17 50 0 0
1 0 0 78112 63440 1519092 0 0 0 30 4284 1706 33 17 50 0 0
r 運作隊列。單核cpu,不應該超過3
b 目前被阻塞的程序,一般這些程序都是在等待某些外部資源而被阻塞。>3需要注意,而且一直出現或者經常出現,就更值得注意
in 中斷數。一般代表大量裝置操作成功通知核心。
cs 上下文切換。一般代表任務需要緊急被cpu處理。數字高,隻能說明核心在處分發揮它的任務排程作用。不能簡單通過該數字判斷cpu就出現瓶頸。
us 使用者程序所占用的cpu時間的百分比
sy 核心在進行任務排程所占用的cpu時間的百分比
id cpu空閑所占用的時間百分比.僅僅0不能簡單判斷cpu出現瓶頸,隻能說它被充分被留用。
wa 等待IO所消耗時間百分比
st 被硬體虛拟化的虛拟機所消耗掉的時間百分比
us:sy ~= 7:3
# vmstat 3 5
# mpstat -P ALL 2
# sar -u 檢視cpu相關的曆史資料
# sar -u 2 3
# sar -q 2 3
runq-sz 運作隊列
記憶體子系統
虛拟記憶體
把記憶體上暫時用不到的資料,但不能不用的資料,臨時儲存到磁盤(swap)或者磁盤檔案(虛拟記憶體檔案)中。但需要用到這些資料的時候,就重新從磁盤上讀取到記憶體中。 由核心kswapd程序完成
記憶體頁(page) 預設是4K大小。這是操作記憶體資料的最小基本機關。
記憶體分頁(paging) 核心經常掃描記憶體,如果發現記憶體的空閑空間低于某個值,那麼就會把記憶體上的資料同步到硬碟。這些一般都是曾經打開過的檔案,這些檔案資料加載到記憶體中,然後已經被修改過,現在檔案不再需要讀取,那麼就可以把他們同步到磁盤。由核心pdfulsh程序完成。
# free -m
total used free shared buffers cached
Mem: 2017 1937 79 0 72 1460
-/+ buffers/cache: 405 1612
Swap: 4094 0 4094
buffers
緩沖區 ,用于緩存剛通路過,或者經常被通路的檔案的資料。用于提高系統通路檔案的效率,減少頻繁讀取磁盤檔案。
cached
高速緩存,使用者緩存經常打開的檔案的檔案描述符号(指針)
# vmstat 2 3
1 0 0 78060 75364 1496028 0 0 79 11 303 1178 31 15 53 0 0
1 0 0 78308 75364 1496036 0 0 0 0 4331 1240 32 18 50 0 0
1 0 0 78340 75364 1496036 0 0 0 0 4359 1252 33 19 49 0 0
si 有多少資料從swap讀取到記憶體中
so 有多少資料從記憶體寫到swap分區
bi 有多少資料從塊裝置讀取到記憶體中
bo 有多少資料從記憶體中寫到記憶體中
# /usr/bin/time -v date
...
Major (requiring I/O) page faults: 0 主要頁面故障
Minor (reclaiming a frame) page faults: 204 次要頁面故障
Page size (bytes): 4096 《--記憶體頁為4K
主要頁面故障:
當執行某個程序的時候,程序需要讀取某些資料,而這些資料在cache,buffer(在記憶體中)找不到,就會産生一次主要頁面故障。
次要頁面故障
程序在執行的時候,需要的資料在記憶體中可以找到,就叫做次要頁面故障。
系統為了提高通路效率,總是把資料緩沖起來,以便在記憶體中直接操作資料,減少磁盤的讀寫。其實就是一個盡可能減少主要頁面故障,增加次要頁面故障的過程
# /usr/bin/time -v command ...
對比主,次頁面故障的數值,如果發現首頁面故障在第二次之後會減少,說明系統緩存了相關資料。
# sar -B 2 3
14時34分52秒 pgpgin/s pgpgout/s fault/s majflt/s
14時34分54秒 0.00 21.89 25.87 0.00
14時34分56秒 0.00 0.00 12.50 0.00
14時34分58秒 0.00 0.00 229.70 0.00
Average: 0.00 7.30 89.72 0.00
模拟實驗:
工具: mem.php
原理:大量讀取檔案,把檔案資料儲存在記憶體。
# ab -c 30 -n 2000 http://10.1.1.22:8080/test/mem.php
IO子系統調優
vmstat,iostat,sar
IO,輸出輸入。
一個IO,指的是從磁盤把資料讀出來或者把資料寫磁盤上,就稱之為一個IO。
IOPS 每秒鐘完成多少個IO
10k RPM <--每分鐘一萬轉,120 IOPS
15 RPM <--每分鐘15000轉, 150-200 IOPS
# iostat 2
# iostat -x -d sda2 2 3
Linux 2.6.18-164.el5 (dev.upl.com) 2011年09月01日
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda2 18.33 9.57 12.16 5.83 891.33 123.20 56.38 0.26 14.26 2.81 5.05
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
r/s 每秒完成多少個讀IO
w/s 每秒完成多少個寫IO
rsec/s 每秒讀取了多少扇區的資料。 一個扇區=512位元組資料
wsec/s 每秒寫了多少扇區的資料。
avgrq-sz 跟upload中負載一樣的概念
await
平均完成IO需要等待多少時間, 包含服務時間,還有在隊列中等待的時間。
svctm
服務時間,從IO請求産生到,完成IO的時間。
%util
磁盤帶寬使用百分比。如果一直都是100%,說明磁盤很忙。
# iostat
avg-cpu: %user %nice %system %iowait %steal %idle
23.93 0.00 12.12 1.33 0.00 62.62
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 10.15 445.94 84.03 646864 121890
sda1 0.06 1.01 0.02 1468 26
sda2 9.88 438.18 83.59 635602 121248
sda3 0.02 0.75 0.00 1086 0
tps 每秒傳輸量(包括讀IO和寫IO)
Blk_read/s = rsec/s Blk=1扇區
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdb1 0.96 75.75 87.42 36.08 1624.72 894.63 20.40 1.50 12.18 3.98 49.15
如何計算每秒鐘讀寫多少KB資料?
1624.72 x 512 / 1024 = 812KB資料
如何計算每個IO能夠讀寫多少KB資料?
每秒讀取的資料/每秒的IO數量 = 812 / 87 = 9.33
IO的類型:
随機IO
一般的硬碟處理效率最慢的就是随機IO。每個IO完成的資料量非常低。
順序IO
這些IO涉及資料都是連續存放在磁盤上。
基本的IO優化:
1、優化分區
把頻繁讀取的資料應該放在最外層的分區。
2、檔案系統的優化
取消通路時間更新的功能
mount -o noatime /dev/sda3 /web