1. 程式人生 > >Linux效能調優指南

Linux效能調優指南

在很久以前,就對效能調優有非常濃厚的興趣。雖然之前也在做過一些效能調優的工作,但是主要集中在程式碼層面,以及業務層面。對如何從Linux作業系統方面進行調優,一直都沒有一個清晰的認識。不過,最近偶然發現了一本IBM出的Linux調優指南,於是就拜讀了一下。

讀完一些之後,就發現這本書確實就是我所需要的一本書。

雖然之前讀過一些關於作業系統的書籍,但是並不懂如何把它們應用到效能調優中。而從網上看到的一些關於效能調優的文章,也主要是集中在檢測並發現效能瓶頸這些我們早就清楚的內容。對於發現瓶頸之後,如何調優,從哪些方面進行調優,這背後的原理是什麼,為什麼要這麼調優,卻沒有詳細的說明。

而這本書恰恰彌補了這個空缺。彌補了作業系統高層理論以及底層調優之間的空缺。我們熟悉的作業系統,以及計算機網路,他們的處理過程,都是一些可以優化的點。

這本書,其實稱為指南更合適。從CPU,記憶體,IO,計算機網路等方面,一一為我們展示了優化的過程。

這本指南也不厚,大概只有160頁。內容不多,非常精簡。同時也造成了一個缺點,就是,很多內容並不能全面鋪開。

但是感覺用這本指南來進入效能調優的世界,還是綽綽有餘的。

這本指南的名稱是,《Linux Performance and Tuning Guidelines》

這篇文章,便是我在讀完這本指南的時候,摘錄的一些筆記。

CPU方面

處理器指標

  • CPU使用率: 每個處理器的利用率
  • user time: CPU執行使用者程式碼的時間,包括nice time
  • system time: CPU執行核心程式碼的時間,包括IRQ和softirq time
  • waiting: CPU等待IO的時間
  • Idle time: CPU空閒並等待任務的時間
  • nice time: CPU花在改變程序優先順序以及執行順序的時間
  • load average: 任務佇列中,等待被CPU執行的任務的總數,以及那些等待不可中斷任務完成的任務的總數,它們的平均值。也就是,系統中處於TASK_RUNNABLE以及TASK_UNINTERRUPTIBLE狀態的任務的總數的平均值。
  • Runnable process: 等待被CPU執行的任務的總數
  • Blocked: 那些因為IO操作被掛起的程序的數量
  • Context switch: 系統中執行緒切換的總數。
  • Interrupt: 硬中斷和軟中斷的次數。

消除CPU瓶頸的方法

  • 確保後臺沒有不必要的程式
  • 給那些不重要並且是CPU密集型的應用調整優先順序,讓其優先順序相對較低一些
  • 更新CPU

記憶體方面

記憶體指標

  • Free memory: 空閒記憶體。在Linux中,核心會將沒有使用的記憶體中的大部分分配給檔案系統快取。所以,Free memory減去buffers以及cache佔用的記憶體的數量,才是系統中真正的空閒記憶體的數量。
  • swap usage: swap in/out衡量記憶體是否出現了瓶頸才更加正確。因為Linux核心如果發現記憶體中的一些page,長時間沒有被用到,就回將它放到swap中。而並不是說,只有當記憶體不足的時候,才會將page放到swap中。如果每秒有200-300次 swap in/out,那麼說明系統的記憶體可能是瓶頸。
  • Buffer and cache: 為檔案系統和block size分配的快取
  • slab: 核心使用的記憶體數量。需要注意的是,核心使用的page不能被page out到磁碟中
  • active versus inactive memory: inactive memory將會被kswapd daemon swap out到磁碟中。

free工具輸出解釋

0.png

消除記憶體瓶頸的方法

  • 調整page的大小
  • 調整處理active和inactive記憶體的方式
  • 降低page-out的速度
  • 限制伺服器上每個使用者能夠使用的記憶體的數量
  • 停止不需要的service
  • 增加記憶體

