Red Hat Enterprise Linux在IBM xSeries服務器上的調優

一.理解Linux的性能
我們可以在文章的開始就列出一個列表,列出可能影響Linux操作系統性能的一些調優參數,但這樣做其實並沒有什麼價值。因爲性能調優是一個非常困難的任務,它要求對硬件、操作系統、和應用都有着相當深入的瞭解。如果性能調優非常簡單的話,那些我們要列出的調優參數早就寫入硬件的微碼或者操作系統中了,我們就沒有必要再繼續讀這篇文章了。正如下圖所示,服務器的性能受到很多因素的影響。
當面對一個使用單獨IDE硬盤的有20000用戶的數據庫服務器時,即使我們使用數週時間去調整I/O子系統也是徒勞無功的,通常一個新的驅動或者應用程序的一個更新卻可以使這個服務器的性能得到明顯的提升。正如我們前面提到的,不要忘記系統的性能是受多方面因素影響的。理解操作系統管理系統資源的方法將幫助我們在面對問題時更好的判斷應該對哪個子系統進行調整。

下面的部分對Linux操作系統的架構進行了簡單的介紹,對Linux內核的完整的分析超出了我們這本紅皮書的內容,感興趣的讀者可以尋找相關文檔做更深入的研究。本書對Linux性能的調整主要針對Red Hat發行版本。
1.Linux的CPU調度

任何計算機的基本功能都十分簡單,那就是計算。爲了實現計算的功能就必須有一個方法去管理計算資源、處理器和計算任務(也被叫做線程或者進程)。非常感謝Ingo Molnar,他爲Linux內核帶來了O(1)CPU調度器,區別於舊有的O(n)調度器,新的調度器是動態的,可以支持負載均衡,並以恆定的速度進行操作。
新調度器的可擴展性非常好,無論進程數量或者處理器數量,並且調度器本身的系統開銷更少。新調取器的算法使用兩個優先級隊列。
  • 活動運行隊列
  • 過期運行隊列
調度器的一個重要目標是根據優先級權限有效地爲進程分配CPU 時間片,當分配完成後它被列在CPU的運行隊列中,除了 CPU 的運行隊列之外,還有一個過期運行隊列。當活動運行隊列中的一個任務用光自己的時間片之後,它就被移動到過期運行隊列中。在移動過程中,會對其時間片重新進行計算。如果活動運行隊列中已經沒有某個給定優先級的任務了,那麼指向活動運行隊列和過期運行隊列的指針就會交換,這樣就可以讓過期優先級列表變成活動優先級的列表。通常交互式進程(相對與實時進程而言)都有一個較高的優先級,它佔有更長的時間片,比低優先級的進程獲得更多的計算時間,但通過調度器自身的調整並不會使低優先級的進程完全被餓死。新調度器的優勢是顯著的改變Linux內核的可擴展性,使新內核可以更好的處理一些有大量進程、大量處理器組成的企業級應用。新的O(1)調度器包含仔2.6內核中,但是也向下兼容2.4內核。
新調度器另外一個重要的優勢是體現在對NUMA(non-uniform memory architecture)和SMP(symmetric multithreading processors)的支持上,例如INTEL@的超線程技術。

改進的NUMA支持保證了負載均衡不會發生在CECs或者NUMA節點之間,除非發生一個節點的超出負載限度。Linux的CPU調度器沒有使用大部分UNIX和Windows操作系統使用的進程-線程模式,它只使用了線程。在Linux中一個進程表示爲一組線程,可以用線程組ID或者TDGID代替標準UNIX中的進程ID或者PID。然而大多數Linux命令例如ps和top都使用PIDs表達,因此在下面的文章中我們會經常使用進程和線程組。
2.Linux的內存架構

今天我們面對選擇32位操作系統還是64位操作系統的情況。對企業級用戶它們之間最大的區別是64位操作系統可以支持大於4GB的內存尋址。從性能角度來講,我們需要了解32位和64位操作系統都是如何進行物理內存和虛擬內存的映射的。

在下面圖示中我們可以看到64位和32位Linux內核在尋址上有着顯著的不同。探究物理內存到虛擬內存的映射超出了本文研究的範圍,因此這裏我們只是着重研究一下Linux內存架構的特點。

