天天看點

linux系統調優一

計算機的四個子系統:

 cpu子系統

 記憶體子系統

 IO子系統(儲存設備)

 網絡子系統

調整的方向:

 縱向調整:

  在單機的基礎上進行調整:

    調整軟體,調整軟體配置參數,改變運作參數

    調整硬體:更換硬體

 橫向調整

  使用更多的機器完成同一個任務---叢集

CPU

# cat /proc/cpuinfo

# dmidecode --type processor

# dmidecode --type cache

 中斷 --- 裝置通知核心,完成一次資料處理過程。

  往往是IO裝置産生的,網絡裝置産生。

 核心處理過程---控制優先級、任務(程序)排程

 使用者程序

 上下文切換

  核心在做任務排程的時候,調整了任務優先級,這意味着cpu會平凡中斷去執行其他優先級更高的程式。

 運作隊列(系統負載)uptime

平均負載:

背景1:單核心的cpu

load average: 1.43, 3.43, 5.43

 過去的1分鐘、5分鐘、15分鐘平均負載分别是1.43,3.43,5.43.

 以過去的15分鐘為例子,表明,在過去的15分鐘裡,cpu的運作隊列平均長度為5.43,也就意味這,平均有5.43個程序在隊列中排隊等待cpu處理,在5.43個程序中,有一個程序是正在被處理,4.43個程序在等候處理。

背景2:雙核心的cpu

load average: 1.43, 3.43, 5.42 

 以過去的15分鐘為例子,表明,在過去的15分鐘裡,cpu的運作隊列平均長度為5.43,但是由于有兩個核心,也就意味着,平均每個核心的cpu有2.71個程序在隊列中排隊等待cpu處理,在5.43個程序中,有2個程序是正在被處理,3.42個程序在等候處理,平均每個核心有(2.71-1)=1.71個程序在等候處理。

經驗:

 每個核心平均負載如果大于等于3(1+2)就應該注意。如果再大的話,說明cpu很忙,有很多程序在排隊。

 cpu使用率

  使用者程序us , 使用者執行的程式

  核心排程sy , 核心進行排程(進行中斷,進行上下文切換)

  空閑 id

  等待io  wa

top - 11:30:05 up  1:19,  5 users,  load average: 0.77, 0.88, 0.70

Tasks: 154 total,   1 running, 152 sleeping,   0 stopped,   1 zombie

Cpu(s): 20.6%us,  0.2%sy,  0.0%ni, 78.9%id,  0.0%wa,  0.2%hi,  0.2%si,  0.0%

 vmstat,top,uptime,mpstat,dstat,sar -u / -q

# vmstat 2 3

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 1122176  81516 413056    0    0    47    13  573  288 21  1 76  1  0

 0  0      0 1122052  81516 413056    0    0     0     0 1051  399 20  0 81  0  0

 0  0      0 1122300  81516 413088    0    0     0     0 1127  504 19  0 80

與cpu相關的參數輸出

procs  --system-- -----cpu------

 r  b  in   cs    us sy id wa st

 0  0  573  288   21  1 76  1  0

 0  0  1051  399  20  0 81  0  0

 0  0  1127  504  19  0 80  0  0

r  ---> running ,就是相當于uptime的負載(運作隊列)

  如果是單核心,數字超過3,就應該注意。

b  ---> block ,被阻塞的程序。往往由于程序在等待外部資源。

  一般不應該>0,有的話,一般都說明某個程序由于某種原因被阻塞。就應該去關心一下原因。

in ---> 中斷數,中斷數越高,一般說明核心在頻繁地進行任務排程,但更着重與IO裝置産生的中斷。

cs ---> 上下文切換 ,數字越高,說明很多個不同的程序之間在競争cpu資源。

us:sy的百分比應該是 7:3  <---應該花更多cpu資源在使用者程序上。

wa  如果數字比較大,一般說明由程序在讀寫磁盤資料,或者接受網絡資料,程序被阻塞

跟蹤活躍程序

# strace -F -p 3265

跟蹤某個準備執行的程序

# strace  -F ping -c 1 www.upl.com

# mpstat -P ALL 2

# sar -u

# sar -q 2 5

