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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。