在32位架構中,比如IA-32,Linux內核可以直接尋址的範圍只有物理內存的第一個GB(如果去掉保留部分還剩下896MB),訪問內存必須被映射到這小於1GB的所謂ZONE_NORMAL空間中,這個操作是由應用程序完成的。但是分配在ZONE_HIGHMEM中的內存頁將導致性能的降低。

在另一方面,64位架構比如x86-64(也稱作EM64T或者AMD64)。ZONE_NORMAL空間將擴展到64GB或者128GB(實際上可以更多,但是這個數值受到操作系統本身支持內存容量的限制)。正如我們看到的,使用64位操作系統我們排除了因ZONE_HIGHMEM部分內存對性能的影響的情況。
 
3.虛擬內存管理

因爲操作系統將內存都映射爲虛擬內存,所以操作系統的物理內存結構對用戶和應用來說通常都是不可見的。如果想要理解Linux系統內存的調優,我們必須瞭解Linux的虛擬內存機制。應用程序並不分配物理內存,而是向Linux內核請求一部分映射爲虛擬內存的內存空間。如下圖所示虛擬內存並不一定是映射物理內存中的空間,如果應用程序有一個大容量的請求,也可能會被映射到在磁盤子系統中的swap空間中。

另外要提到的是,通常應用程序不直接將數據寫到磁盤子系統中,而是寫入緩存和緩衝區中。Bdflush守護進程將定時將緩存或者緩衝區中的數據寫到硬盤上。

Linux內核處理數據寫入磁盤子系統和管理磁盤緩存是緊密聯繫在一起的。相對於其他的操作系統都是在內存中分配指定的一部分作爲磁盤緩存,Linux處理內存更加有效,默認情況下虛擬內存管理器分配所有可用內存空間作爲磁盤緩存,這就是爲什麼有時我們觀察一個配置有數G內存的Linux系統可用內存只有20MB的原因。

同時Linux使用swap空間的機制也是相當高效率的,如下圖所示虛擬內存空間是由物理內存和磁盤子系統中的swap空間共同組成的。如果虛擬內存管理器發現一個已經分配完成的內存分頁已經長時間沒有被調用,它將把這部分內存分頁移到swap空間中。經常我們會發現一些守護進程,比如getty,會隨系統啓動但是卻很少會被應用到。這時爲了釋放昂貴的主內存資源,系統會將這部分內存分頁移動到swap空間中。上述就是Linux使用swap空間的機制,當swap分區使用超過50%時,並不意味着物理內存的使用已經達到瓶頸了,swap空間只是Linux內核更好的使用系統資源的一種方法。

4.模塊化的I/O調度器
就象我們知道的Linux2.6內核爲我們帶來了很多新的特性,這其中就包括了新的I/O調度機制。舊的2.4內核使用一個單一的I/O調度器,2.6內核爲我們提供了四個可選擇的I/O調度器。因爲Linux系統應用在很廣闊的範圍裏,不同的應用對I/O設備和負載的要求都不相同,例如一個筆記本電腦和一個10000用戶的數據庫服務器對I/O的要求肯定有着很大的區別。

(1).Anticipatory
anticipatory I/O調度器創建假設一個塊設備只有一個物理的查找磁頭(例如一個單獨的SATA硬盤),正如anticipatory調度器名字一樣,anticipatory調度器使用“anticipatory”的算法寫入硬盤一個比較大的數據流代替寫入多個隨機的小的數據流,這樣有可能導致寫I/O操作的一些延時。這個調度器適用於通常的一些應用,比如大部分的個人電腦。

(2).Complete Fair Queuing (CFQ)
Complete Fair Queuing(CFQ)調度器是Red Hat Enterprise Linux使用的標準算法。CFQ調度器使用QoS策略爲系統內的所有任務分配相同的帶寬。CFQ調度器適用於有大量計算進程的多用戶系統。它試圖避免進程被餓死和實現了比較低的延遲。

(3).Deadline
deadline調度器是使用deadline算法的輪詢的調度器,提供對I/O子系統接近實時的操作,deadline調度器提供了很小的延遲和維持一個很好的磁盤吞吐量。如果使用deadline算法請確保進程資源分配不會出現問題。