檔案系統方面

檔案系統指標

  • IOWait: CPU等待IO操作的時間
  • Average queue length: 未完成的IO請求的數量
  • Average wait: IO請求等待被處理的時間,毫秒級
  • Transfers per second: 每秒有多少IO操作被執行
  • Blocks read/write per seconds: 每秒中讀和寫block的數量。在2.6版本的核心中,以block大小為1KB衡量。不同的核心版本中,block大小不同,從512bytes到4KB不等
  • Kilobytes per second read/write: 每秒讀寫block device的資料量,用kilobytes來衡量

Linux中常見的檔案系統

  • Ext2
  • Ext3
  • ReiserFS
  • Journal File System(JFS)
  • XFS

其中,Ext3能夠保證資料的一致性。而且,還能夠通過配置journal mode,在資料的完整性和速度之間取得一個較好的平衡。

而JFS和XFS,主要用在需要支援大檔案的場景中。

消除檔案系統瓶頸的方法

  • 如果程式訪問磁碟的方式是順序訪問,那麼就換一個更好的磁碟控制器。如果是隨機訪問的,那麼就增加更多的磁碟控制器
  • 使用RAID。RAID的讀效能比較高,但是寫效能低一些。而且,優先使用基於硬體實現的RAID。
  • 給磁碟合理分割槽
  • 增加記憶體
  • 通過/proc/sys/vm/dirty_background_ratio來調整記憶體中有多少髒資料時,pdflush daemon才將這些資料寫入到磁碟
  • 通過ionice來分配IO操作的優先順序:
    • idle: 最低的優先順序,只有當沒有高優先順序的程序訪問磁碟時,才有資格訪問磁碟
    • Best-effort: 預設優先順序。從CPU優先順序中繼承
    • Real time: 最高的優先順序。程序總是能夠訪問磁碟。
  • 禁止access time updates
  • 選擇合適的檔案系統,以及合適的journal模式
  • 調整block size:
    如果你的伺服器,更多的是處理小的檔案,那麼將block size調小一點,可能會提高效能。但是如果處理大檔案更多,那麼調大一點可能會提高效能。但是這一項對效能提升並不大,所以,預設使用作業系統的4k的block size就好。

網路方面

網路指標

  • Packets received and sent
  • Bytes received and sent
  • Collisions per second: 網路中發生的碰撞數量。一個配置正確的網路中,應當很少發生碰撞
  • Packet dropped: 被丟棄的包的數量。包括被防火牆過濾掉的,以及由於buffer空間不夠而丟掉的
  • Overruns: buffer空間溢位的次數
  • Errors: 出錯的包的數量

資料傳輸的過程

  • 應用程式開啟一個Socket並將資料寫入到這個Socket的buffer中
  • 資料經過TCP/IP協議棧一層層地做一些處理,包裝。資料並不會層層複製,因為這樣效能不好。在核心中,只是修改buffer中的引用,將其傳遞給下一層
  • 資料通過網路到達另一臺主機,我們暫且稱它為主機B
  • 如果這個包的MAC地址就是主機B,那麼把它放到主機B的socket buffer中
  • 主機B給CPU發出一個硬中斷
  • 主機B再將資料通過TCP/IP協議棧的層層處理,傳遞給應用層

Linux中的協議棧,更注重的是可靠性和低延遲,而不是低開銷和高吞吐量。

由於每一個數據包都會引發一次中斷,所以,Linux中引入了一項叫做NAPI的技術。當第一個資料包到來時,還是跟之前一樣,會引發一次中斷。但是從此之後,網路介面會啟動輪訓模式,即,當有資料包到達時,不會發出中斷,而是直到buffer都滿了的時候,才發出一箇中斷。這樣就能減少中斷的次數。

TCP/IP傳輸視窗