=============================================================

 @記憶體子系統調優

  虛拟記憶體

  記憶體頁

  記憶體分頁(paging)--核心就必須經常掃描記憶體空間并且收回其中未被使用的記憶體頁,把資料同步到硬碟

   kswapd

   pdflush 程序負責将記憶體中的内容和檔案系統進行同步操

# free -m

             total       used       free     shared    buffers     cached

Mem:          2001        926       1074          0         86        411

-/+ buffers/cache:        428       1572

Swap:         2047          0       2047

buffers

 主要是緩存磁盤塊的資料,檔案描述符

cached

 主要是檔案系統緩存。

 vmstat , time , sar -B ,free

-----------memory---------- ---swap-- -----io----

 swpd   free   buff  cache   si   so    bi    bo

  0  1099740  89324 420868    0    0    13     5

  0  1099368  89324 420868    0    0     0     0

  0  1099400  89324 420868    0    0     0     0

si  <--- 從swap讀取資料加載到記憶體(in到記憶體)

so  <--- 從記憶體中把資料寫到swap(從記憶體中out出去)

判斷記憶體是否足夠,隻需要簡單地判斷是否使用了交換分區,是否頻繁使用交換分區。

首頁面故障

 程式在執行的時候需要的資料在記憶體中沒有直接得到,需要從外設中讀取,就算發生首頁面故障。

次頁面故障

 程式在執行的時候需要的資料在記憶體中直接得到,不需要從外設中讀取,就算發生次頁面故障。

 系統總是使用各種緩存,緩沖的技術來減少首頁面故障,增加次頁面故障。

        Major (requiring I/O) page faults: 0 首頁面故障

        Minor (reclaiming a frame) page faults: 222 次頁面故障

# procinfo -n 2 可以檢視頁面調進和調出

  如果大量的page in 和page out 隻能說明目前記憶體使用比較活躍

  如果有大量swap in 和 swap out 說明記憶體不足

# sar -B 2 3

Linux 2.6.18-274.el5 (www.upl.com)      2012年07月02日

16時03分17秒  pgpgin/s pgpgout/s   fault/s  majflt/s

16時03分19秒      0.00     52.00     25.00      0.00

16時03分21秒      0.00      0.00     13.50      0.00

16時03分23秒      0.00     21.89    183.58      0.00

Average:         0.00     24.63     74.21      0.00

 案例資料分析

=====================================

 @IO子系統調優

  IOPS計算

   每秒完成的IO數量

  IO吞吐量計算

   機關時間内,平均每個IO完成的資料量

  IO分類

   随機IO

   連續IO 

  磁盤的轉速

   scsi 硬碟 320M/s

    10K  IOPS:120-150

    15K  IOPS:150-200

   ssd 固态硬碟 

iostat指令

# iostat -k -d sda 2

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn

sda               2.40        22.11         9.09     492465     202455

tps 過去的時間内平均每秒完成了多少個IO

kB_read/s 平均每秒讀取多少KB的資料

kB_read 過去的時間内讀取了多少資料

測試某個裝置的寫入速度:

# mount -o sync /dev/sda8  /mnt

# dd if=/dev/zero of=/mnt/1G  bs=1M count=1024

1024+0 records in

1024+0 records out

1073741824 bytes (1.1 GB) copied, 18.8142 seconds, 57.1 MB/s

# iostat -m -d sda8 2

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn

sda8             94.50         0.01        45.02          0         90

sda8            125.50         0.00        62.00          0        124

sda8            133.00         0.00        66.00          0        132

# iostat -x -k -d sda 2

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util

sda               0.66    25.91  1.68  1.06    21.71   107.89    94.70     0.13   46.32   2.73   0.75

sda               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

rrqm/s 平均每秒合并的讀請求

r/s 平均每秒讀IO的數量

avgrq-sz 平均每個請求涉及到多少扇區的資料《--IO吞吐量

avgqu-sz 平均IO隊列的長度

%util  裝置的帶寬的使用百分比。數字越高,說明磁盤越盡力去讀寫資料。

  優化手段:分區、塊大小,進階檔案系統e4fsprogs,檔案系統挂載,IO算法

# yum install e4fsprogs.x86_64

# mkfs.ext4  /dev/sda8  

# mkfs.ext4  -b 4096 /dev/sda8