(4).NOOP
NOOP調度器是一個簡化的調度程序它只作最基本的合併與排序。與桌面系統的關係不是很大,主要用在一些特殊的軟件與硬件環境下,這些軟件與硬件一般都擁有自己的調度機制對內核支持的要求很小,這很適合一些嵌入式系統環境。作爲桌面用戶我們一般不會選擇它。
5.網絡子系統

新的網絡中斷緩和(NAPI)對網絡子系統帶來了改變,提高了大流量網絡的性能。Linux內核在處理網絡堆棧時,相比降低系統佔用率和高吞吐量更關注可靠性和低延遲。所以在某些情況下,Linux建立一個防火牆或者文件、打印、數據庫等企業級應用的性能可能會低於相同配置的Windows服務器。

在傳統的處理網絡封包的方式中,如下圖藍色箭頭所描述的,一個以太網封包到達網卡接口後,如果MAC地址相符合會被送到網卡的緩衝區中。網卡然後將封包移到操作系統內核的網絡緩衝區中並且對CPU發出一個硬中斷,CPU會處理這個封包到相應的網絡堆棧中,可能是一個TCP端口或者Apache應用中。

這是一個處理網絡封包的簡單的流程,但從中我們可以看到這個處理方式的缺點。正如我們看到的,每次適合網絡封包到達網絡接口都將對CPU發出一個硬中斷信號,中斷CPU正在處理的其他任務,導致切換動作和對CPU緩存的操作。你可能認爲當只有少量的網絡封包到達網卡的情況下這並不是個問題,但是千兆網絡和現代的應用將帶來每秒鐘成千上萬的網絡數據,這就有可能對性能造成不良的影響。

正是因爲這個情況,NAPI在處理網絡通訊的時候引入了計數機制。對第一個封包,NAPI以傳統的方式進行處理,但是對後面的封包,網卡引入了POLL的輪詢機制:如果一個封包在網卡DMA環的緩存中,就不再爲這個封包申請新的中斷,直到最後一個封包被處理或者緩衝區被耗盡。這樣就有效的減少了因爲過多的中斷CPU對系統性能的影響。同時,NAPI通過創建可以被多處理器執行的軟中斷改善了系統的可擴展性。NAPI將爲大量的企業級多處理器平臺帶來幫助,它要求一個啓用NAPI的驅動程序。在今天很多驅動程序默認沒有啓用NAPI,這就爲我們調優網絡子系統的性能提供了更廣闊的空間。
 
6.Linux文件系統

Linux作爲一個開源操作系統的優勢之一就是爲用戶提供了多種操作系統的支持。現代Linux內核幾乎可以支持所有計算機系統常用的文件系統,從基本的FAT到高性能的文件系統例如JFS。因爲Red Hat Enterprise Linux主要支持兩種文件系統(ext2和ext3),我們將主要介紹它們的特點,對其他Linux文件系統我們僅做簡要介紹。

(1)ext2
ext2文件系統是ext3文件系統的前身。是一個快速、簡便的文件系統,它與目前大部分文件系統的顯著不同就是ext2不支持日誌。

(2)ext3,Red Hat默認的文件系統
自從Red Hat 7.2開始,安裝默認的文件系統就是ext3。Ext3是應用廣泛的ext2文件系統的更新版本,它加入了對日誌的支持。下面列舉了這個文件系統的一些特性。
  • 可用性:ext3可以保證數據寫入磁盤的一致性,萬一出現了非正常的關機(電源的失效或者系統的崩潰),服務器不需要花費時間去校驗數據的一致性,因此極大的減少了系統恢復的時間。
  • 數據完整性:加入特殊的日誌功能,所有數據,包括文件數據和元數據都是有日誌記錄的。
  • 速度:通過data=writeback參數,你可以根據應用的需要來調整數據的寫入速度。
  • 靈活性:從ext2轉換到ext3文件系統是非常簡單的並且不需要重新格式化硬盤。通過執行tune2fs命令和編輯/etc/fstab文件,你可以非常容易的將ext2文件系統更新到ext3文件系統。Ext3文件系統也可以禁用日誌後作爲ext2使用。利用一些第三方的工具軟件可以更靈活的使用ext3文件系統,比如PartitionMagic可以編輯ext3分區。