TCP/IP傳輸視窗指的是,在收到ACK響應之前,最多能夠傳送的資料量。接收主機會通過TCP首部中的window size欄位告訴傳送主機傳輸視窗的大小。通過使用傳輸視窗,TCP能夠處理地效率更高一些,因為傳送主機不需要等待每一個數據包的ACK。

高速網路中,可以使用一種叫做視窗伸縮的技術,來增加傳輸視窗的大小。

Offload

如果你的網路介面卡支援offload功能,那麼你可以核心就可以將一部分工作轉移到網路介面卡,來減少CPU的工作量,進而提高效能。

常見的offload功能有:

  • Checksum Offload: 每一個數據包中,都會有一個校驗碼,用於驗證這個資料包是否在傳輸過程中出現了問題
  • TCP segmentation offload: 當要傳輸的資料量大於MTU的時候,就要對資料進行分段處理。

消除網路瓶頸的方法

  • 確保網絡卡的配置和路由器以及交換機的配置配套
  • 調整網路的拓撲結構
  • 使用更快的網絡卡
  • 在核心中調整關於網路的引數
    • MTU
    • 接收和傳送緩衝區的大小
    • 傳輸視窗
    • 通過調整net.ipv4.tcp_tw_reuse引數讓處於TIME_WAIT狀態的Socket對新連線可重用
    • 通過調整tcp_fin_timeout引數,讓處於FIN-WAIT-2狀態的Socket可以早一些關閉,進而節省記憶體
    • 通過調整tcp_keepalive_time引數,調整keepalive連線的關閉時間
    • 通過調整tcp_max_syn_backlog引數來調整最大能夠容納的處於半連線狀態的socket的數量
  • 關閉一些不需要的服務,以及埠號

Linux的工具

效能監控工具

  • top
  • vmstat
  • uptime, w
  • ps, pstree
  • free
  • iostat
  • sar
  • mpstat
  • numastat
  • pmap
  • netstat
  • iptraf
  • tcpdump, etheral
  • nmon
  • strace
  • proc file system
  • KDE System guard
  • Gnome System Monitor

分析工具

  • lmbench
  • iozone
  • netperf

/proc

/proc目錄中的內容,對於檢視系統狀態,應用程式的狀態至關重要。

/proc目錄中,又有這麼幾塊:

  • 名稱為數字的目錄:每一個這樣的目錄,裡面都包含了pid為這個數字的對應的程序的資訊,比如,程序使用的虛擬記憶體
  • acpi: ACPI中包含一些高階配置,以及電源管理等資訊。因為ACPI主要是用在筆記本,或者個人PC中,所以,在伺服器上,一般是禁用的
  • bus: 包含了一些和bus相關的資訊,比如PCI bus或者USB介面
  • irq: 包含和中斷相關的資訊。每個子目錄都對應一種中斷。我們可以通過直接修改對應子目錄的資訊,來將中斷繫結到一個CPU上
  • net: 包含和網路相關的統計資訊
  • scsi: 包含和SCSI相關的資訊
  • sys: 包含和核心相關的引數
  • tty: 包含和tty相關的資訊

從安裝Linux就開始調優

考慮下面幾個問題:

  • 安裝什麼版本的Linux?
    • 商業版的還是開源版本的?
    • 選擇商業版的哪一個版本?
  • 選擇正確的核心
    有這麼幾種核心。
    • standard: 應用在單處理器上
    • SMP: 支援SMP以及超執行緒技術。一些實現也支援NUMA.
    • Xen: 包括一個可以在Xen虛擬機器上執行的Linux版本
  • 如何給磁碟分割槽?
    儘可能使用交換分割槽而不是交換檔案。交換分割槽相對於交換檔案來講,沒有檔案系統上的開銷。
  • 使用什麼檔案系統?
  • 安裝時,儘可能少安裝包還是安裝全部的包?
  • 防火牆配置
  • SELinux
  • Runlevel選擇
    除非有特別需求,否則伺服器上都是使用runlevel 3.



作者:AlstonWilliams
連結:https://www.jianshu.com/p/1dfcd9e925a6
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。