(3)ReiserFS
ReiserFS是一個快速的日誌文件系統,它優化了磁盤空間的使用、加快了故障恢復速度。今天ReiserFS是SUSE Linux默認的文件系統。

(4)JFS
JFS是一個完全64位的文件系統,它可以支持非常大的文件和分區。JFS是由IBM爲AIX系統開發的,現在在GPL license下以及可以使用了。JFS對大容量的分區和文件,尤其是HPC和數據庫應用來說是一種理想的操作系統。如果你想了解更多關於JFS的信息,請訪問下面鏈接
[url]http://jfs.sourceforge.net[/url]

(5)XFS
XFS是SGI爲IRIX系統開發的高性能的日誌文件系統。它的特點和應用都和JFS相當接近。

7.Proc文件系統
proc文件系統不是一個實時文件系統,但是它的作用卻非常大。它提供了一個運行中的內核的接口,並不存儲實際的數據。Proc文件系統使系統管理員可以監控和調整內核運行狀態。下圖描述了一個proc文件系統的示例,大部分Linux性能調優工具都需要藉助proc文件系統的信息來進行工作。
在proc文件系統中,我們可以看到分別記錄不同信息的多個子目錄,但是proc目錄下的大部分文件可讀性都不是很強,建議最好使用可讀性更強的工具例如vmstat等來查看proc中記錄的信息。請牢記proc目錄的相應目錄結構。
  • 在/proc目錄下的文件
    proc根目錄下保存着一些記錄了系統信息的文件,這些文件你可以通過vmstat和cpuinfo等工具來讀取。

  • 數字1到X
    各個以數字爲名稱的文件夾,代表的是運行進程的PID。例如,目錄1記錄了init進程的一些統計信息。

  • acpiapci是一個現代桌面和筆記本電腦的電源配置和管理接口,因爲apci主要是一個個人電腦的技術,所以在一些服務器系統上經常被禁用。可以訪問下面鏈接獲得更多acpi的相關信息
    [url]http://www.apci.info[/url]

  • bus
    這個子目錄記錄了系統的總線子系統的信息,例如pci總線或者usb接口。

  • irq
    irq子目錄下記錄了系統的中斷信息。

  • net
    net子目錄記錄了一些關於你的網卡的重要信息,比如接收的多點廣播封包或者每個網卡的路由。

  • scsi
    scsi子目錄包含了關於系統的scsi子系統的信息,例如連接的設備或者驅動的版本。ips子目錄是記錄關於IBM ServerRAID陣列卡信息的。

  • sys
    sys目錄下包含了一些可以調整的內核參數。

  • tty
    tty子目錄包含了系統虛擬終端的信息。
8.理解Linux調優參數

在我們介紹Linux系統的各種調優參數和性能監測工具之前,需要先討論一些關於性能調優的參數。因爲Linux是一個開源操作系統,所以又大量可用的性能監測工具。對這些工具的選擇取決於你的個人喜好和對數據細節的要求。所有的性能監測工具都是按照同樣的規則來工作的,所以無論你使用哪種監測工具都需要理解這些參數。下面列出了一些重要的參數,有效的理解它們是很有用處的。
(1)處理器參數
  • CPU utilization
    這是一個很簡單的參數,它直觀的描述了每個CPU的利用率。在xSeries架構中,如果CPU的利用率長時間的超過80%,就可能是出現了處理器的瓶頸。

  • Runable processes
    這個值描述了正在準備被執行的進程,在一個持續時間裏這個值不應該超過物理CPU數量的10倍,否則CPU方面就可能存在瓶頸。

  • Blocked
    描述了那些因爲等待I/O操作結束而不能被執行的進程,Blocked可能指出你正面臨I/O瓶頸。

  • User time
    描述了處理用戶進程的百分比,包括nice time。如果User time的值很高,說明系統性能用在處理實際的工作。

  • System time
    描述了CPU花費在處理內核操作包括IRQ和軟件中斷上面的百分比。如果system time很高說明系統可能存在網絡或者驅動堆棧方面的瓶頸。一個系統通常只花費很少的時間去處理內核的操作。

  • Idle time
    描述了CPU空閒的百分比。

  • Nice time
    描述了CPU花費在處理re-nicing進程的百分比。

  • Context switch
    系統中線程之間進行交換的數量。

  • Waiting
    CPU花費在等待I/O操作上的總時間,與blocked相似,一個系統不應該花費太多的時間在等待I/O操作上,否則你應該進一步檢測I/O子系統是否存在瓶頸。

  • Interrupts
    Interrupts值包括硬Interrupts和軟Interrupts,硬Interrupts會對系統性能帶來更多的不利影響。高的Interrupts值指出系統可能存在一個軟件的瓶頸,可能是內核或者驅動程序。注意Interrupts值中包括CPU時鐘導致的中斷(現代的xServer系統每秒1000個Interrupts值)。
(2)內存參數
  • Free memory
    相比其他操作系統,Linux空閒內存的值不應該做爲一個性能參考的重要指標,因爲就像我們之前提到過的,Linux內核會分配大量沒有被使用的內存作爲文件系統的緩存,所以這個值通常都比較小。

  • Swap usage
    這個值描述了已經被使用的swap空間。Swap usage只表示了Linux管理內存的有效性。對識別內存瓶頸來說,Swap In/Out纔是一個比較又意義的依據,如果Swap In/Out的值長期保持在每秒200到300個頁面通常就表示系統可能存在內存的瓶頸。

  • Buffer and cache
    這個值描述了爲文件系統和塊設備分配的緩存。注意在Red Hat Enterprise Linux 3和更早一些的版本中,大部分空閒內存會被分配作爲緩存使用。在Red Hat Enterprise Linux 4以後的版本中,你可以通過修改/proc/sys/vm中的page_cache_tuning來調整空閒內存中作爲緩存的數量。

  • Slabs
    描述了內核使用的內存空間,注意內核的頁面是不能被交換到磁盤上的。

  • Active versus inactive memory
    提供了關於系統內存的active內存信息,Inactive內存是被kswapd守護進程交換到磁盤上的空間。
(3)網絡參數
  • Packets received and sent
    這個參數表示了一個指定網卡接收和發送的數據包的數量。

  • Bytes received and sent
    這個參數表示了一個指定網卡接收和發送的數據包的字節數。

  • Collisions per second
    這個值提供了發生在指定網卡上的網絡衝突的數量。持續的出現這個值代表在網絡架構上出現了瓶頸,而不是在服務器端出現的問題。在正常配置的網絡中衝突是非常少見的,除非用戶的網絡環境都是由hub組成。

  • Packets dropped
    這個值表示了被內核丟掉的數據包數量,可能是因爲防火牆或者是網絡緩存的缺乏。

  • Overruns
    Overruns表達了超出網絡接口緩存的次數,這個參數應該和packets dropped值聯繫到一起來判斷是否存在在網絡緩存或者網絡隊列過長方面的瓶頸。

  • Errors
    這個值記錄了標誌爲失敗的幀的數量。這個可能由錯誤的網絡配置或者部分網線損壞導致,在銅口千兆以太網環境中部分網線的損害是影響性能的一個重要因素。
(4)塊設備參數
  • Iowait
    CPU等待I/O操作所花費的時間。這個值持續很高通常可能是I/O瓶頸所導致的。

  • Average queue length
    I/O請求的數量,通常一個磁盤隊列值爲2到3爲最佳情況,更高的值說明系統可能存在I/O瓶頸。

  • Average wait
    響應一個I/O操作的平均時間。Average wait包括實際I/O操作的時間和在I/O隊列裏等待的時間。

  • Transfers per second
    描述每秒執行多少次I/O操作(包括讀和寫)。Transfers per second的值與kBytes per second結合起來可以幫助你估計系統的平均傳輸塊大小,這個傳輸塊大小通常和磁盤子系統的條帶化大小相符合可以獲得最好的性能。

  • Blocks read/write per second
    這個值表達了每秒讀寫的blocks數量,在2.6內核中blocks是1024bytes,在早些的內核版本中blocks可以是不同的大小,從512bytes到4kb。

  • Kilobytes per second read/write
    按照kb爲單位表示讀寫塊設備的實際數據的數量。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章